Commit ebee9ca2 authored by Umang Jain's avatar Umang Jain Committed by Greg Kroah-Hartman
Browse files

Revert "staging: vc04_services: vchiq_core: Stop kthreads on shutdown"

This reverts commit d9c60bad.

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: default avatarUmang Jain <umang.jain@ideasonboard.com>
Reviewed-by: default avatarStefan Wahren <wahrenst@gmx.net>
Link: https://lore.kernel.org/r/20240403052100.2794-1-umang.jain@ideasonboard.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 883295e9
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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
+2 −6
Original line number Diff line number Diff line
@@ -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)) {
+3 −7
Original line number Diff line number Diff line
@@ -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