RE: [PATCH] media: amphion: Fix error handling in vpu_driver_init()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>From: Yuan Can <yuancan@xxxxxxxxxx>
>Sent: 2022年11月11日 14:09
>To: Ming Qian <ming.qian@xxxxxxx>; shijie.qin@xxxxxxx; Eagle Zhou
><eagle.zhou@xxxxxxx>; mchehab@xxxxxxxxxx; hverkuil-cisco@xxxxxxxxx;
>linux-media@xxxxxxxxxxxxxxx
>Cc: yuancan@xxxxxxxxxx
>Subject: [PATCH] media: amphion: Fix error handling in vpu_driver_init()
>
>A problem about modprobe amphion-vpu failed is triggered with the
>following log given:
>
> [ 2208.634841] Error: Driver 'amphion-vpu' is already registered, aborting...
> modprobe: ERROR: could not insert 'amphion_vpu': Device or resource busy
>
>The reason is that vpu_driver_init() returns vpu_core_driver_init() directly
>without checking its return value, if vpu_core_driver_init() failed, it returns
>without unregister amphion_vpu_driver, resulting the amphion-vpu can never
>be installed later.
>A simple call graph is shown as below:
>
> vpu_driver_init()
>   platform_driver_register() # register amphion_vpu_driver
>   vpu_core_driver_init()
>     platform_driver_register()
>       driver_register()
>         bus_add_driver()
>           dev = kzalloc(...) # OOM happened
>   # return without unregister amphion_vpu_driver
>
>Fix by unregister amphion_vpu_driver when vpu_core_driver_init() returns
>error.
>
>Fixes: b50a64fc54af ("media: amphion: add amphion vpu device driver")
>Signed-off-by: Yuan Can <yuancan@xxxxxxxxxx>

Reviewed-by: ming_qian <ming.qian@xxxxxxx>

>---
> drivers/media/platform/amphion/vpu_drv.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
>diff --git a/drivers/media/platform/amphion/vpu_drv.c
>b/drivers/media/platform/amphion/vpu_drv.c
>index 9d5a5075343d..f01ce49d27e8 100644
>--- a/drivers/media/platform/amphion/vpu_drv.c
>+++ b/drivers/media/platform/amphion/vpu_drv.c
>@@ -245,7 +245,11 @@ static int __init vpu_driver_init(void)
> 	if (ret)
> 		return ret;
>
>-	return vpu_core_driver_init();
>+	ret = vpu_core_driver_init();
>+	if (ret)
>+		platform_driver_unregister(&amphion_vpu_driver);
>+
>+	return ret;
> }
>
> static void __exit vpu_driver_exit(void)
>--
>2.17.1





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux