>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(&hion_vpu_driver); >+ >+ return ret; > } > > static void __exit vpu_driver_exit(void) >-- >2.17.1