]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
staging: vc04_services: vchiq_core: Stop kthreads on vchiq module unload
authorUmang Jain <umang.jain@ideasonboard.com>
Wed, 3 Jul 2024 13:10:52 +0000 (18:40 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 10 Jul 2024 12:51:18 +0000 (14:51 +0200)
The various kthreads thread functions (slot_handler_func, sync_func,
recycle_func) in vchiq_core and vchiq_keepalive_thread_func in
vchiq_arm should be stopped when the module is unloaded.

Previous attempt were made to address this but later reverted [1]
due to VC04 firmware corruption. The issue around
wait_event_interruptible() handling on stopping a kthread has been
handled in the previous commit. Hence, it is now safe to stop kthreads
on module unload, without any firmware corruption.

This also completes the "Fix kernel module support" TODO item, hence
drop it from the list.

[1] commit ebee9ca2f59e ("Revert "staging: vc04_services: vchiq_core: Stop kthreads on shutdown"")

Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Tested-by: Stefan Wahren <wahrenst@gmx.net>
Link: https://lore.kernel.org/r/20240703131052.597443-3-umang.jain@ideasonboard.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vc04_services/interface/TODO
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_core.c

index 05f129c0c2545a03e7bdd34c7b99d6b1370f14ec..dfb1ee49633fe294bee2ca5f11b5add88d0200cc 100644 (file)
@@ -16,13 +16,6 @@ some of the ones we want:
   to manage these buffers as dmabufs so that we can zero-copy import
   camera images into vc4 for rendering/display.
 
-* Fix kernel module support
-
-Even the VPU firmware doesn't support a VCHI re-connect, the driver
-should properly handle a module unload. This also includes that all
-resources must be freed (kthreads, debugfs entries, ...) and global
-variables avoided.
-
 * Documentation
 
 A short top-down description of this driver's architecture (function of
index 9e6102c43e005c6bb1ca6cb25e972fcea3a93b36..c4d97dbf6ba8367d5c45b585b0263a9138594c64 100644 (file)
@@ -1315,7 +1315,7 @@ vchiq_keepalive_thread_func(void *v)
                goto shutdown;
        }
 
-       while (1) {
+       while (!kthread_should_stop()) {
                long rc = 0, uc = 0;
 
                if (wait_for_completion_interruptible(&arm_state->ka_evt)) {
@@ -1776,12 +1776,20 @@ error_exit:
 static void vchiq_remove(struct platform_device *pdev)
 {
        struct vchiq_drv_mgmt *mgmt = dev_get_drvdata(&pdev->dev);
+       struct vchiq_arm_state *arm_state;
 
        vchiq_device_unregister(bcm2835_audio);
        vchiq_device_unregister(bcm2835_camera);
        vchiq_debugfs_deinit();
        vchiq_deregister_chrdev();
 
+       kthread_stop(mgmt->state.sync_thread);
+       kthread_stop(mgmt->state.recycle_thread);
+       kthread_stop(mgmt->state.slot_handler_thread);
+
+       arm_state = vchiq_platform_get_arm_state(&mgmt->state);
+       kthread_stop(arm_state->ka_thread);
+
        kfree(mgmt);
 }
 
index dd70f2881ecaa623925f3cd0454c2663a54ec452..50af04b217f4b8a72063efce62276b7733e6a174 100644 (file)
@@ -1941,7 +1941,7 @@ slot_handler_func(void *v)
 
        DEBUG_INITIALISE(local);
 
-       while (1) {
+       while (!kthread_should_stop()) {
                DEBUG_COUNT(SLOT_HANDLER_COUNT);
                DEBUG_TRACE(SLOT_HANDLER_LINE);
                ret = remote_event_wait(&state->trigger_event, &local->trigger);
@@ -1986,7 +1986,7 @@ recycle_func(void *v)
        if (!found)
                return -ENOMEM;
 
-       while (1) {
+       while (!kthread_should_stop()) {
                ret = remote_event_wait(&state->recycle_event, &local->recycle);
                if (ret)
                        return ret;
@@ -2008,7 +2008,7 @@ sync_func(void *v)
        int svc_fourcc;
        int ret;
 
-       while (1) {
+       while (!kthread_should_stop()) {
                struct vchiq_service *service;
                int msgid, size;
                int type;