Skip to content

Commit cfb320d

Browse files
lategoodbyegregkh
authored andcommitted
staging: vchiq_arm: Stop kthreads if vchiq cdev register fails
In case the vchiq character device cannot be registered during probe, all kthreads needs to be stopped to avoid resource leaks. Fixes: 863a756 ("staging: vc04_services: vchiq_core: Stop kthreads on vchiq module unload") Signed-off-by: Stefan Wahren <wahrenst@gmx.net> Link: https://lore.kernel.org/r/20250309125014.37166-4-wahrenst@gmx.net Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 3db89bc commit cfb320d

File tree

1 file changed

+16
-9
lines changed
  • drivers/staging/vc04_services/interface/vchiq_arm

1 file changed

+16
-9
lines changed

drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,20 @@ static struct vchiq_arm_state *vchiq_platform_get_arm_state(struct vchiq_state *
308308
return (struct vchiq_arm_state *)state->platform_state;
309309
}
310310

311+
static void
312+
vchiq_platform_uninit(struct vchiq_drv_mgmt *mgmt)
313+
{
314+
struct vchiq_arm_state *arm_state;
315+
316+
kthread_stop(mgmt->state.sync_thread);
317+
kthread_stop(mgmt->state.recycle_thread);
318+
kthread_stop(mgmt->state.slot_handler_thread);
319+
320+
arm_state = vchiq_platform_get_arm_state(&mgmt->state);
321+
if (!IS_ERR_OR_NULL(arm_state->ka_thread))
322+
kthread_stop(arm_state->ka_thread);
323+
}
324+
311325
void vchiq_dump_platform_state(struct seq_file *f)
312326
{
313327
seq_puts(f, " Platform: 2835 (VC master)\n");
@@ -1396,6 +1410,7 @@ static int vchiq_probe(struct platform_device *pdev)
13961410
ret = vchiq_register_chrdev(&pdev->dev);
13971411
if (ret) {
13981412
dev_err(&pdev->dev, "arm: Failed to initialize vchiq cdev\n");
1413+
vchiq_platform_uninit(mgmt);
13991414
return ret;
14001415
}
14011416

@@ -1410,20 +1425,12 @@ static int vchiq_probe(struct platform_device *pdev)
14101425
static void vchiq_remove(struct platform_device *pdev)
14111426
{
14121427
struct vchiq_drv_mgmt *mgmt = dev_get_drvdata(&pdev->dev);
1413-
struct vchiq_arm_state *arm_state;
14141428

14151429
vchiq_device_unregister(bcm2835_audio);
14161430
vchiq_device_unregister(bcm2835_camera);
14171431
vchiq_debugfs_deinit();
14181432
vchiq_deregister_chrdev();
1419-
1420-
kthread_stop(mgmt->state.sync_thread);
1421-
kthread_stop(mgmt->state.recycle_thread);
1422-
kthread_stop(mgmt->state.slot_handler_thread);
1423-
1424-
arm_state = vchiq_platform_get_arm_state(&mgmt->state);
1425-
if (!IS_ERR_OR_NULL(arm_state->ka_thread))
1426-
kthread_stop(arm_state->ka_thread);
1433+
vchiq_platform_uninit(mgmt);
14271434
}
14281435

14291436
static struct platform_driver vchiq_driver = {

0 commit comments

Comments
 (0)