We return immediately from i915_driver_register() if drm_dev_register() fails, skipping remaining registration steps. However, the _unregister() counterpart called at device remove knows nothing about that skip and executes reverts for all those steps. For that to work correctly, those revert functions must be resistant to being called even on uninitialized objects, or we must not skip their initialization. If registration of a GT sysfs, expected to be performed on each GT register, is skipped then its unregister counterpart, unconditionally called on each GT unregister when unregistering the driver, fails and emits a warning that taints the kernel: <3> [525.823143] i915 0000:00:02.0: [drm] *ERROR* Failed to register driver for userspace access! ... <4> [525.947666] ------------[ cut here ]------------ <4> [525.947669] kobject: '(null)' (ffff88814f62a218): is not initialized, yet kobject_put() is being called. <4> [525.947707] WARNING: CPU: 6 PID: 3440 at lib/kobject.c:734 kobject_put+0xe4/0x200 ... <4> [525.947875] RIP: 0010:kobject_put+0xe4/0x200 ... <4> [525.947909] Call Trace: <4> [525.947911] <TASK> ... <4> [525.947963] intel_gt_sysfs_unregister+0x25/0x40 [i915] <4> [525.948133] intel_gt_driver_unregister+0x14/0x80 [i915] <4> [525.948291] i915_driver_remove+0x6c/0x140 [i915] <4> [525.948411] i915_pci_remove+0x1e/0x40 [i915] Since restoring symmetry by registering GTs even after a failure is not possible due to missing dependencies, teach the unregister counterpart to handle never registered GT sysfs cases gently. Link: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/9820 Link: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10131 Link: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/10887 Link: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12817 Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik@xxxxxxxxxxxxxxx> --- drivers/gpu/drm/i915/gt/intel_gt_sysfs.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/gpu/drm/i915/gt/intel_gt_sysfs.c b/drivers/gpu/drm/i915/gt/intel_gt_sysfs.c index 33cba406b5698..b3d1b1240939d 100644 --- a/drivers/gpu/drm/i915/gt/intel_gt_sysfs.c +++ b/drivers/gpu/drm/i915/gt/intel_gt_sysfs.c @@ -111,6 +111,9 @@ void intel_gt_sysfs_register(struct intel_gt *gt) void intel_gt_sysfs_unregister(struct intel_gt *gt) { + if (!gt->sysfs_defaults) + return; + kobject_put(gt->sysfs_defaults); kobject_put(>->sysfs_gt); } -- 2.47.1