** Description changed:

  [Impact]
  
  `ubuntu-drivers-common` supports a custom GPU configuration file,
  `custom_supported_gpus.json`, which OEM images use to pin a specific NVIDIA
  driver series for a given PCI device ID. Three defects make that mechanism
  unusable in practice:
  
  1. The pinned driver series is ignored when selecting a driver.**
     `system_driver_packages()` always flagged the highest-sorted NVIDIA
     alternative as `recommended`, so `ubuntu-drivers list`, `ubuntu-drivers
     install` and `ubuntu-drivers autoinstall` installed the newest driver in
     the archive instead of the series the OEM configuration pinned. On systems
     where the pinned series is the only validated/working driver for the GPU,
     users end up with a driver that was deliberately not selected for that
     platform (black screen, no acceleration, or regressions in suspend/resume).
  
  2. The configuration file is only looked up in `/etc`.**
     OEM enablement packages ship the file in `/usr/share/oem-*-meta/`, so the
     file shipped by the OEM meta package was never read at all. Only a manual
     `/etc/custom_supported_gpus.json` had any effect.
  
  3. runtimepm detection fails for `-open` branches.
     `_is_nv_allowing_runtimepm_supported()` compared the candidate driver
     version against `gpu["branch"].split(".")[0]` with an exact match. A branch
     recorded as `580-open` (variant suffix) never matched the `580` series, so
     runtime power management was not enabled on hardware that supports it,
     costing battery life on affected laptops. In addition the loop returned
     `False` on the first non-matching chip entry, so a later matching entry was
     never considered.
  
  A related packaging-preference bug is fixed at the same time: for gpgpu
  installs, an explicit flavour request without a variant suffix (e.g.
  `ubuntu-drivers install --gpgpu nvidia:595`) only matched the closed
  metapackage and ignored the `Prefer-Variant: Open` preference, so the `-open`
  metapackage was not installed even when the packaging asked for it.
  
  [Test Plan]
  
  The upstream commits add automated coverage; run the existing test
  suite:
  
      python3 -m pytest tests/test_ubuntu_drivers.py
  
  New/updated tests exercise the custom-config pinning, the
  `list --recommended` variant collapsing (`test_list_recommended_chroot`) and
  the runtimepm branch matching.
  
  Manual verification on a machine (or VM) with an NVIDIA GPU, or with the
  package's fake-sysfs test chroot:
  
  1. Install the version from -proposed.
  2. Create `/etc/custom_supported_gpus.json` pinning a driver series that is
     *not* the newest one available for the installed GPU, e.g.:
  
         {
           "chips": [
             {
               "devid": "0x<DEVID>",
               "branch": "580",
               "features": ["runtimepm"]
             }
           ]
         }
  
  3. `ubuntu-drivers list`
     * Expected: all applicable drivers are still listed, and
       `nvidia-driver-580` is the one flagged as recommended.
  4. `ubuntu-drivers list --recommended`
     * Expected: exactly one nvidia driver is listed (`nvidia-driver-580`), plus
       every other non-nvidia suggested package.
  5. `ubuntu-drivers install --dry-run` (or `autoinstall`)
     * Expected: `nvidia-driver-580` is selected, not the newest series.
  6. `ubuntu-drivers install nvidia:<other-series>`
     * Expected: the explicitly requested series is installed, i.e. the custom
       pin does not override an explicit request.
  7. Move the file to `/usr/share/oem-test-meta/custom_supported_gpus.json`,
     remove the one in `/etc`, and repeat steps 3-5.
     * Expected: identical results, proving the OEM lookup path works.
     * Before the fix, steps 3-7 all select the newest driver series.
  8. With a `-open` branch entry (e.g. `"branch": "580-open"`) and the matching
     `580` series driver installed, check that the runtimepm udev rule /
     `/proc/driver/nvidia/.../power` settings are applied.
     * Before the fix, runtimepm was not enabled for such entries.
  
  [Where problems could occur]
  
  * The change alters which NVIDIA driver is reported as *recommended* and
