On Wed, 28 Jan 2026, Michał Grzelak <[email protected]> wrote: > i915_driver_probe() cannot currently handle error of intel_gvt_init() > because it is called from i915_driver_hw_probe(). Nevertheless, it's > error path is done in i915_driver_probe(). Fault of > i915_driver_hw_probe() thus causes list corruption, since > intel_gvt_driver_remove() was called twice. > > Move intel_gvt_init() up to i915_driver_probe(). Adjust error path of > i915_driver_hw_probe() so that intel_gvt_driver_remove() is called > always once. > > Signed-off-by: Michał Grzelak <[email protected]> > --- > drivers/gpu/drm/i915/i915_driver.c | 18 +++++++++--------- > 1 file changed, 9 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_driver.c > b/drivers/gpu/drm/i915/i915_driver.c > index 1e087dfe03d0..0f507b8ae2f1 100644 > --- a/drivers/gpu/drm/i915/i915_driver.c > +++ b/drivers/gpu/drm/i915/i915_driver.c > @@ -557,10 +557,6 @@ static int i915_driver_hw_probe(struct drm_i915_private > *dev_priv) > drm_dbg(&dev_priv->drm, "can't enable MSI"); > } > > - ret = intel_gvt_init(dev_priv); > - if (ret) > - goto err_msi; > - > intel_opregion_setup(display); > > ret = i915_pcode_init(dev_priv); > @@ -581,9 +577,6 @@ static int i915_driver_hw_probe(struct drm_i915_private > *dev_priv) > > err_opregion: > intel_opregion_cleanup(display); > -err_msi: > - if (pdev->msi_enabled) > - pci_disable_msi(pdev);
Why's this being moved? BR, Jani. > err_mem_regions: > intel_memory_regions_driver_release(dev_priv); > err_ggtt: > @@ -870,9 +863,13 @@ int i915_driver_probe(struct pci_dev *pdev, const struct > pci_device_id *ent) > if (ret < 0) > goto out_cleanup_mmio; > > + ret = intel_gvt_init(i915); > + if (ret) > + goto out_cleanup_hw; > + > ret = intel_display_driver_probe_noirq(display); > if (ret < 0) > - goto out_cleanup_hw; > + goto out_cleanup_gvt; > > ret = intel_irq_install(i915); > if (ret) > @@ -921,6 +918,10 @@ int i915_driver_probe(struct pci_dev *pdev, const struct > pci_device_id *ent) > intel_irq_uninstall(i915); > out_cleanup_modeset: > intel_display_driver_remove_nogem(display); > +out_cleanup_gvt: > + if (pdev->msi_enabled) > + pci_disable_msi(pdev); > + intel_gvt_driver_remove(i915); > out_cleanup_hw: > i915_driver_hw_remove(i915); > intel_memory_regions_driver_release(i915); > @@ -928,7 +929,6 @@ int i915_driver_probe(struct pci_dev *pdev, const struct > pci_device_id *ent) > i915_gem_drain_freed_objects(i915); > i915_ggtt_driver_late_release(i915); > out_cleanup_mmio: > - intel_gvt_driver_remove(i915); > i915_driver_mmio_release(i915); > out_runtime_pm_put: > enable_rpm_wakeref_asserts(&i915->runtime_pm); -- Jani Nikula, Intel
