Hi Yuan,
Le jeu. 3 nov. 2022 à 14:01:48 +0000, Yuan Can <yuancan@xxxxxxxxxx> a
écrit :
A problem about modprobe ingenic-drm failed is triggered with the
following
log given:
[ 303.561088] Error: Driver 'ingenic-ipu' is already registered,
aborting...
modprobe: ERROR: could not insert 'ingenic_drm': Device or resource
busy
The reason is that ingenic_drm_init() returns
platform_driver_register()
directly without checking its return value, if
platform_driver_register()
failed, it returns without unregistering ingenic_ipu_driver_ptr,
resulting
the ingenic-drm can never be installed later.
A simple call graph is shown as below:
ingenic_drm_init()
platform_driver_register() # ingenic_ipu_driver_ptr are registered
platform_driver_register()
driver_register()
bus_add_driver()
priv = kzalloc(...) # OOM happened
# return without unregister ingenic_ipu_driver_ptr
Fixing this problem by checking the return value of
platform_driver_register() and do platform_unregister_drivers() if
error happened.
Fixes: fc1acf317b01 ("drm/ingenic: Add support for the IPU")
Signed-off-by: Yuan Can <yuancan@xxxxxxxxxx>
Missing a Cc: to linux-stable, no?
Cheers,
-Paul
---
drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
index ab0515d2c420..4499a04f7c13 100644
--- a/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
+++ b/drivers/gpu/drm/ingenic/ingenic-drm-drv.c
@@ -1629,7 +1629,11 @@ static int ingenic_drm_init(void)
return err;
}
- return platform_driver_register(&ingenic_drm_driver);
+ err = platform_driver_register(&ingenic_drm_driver);
+ if (IS_ENABLED(CONFIG_DRM_INGENIC_IPU) && err)
+ platform_driver_unregister(ingenic_ipu_driver_ptr);
+
+ return err;
}
module_init(ingenic_drm_init);
--
2.17.1