-   therefore which one `ubuntu-drivers install`/`autoinstall` picks, but only
+   therefore which one `ubuntu-drivers install` picks, but only
    on systems that actually ship or define `custom_supported_gpus.json`. A
    malformed or stale file could now pin an unsuitable or unavailable driver
    series where previously it was ignored; in that case the pinned package
    simply is not found in the archive and the previous selection logic applies.
  * The new `/usr/share/oem-*-meta/` lookup means files shipped by OEM meta
    packages take effect for the first time. On OEM images carrying an outdated
    file, the recommended driver may change compared to the previous release.
    `/etc/custom_supported_gpus.json` can be used to override it.
  * `ubuntu-drivers list --recommended` output is intentionally shorter for
    NVIDIA (one package instead of the whole alternatives group). Scripts or
    installers parsing that output and expecting multiple nvidia entries would
    see a different result; `ubuntu-drivers list` (without `--recommended`) is
    unchanged. The removal of the stray `break` also means the plain listing can
    now show more lines than before, where previously entries were silently
    dropped.
  * The relaxed runtimepm series matching could enable runtime power management
    on a few additional GPU/driver combinations that were previously (and
    incorrectly) skipped. The matching is still anchored on the numeric series,
    so it does not introduce substring false-positives.
  * The `gpgpu` `-open` substitution changes which metapackage is installed for
    explicit flavour requests on drivers marked `Prefer-Variant: Open`. If the
    `-open` metapackage were uninstallable, the install would fail where it
    previously succeeded with the closed variant.
  * Regressions would be confined to the `ubuntu-drivers` CLI and the DBus
    detection service; they would not affect already-installed drivers, and the
    package can be downgraded without side effects.
  
  [Other Info]

** Description changed:

  [Impact]
  
  `ubuntu-drivers-common` supports a custom GPU configuration file,
  `custom_supported_gpus.json`, which OEM images use to pin a specific NVIDIA
  driver series for a given PCI device ID. Three defects make that mechanism
  unusable in practice:
  
  1. The pinned driver series is ignored when selecting a driver.**
     `system_driver_packages()` always flagged the highest-sorted NVIDIA
     alternative as `recommended`, so `ubuntu-drivers list`, `ubuntu-drivers
     install` and `ubuntu-drivers autoinstall` installed the newest driver in
     the archive instead of the series the OEM configuration pinned. On systems
     where the pinned series is the only validated/working driver for the GPU,
     users end up with a driver that was deliberately not selected for that
     platform (black screen, no acceleration, or regressions in suspend/resume).
  
  2. The configuration file is only looked up in `/etc`.**
     OEM enablement packages ship the file in `/usr/share/oem-*-meta/`, so the
     file shipped by the OEM meta package was never read at all. Only a manual
     `/etc/custom_supported_gpus.json` had any effect.
  
  3. runtimepm detection fails for `-open` branches.
     `_is_nv_allowing_runtimepm_supported()` compared the candidate driver
     version against `gpu["branch"].split(".")[0]` with an exact match. A branch
     recorded as `580-open` (variant suffix) never matched the `580` series, so
     runtime power management was not enabled on hardware that supports it,
     costing battery life on affected laptops. In addition the loop returned
     `False` on the first non-matching chip entry, so a later matching entry was
     never considered.
  
