Revert "staging: vc04_services: vchiq_core: Stop kthreads on shutdown"
authorUmang Jain <umang.jain@ideasonboard.com>
Wed, 3 Apr 2024 05:21:00 +0000 (10:51 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 9 Apr 2024 15:45:17 +0000 (17:45 +0200)
This reverts commit d9c60badccc183eb971e0941bb86f9475d4b9551.

It has been reported that stopping kthreads corrupts the VC04 firmware
and creates issues at boot time [1].

A fix-up version of this patch
bac670144384 ("staging: vc04_services: Stop kthreads on .remove") [2]
was also attempted but it also doesn't properly fix the TODO
(i.e. clean module unload) and similar errors were observed when
stopping these khthreads on RaspberryPi 3.

Hence, revert the entire patch for now since it is not very clear why
stopping the kthreads breaks the firmware.

[1]: https://lore.kernel.org/linux-staging/CAPY8ntBaz_RGr2sboQqbuUv+xZNfRct6-sckDLYPTig_HWyXEw@mail.gmail.com/t/#me90b9a9bc91599f18cd65ceb7eedd40e5fee0cdd

[2]: https://lore.kernel.org/linux-staging/171161507013.3072637.12125782507523919379@ping.linuxembedded.co.uk/T/#m1d3de7d2fa73b2447274858353bbd4a0c3a8ba14

Signed-off-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Stefan Wahren <wahrenst@gmx.net>
Link: https://lore.kernel.org/r/20240403052100.2794-1-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 57a2d6761f9b84e0ee463527d070db8d31db7695..05eb5140d0966d106e8c927da96c32ecbc599a9d 100644 (file)
@@ -16,6 +16,13 @@ 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 1d21f9cfbfe512963c27079f926ed5599e32aa0c..ad506016fc93ed047c722d40cd41dfd56d28681d 100644 (file)
@@ -726,9 +726,8 @@ void free_bulk_waiter(struct vchiq_instance *instance)
 
 int vchiq_shutdown(struct vchiq_instance *instance)
 {
-       struct vchiq_state *state = instance->state;
-       struct vchiq_arm_state *arm_state;
        int status = 0;
+       struct vchiq_state *state = instance->state;
 
        if (mutex_lock_killable(&state->mutex))
                return -EAGAIN;
@@ -740,9 +739,6 @@ int vchiq_shutdown(struct vchiq_instance *instance)
 
        dev_dbg(state->dev, "core: (%p): returning %d\n", instance, status);
 
-       arm_state = vchiq_platform_get_arm_state(state);
-       kthread_stop(arm_state->ka_thread);
-
        free_bulk_waiter(instance);
        kfree(instance);
 
@@ -1314,7 +1310,7 @@ vchiq_keepalive_thread_func(void *v)
                goto shutdown;
        }
 
-       while (!kthread_should_stop()) {
+       while (1) {
                long rc = 0, uc = 0;
 
                if (wait_for_completion_interruptible(&arm_state->ka_evt)) {
index 953ccd87f425a0f7c903d1d9dd887bba91fc2153..76c27778154aaf7372b4f6a53bbaf5237bb8ce40 100644 (file)
@@ -1936,7 +1936,7 @@ slot_handler_func(void *v)
 
        DEBUG_INITIALISE(local);
 
-       while (!kthread_should_stop()) {
+       while (1) {
                DEBUG_COUNT(SLOT_HANDLER_COUNT);
                DEBUG_TRACE(SLOT_HANDLER_LINE);
                remote_event_wait(&state->trigger_event, &local->trigger);
@@ -1978,7 +1978,7 @@ recycle_func(void *v)
        if (!found)
                return -ENOMEM;
 
-       while (!kthread_should_stop()) {
+       while (1) {
                remote_event_wait(&state->recycle_event, &local->recycle);
 
                process_free_queue(state, found, length);
@@ -1997,7 +1997,7 @@ sync_func(void *v)
                        state->remote->slot_sync);
        int svc_fourcc;
 
-       while (!kthread_should_stop()) {
+       while (1) {
                struct vchiq_service *service;
                int msgid, size;
                int type;
@@ -2844,10 +2844,6 @@ vchiq_shutdown_internal(struct vchiq_state *state, struct vchiq_instance *instan
                (void)vchiq_remove_service(instance, service->handle);
                vchiq_service_put(service);
        }
-
-       kthread_stop(state->sync_thread);
-       kthread_stop(state->recycle_thread);
-       kthread_stop(state->slot_handler_thread);
 }
 
 int