Message ID | 20221111060926.18508-1-yuancan@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | media: amphion: Fix error handling in vpu_driver_init() | expand |
>From: Yuan Can <yuancan@huawei.com> >Sent: 2022年11月11日 14:09 >To: Ming Qian <ming.qian@nxp.com>; shijie.qin@nxp.com; Eagle Zhou ><eagle.zhou@nxp.com>; mchehab@kernel.org; hverkuil-cisco@xs4all.nl; >linux-media@vger.kernel.org >Cc: yuancan@huawei.com >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@huawei.com> Reviewed-by: ming_qian <ming.qian@nxp.com> >--- > 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(&hion_vpu_driver); >+ >+ return ret; > } > > static void __exit vpu_driver_exit(void) >-- >2.17.1
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(&hion_vpu_driver); + + return ret; } static void __exit vpu_driver_exit(void)
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@huawei.com> --- drivers/media/platform/amphion/vpu_drv.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)