- A related packaging-preference bug is fixed at the same time: for gpgpu
- installs, an explicit flavour request without a variant suffix (e.g.
- `ubuntu-drivers install --gpgpu nvidia:595`) only matched the closed
+ A related packaging-preference bug is fixed at the same time: an explicit 
flavour request without a variant suffix (e.g.
+ `ubuntu-drivers install nvidia:595`) only matched the closed
  metapackage and ignored the `Prefer-Variant: Open` preference, so the `-open`
  metapackage was not installed even when the packaging asked for it.
  
  [Test Plan]
  
  The upstream commits add automated coverage; run the existing test
  suite:
  
      python3 -m pytest tests/test_ubuntu_drivers.py
  
  New/updated tests exercise the custom-config pinning, the
  `list --recommended` variant collapsing (`test_list_recommended_chroot`) and
  the runtimepm branch matching.
  
  Manual verification on a machine (or VM) with an NVIDIA GPU, or with the
  package's fake-sysfs test chroot:
  
  1. Install the version from -proposed.
  2. Create `/etc/custom_supported_gpus.json` pinning a driver series that is
     *not* the newest one available for the installed GPU, e.g.:
  
         {
           "chips": [
             {
               "devid": "0x<DEVID>",
               "branch": "580",
               "features": ["runtimepm"]
             }
           ]
         }
  
  3. `ubuntu-drivers list`
     * Expected: all applicable drivers are still listed, and
       `nvidia-driver-580` is the one flagged as recommended.
  4. `ubuntu-drivers list --recommended`
     * Expected: exactly one nvidia driver is listed (`nvidia-driver-580`), plus
       every other non-nvidia suggested package.
  5. `ubuntu-drivers install --dry-run` (or `autoinstall`)
     * Expected: `nvidia-driver-580` is selected, not the newest series.
  6. `ubuntu-drivers install nvidia:<other-series>`
     * Expected: the explicitly requested series is installed, i.e. the custom
       pin does not override an explicit request.
  7. Move the file to `/usr/share/oem-test-meta/custom_supported_gpus.json`,
     remove the one in `/etc`, and repeat steps 3-5.
     * Expected: identical results, proving the OEM lookup path works.
     * Before the fix, steps 3-7 all select the newest driver series.
  8. With a `-open` branch entry (e.g. `"branch": "580-open"`) and the matching
     `580` series driver installed, check that the runtimepm udev rule /
     `/proc/driver/nvidia/.../power` settings are applied.
     * Before the fix, runtimepm was not enabled for such entries.
  
  [Where problems could occur]
  
  * The change alters which NVIDIA driver is reported as *recommended* and
    therefore which one `ubuntu-drivers install` picks, but only
    on systems that actually ship or define `custom_supported_gpus.json`. A
    malformed or stale file could now pin an unsuitable or unavailable driver
    series where previously it was ignored; in that case the pinned package
    simply is not found in the archive and the previous selection logic applies.
  * The new `/usr/share/oem-*-meta/` lookup means files shipped by OEM meta
    packages take effect for the first time. On OEM images carrying an outdated
    file, the recommended driver may change compared to the previous release.
    `/etc/custom_supported_gpus.json` can be used to override it.
  * `ubuntu-drivers list --recommended` output is intentionally shorter for
    NVIDIA (one package instead of the whole alternatives group). Scripts or
    installers parsing that output and expecting multiple nvidia entries would
    see a different result; `ubuntu-drivers list` (without `--recommended`) is
    unchanged. The removal of the stray `break` also means the plain listing can
    now show more lines than before, where previously entries were silently
    dropped.
  * The relaxed runtimepm series matching could enable runtime power management
    on a few additional GPU/driver combinations that were previously (and
    incorrectly) skipped. The matching is still anchored on the numeric series,
    so it does not introduce substring false-positives.
  * The `gpgpu` `-open` substitution changes which metapackage is installed for
    explicit flavour requests on drivers marked `Prefer-Variant: Open`. If the
    `-open` metapackage were uninstallable, the install would fail where it
    previously succeeded with the closed variant.
  * Regressions would be confined to the `ubuntu-drivers` CLI and the DBus
    detection service; they would not affect already-installed drivers, and the
    package can be downgraded without side effects.
  
  [Other Info]

** Description changed:

  [Impact]
  
  `ubuntu-drivers-common` supports a custom GPU configuration file,
  `custom_supported_gpus.json`, which OEM images use to pin a specific NVIDIA
  driver series for a given PCI device ID. Three defects make that mechanism
  unusable in practice:
  
  1. The pinned driver series is ignored when selecting a driver.**
     `system_driver_packages()` always flagged the highest-sorted NVIDIA
     alternative as `recommended`, so `ubuntu-drivers list`, `ubuntu-drivers
     install` and `ubuntu-drivers autoinstall` installed the newest driver in
     the archive instead of the series the OEM configuration pinned. On systems
     where the pinned series is the only validated/working driver for the GPU,
     users end up with a driver that was deliberately not selected for that
     platform (black screen, no acceleration, or regressions in suspend/resume).
  
  2. The configuration file is only looked up in `/etc`.**
     OEM enablement packages ship the file in `/usr/share/oem-*-meta/`, so the
     file shipped by the OEM meta package was never read at all. Only a manual
     `/etc/custom_supported_gpus.json` had any effect.
  
  3. runtimepm detection fails for `-open` branches.
     `_is_nv_allowing_runtimepm_supported()` compared the candidate driver
     version against `gpu["branch"].split(".")[0]` with an exact match. A branch
     recorded as `580-open` (variant suffix) never matched the `580` series, so
     runtime power management was not enabled on hardware that supports it,
     costing battery life on affected laptops. In addition the loop returned
     `False` on the first non-matching chip entry, so a later matching entry was
     never considered.
  
