Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bridge kernel #2105

Merged
merged 3 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion examples/sources/bridge.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,4 @@ kernel:
default: linux-generic
bridge: linux-generic-brg-22.04
bridge_reasons:
- nvidia
- drivers
7 changes: 6 additions & 1 deletion subiquity/models/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,12 @@ def __attrs_post_init__(self):


class BridgeKernelReason(enum.Enum):
dbungert marked this conversation as resolved.
Show resolved Hide resolved
NVIDIA = "nvidia"
# When bridge_reasons contains "drivers", some driver packages are known to
# be behind, so we should fall back to the bridge kernel.
DRIVERS = "drivers"
# When bridge_reasons contains "zfs", we should use the bridge kernel as
# the default kernel is not yet known to the kernel team to be sufficiently
# stable.
ZFS = "zfs"


Expand Down
7 changes: 5 additions & 2 deletions subiquity/server/controllers/kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,15 @@ def _confirmed(self):
self.app.hub.broadcast(InstallerChannels.BRIDGE_KERNEL_DECIDED)
self._maybe_set_bridge_kernel(BridgeKernelReason.ZFS, fs_model.uses_zfs())
if not self.app.base_model.source.search_drivers:
self._maybe_set_bridge_kernel(BridgeKernelReason.NVIDIA, False)
self._maybe_set_bridge_kernel(BridgeKernelReason.DRIVERS, False)

def _drivers_decided(self):
drivers_controller = self.app.controllers.Drivers
# while the term DRIVERS is used here, only some drivers are expected
# to trigger bridge kernel fallback, and only then if DRIVERS is listed
# as one of the bridge_reasons.
self._maybe_set_bridge_kernel(
BridgeKernelReason.NVIDIA,
BridgeKernelReason.DRIVERS,
drivers_controller.model.do_install
and any("nvidia" in driver for driver in drivers_controller.drivers),
dbungert marked this conversation as resolved.
Show resolved Hide resolved
)
Expand Down
6 changes: 4 additions & 2 deletions subiquity/server/controllers/source.py
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,10 @@ def start(self):
self.app.hub.subscribe(
(InstallerChannels.CONFIGURED, "locale"), self._set_locale
)
if self.model.catalog.version != 1:
raise Exception("unknown source catalog version")
if self.model.catalog.version not in (1, 2):
raise Exception(
f"unknown source catalog version {self.model.catalog.version}"
)

def _set_locale(self):
current = self.app.base_model.locale.selected_language
Expand Down
14 changes: 7 additions & 7 deletions subiquity/server/controllers/tests/test_kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,19 +42,19 @@ def n_booleans(*, n):


bridge_scenarios = []
for bridge_zfs, bridge_nvidia, has_zfs, has_nvidia in n_booleans(n=4):
for bridge_zfs, bridge_drivers, has_zfs, has_drivers in n_booleans(n=4):
# We consider scenarios for each reason being a reason to choose
# the kernel and actually discovered.
bridge_reasons = []
if bridge_zfs:
bridge_reasons.append(BridgeKernelReason.ZFS)
if bridge_nvidia:
bridge_reasons.append(BridgeKernelReason.NVIDIA)
if bridge_drivers:
bridge_reasons.append(BridgeKernelReason.DRIVERS)
detected_reasons = []
if has_zfs:
detected_reasons.append(BridgeKernelReason.ZFS)
if has_nvidia:
detected_reasons.append(BridgeKernelReason.NVIDIA)
if has_drivers:
detected_reasons.append(BridgeKernelReason.DRIVERS)
for search_drivers, do_install in n_booleans(n=2):
# Then we consider scenarios where the user chooses whether or
# not to search for drivers and whether or not to install the
Expand All @@ -64,7 +64,7 @@ def n_booleans(*, n):
use_bridge = False
if bridge_zfs and has_zfs:
use_bridge = True
if bridge_nvidia and has_nvidia and do_install:
if bridge_drivers and has_drivers and do_install:
use_bridge = True
bridge_scenarios.append(
(
Expand Down Expand Up @@ -174,7 +174,7 @@ async def test_bridge_options(self, scenario):

if not scenario.search_drivers:
drivers = []
elif BridgeKernelReason.NVIDIA in scenario.detected_reasons:
elif BridgeKernelReason.DRIVERS in scenario.detected_reasons:
drivers = ["something-else", "nvidia-driver"]
else:
drivers = ["something-else"]
Expand Down
Loading