- A related packaging-preference bug is fixed at the same time: an explicit 
flavour request without a variant suffix (e.g.
- `ubuntu-drivers install nvidia:595`) only matched the closed
- metapackage and ignored the `Prefer-Variant: Open` preference, so the `-open`
- metapackage was not installed even when the packaging asked for it.
+ A related packaging-preference bug is fixed at the same time: an explicit
+ flavour request without a variant suffix (e.g. `ubuntu-drivers install
+ nvidia:595`) only matched the closed metapackage and ignored the
+ `Prefer-Variant: Open` preference, so the `-open` metapackage was
+ not installed even when the packaging asked for it.
  
  [Test Plan]
  
  The upstream commits add automated coverage; run the existing test
  suite:
  
      python3 -m pytest tests/test_ubuntu_drivers.py
  
  New/updated tests exercise the custom-config pinning, the
  `list --recommended` variant collapsing (`test_list_recommended_chroot`) and
  the runtimepm branch matching.
  
  Manual verification on a machine (or VM) with an NVIDIA GPU, or with the
  package's fake-sysfs test chroot:
  
  1. Install the version from -proposed.
  2. Create `/etc/custom_supported_gpus.json` pinning a driver series that is
     *not* the newest one available for the installed GPU, e.g.:
  
         {
           "chips": [
             {
               "devid": "0x<DEVID>",
               "branch": "580",
               "features": ["runtimepm"]
             }
           ]
         }
  
  3. `ubuntu-drivers list`
     * Expected: all applicable drivers are still listed, and
       `nvidia-driver-580` is the one flagged as recommended.
  4. `ubuntu-drivers list --recommended`
     * Expected: exactly one nvidia driver is listed (`nvidia-driver-580`), plus
       every other non-nvidia suggested package.
  5. `ubuntu-drivers install --dry-run` (or `autoinstall`)
     * Expected: `nvidia-driver-580` is selected, not the newest series.
  6. `ubuntu-drivers install nvidia:<other-series>`
     * Expected: the explicitly requested series is installed, i.e. the custom
       pin does not override an explicit request.
  7. Move the file to `/usr/share/oem-test-meta/custom_supported_gpus.json`,
     remove the one in `/etc`, and repeat steps 3-5.
     * Expected: identical results, proving the OEM lookup path works.
     * Before the fix, steps 3-7 all select the newest driver series.
  8. With a `-open` branch entry (e.g. `"branch": "580-open"`) and the matching
     `580` series driver installed, check that the runtimepm udev rule /
     `/proc/driver/nvidia/.../power` settings are applied.
     * Before the fix, runtimepm was not enabled for such entries.
  
  [Where problems could occur]
  
  * The change alters which NVIDIA driver is reported as *recommended* and
    therefore which one `ubuntu-drivers install` picks, but only
    on systems that actually ship or define `custom_supported_gpus.json`. A
    malformed or stale file could now pin an unsuitable or unavailable driver
    series where previously it was ignored; in that case the pinned package
    simply is not found in the archive and the previous selection logic applies.
  * The new `/usr/share/oem-*-meta/` lookup means files shipped by OEM meta
    packages take effect for the first time. On OEM images carrying an outdated
    file, the recommended driver may change compared to the previous release.
    `/etc/custom_supported_gpus.json` can be used to override it.
  * `ubuntu-drivers list --recommended` output is intentionally shorter for
    NVIDIA (one package instead of the whole alternatives group). Scripts or
    installers parsing that output and expecting multiple nvidia entries would
    see a different result; `ubuntu-drivers list` (without `--recommended`) is
    unchanged. The removal of the stray `break` also means the plain listing can
    now show more lines than before, where previously entries were silently
    dropped.
  * The relaxed runtimepm series matching could enable runtime power management
    on a few additional GPU/driver combinations that were previously (and
    incorrectly) skipped. The matching is still anchored on the numeric series,
    so it does not introduce substring false-positives.
  * The `gpgpu` `-open` substitution changes which metapackage is installed for
    explicit flavour requests on drivers marked `Prefer-Variant: Open`. If the
    `-open` metapackage were uninstallable, the install would fail where it
    previously succeeded with the closed variant.
  * Regressions would be confined to the `ubuntu-drivers` CLI and the DBus
    detection service; they would not affect already-installed drivers, and the
    package can be downgraded without side effects.
  
  [Other Info]

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2168955

Title:
  [SRU] honour custom_supported_gpus.json for nvidia driver installation

To manage notifications about this bug go to:
https://bugs.launchpad.net/oem-priority/+bug/2168955/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to