aboutsummaryrefslogtreecommitdiffstats
diff options
authorChristian Brauner <brauner@kernel.org>2023-06-01 12:33:19 +0200
committerChristian Brauner <brauner@kernel.org>2023-06-01 12:33:19 +0200
commitb20084b6bc90012a8ccce72ef1c0050d5fd42aa8 (patch)
tree06ba2d7ac2e593e371bd1e0b3985e056bdf3e6d2
parent93f0f52f5f1f80942ea6c32eedd1a645ccdceb4f (diff)
downloadlinux-kernel.user_worker.tar.gz
Revert "vhost_task: Allow vhost layer to use copy_process"kernel/v6.4-rc4/vhostkernel.user_worker
This reverts commit e297cd54b3f81d652456ae6cb93941fc6b5c6683. Switching vhost workers to user workers broke existing workflows because vhost workers started showing up in ps output breaking various scripts. The reason is that vhost user workers are currently spawned as separate processes and not as threads. Revert the patches converting vhost from kthreads to vhost workers until vhost is ready to support user workers created as actual threads. Reported-by: Nicolas Dichtel <nicolas.dichtel@6wind.com> Link: https://lore.kernel.org/all/aba6cca4-e66c-768f-375c-b38c8ba5e8a8@6wind.com Signed-off-by: Christian Brauner <brauner@kernel.org>
-rw-r--r--MAINTAINERS1
-rw-r--r--drivers/vhost/Kconfig5
-rw-r--r--include/linux/sched/vhost_task.h23
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/vhost_task.c117
5 files changed, 0 insertions, 147 deletions
diff --git a/MAINTAINERS b/MAINTAINERS
index 250518fc70ff5f..6d55b15c83f8e8 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -22362,7 +22362,6 @@ L: netdev@vger.kernel.org
S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost.git
F: drivers/vhost/
-F: include/linux/sched/vhost_task.h
F: include/linux/vhost_iotlb.h
F: include/uapi/linux/vhost.h
F: kernel/vhost_task.c
diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
index b455d9ab6f3d9c..587fbae0618213 100644
--- a/drivers/vhost/Kconfig
+++ b/drivers/vhost/Kconfig
@@ -13,14 +13,9 @@ config VHOST_RING
This option is selected by any driver which needs to access
the host side of a virtio ring.
-config VHOST_TASK
- bool
- default n
-
config VHOST
tristate
select VHOST_IOTLB
- select VHOST_TASK
help
This option is selected by any driver which needs to access
the core of vhost.
diff --git a/include/linux/sched/vhost_task.h b/include/linux/sched/vhost_task.h
deleted file mode 100644
index 6123c10b99cf35..00000000000000
--- a/include/linux/sched/vhost_task.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _LINUX_VHOST_TASK_H
-#define _LINUX_VHOST_TASK_H
-
-#include <linux/completion.h>
-
-struct task_struct;
-
-struct vhost_task {
- int (*fn)(void *data);
- void *data;
- struct completion exited;
- unsigned long flags;
- struct task_struct *task;
-};
-
-struct vhost_task *vhost_task_create(int (*fn)(void *), void *arg,
- const char *name);
-void vhost_task_start(struct vhost_task *vtsk);
-void vhost_task_stop(struct vhost_task *vtsk);
-bool vhost_task_should_stop(struct vhost_task *vtsk);
-
-#endif
diff --git a/kernel/Makefile b/kernel/Makefile
index b69c95315480af..3dd4ea433ee998 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -14,7 +14,6 @@ obj-y = fork.o exec_domain.o panic.o \
obj-$(CONFIG_USERMODE_DRIVER) += usermode_driver.o
obj-$(CONFIG_MULTIUSER) += groups.o
-obj-$(CONFIG_VHOST_TASK) += vhost_task.o
ifdef CONFIG_FUNCTION_TRACER
# Do not trace internal ftrace files
diff --git a/kernel/vhost_task.c b/kernel/vhost_task.c
deleted file mode 100644
index b7cbd66f889ea9..00000000000000
--- a/kernel/vhost_task.c
+++ /dev/null
@@ -1,117 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * Copyright (C) 2021 Oracle Corporation
- */
-#include <linux/slab.h>
-#include <linux/completion.h>
-#include <linux/sched/task.h>
-#include <linux/sched/vhost_task.h>
-#include <linux/sched/signal.h>
-
-enum vhost_task_flags {
- VHOST_TASK_FLAGS_STOP,
-};
-
-static int vhost_task_fn(void *data)
-{
- struct vhost_task *vtsk = data;
- int ret;
-
- ret = vtsk->fn(vtsk->data);
- complete(&vtsk->exited);
- do_exit(ret);
-}
-
-/**
- * vhost_task_stop - stop a vhost_task
- * @vtsk: vhost_task to stop
- *
- * Callers must call vhost_task_should_stop and return from their worker
- * function when it returns true;
- */
-void vhost_task_stop(struct vhost_task *vtsk)
-{
- pid_t pid = vtsk->task->pid;
-
- set_bit(VHOST_TASK_FLAGS_STOP, &vtsk->flags);
- wake_up_process(vtsk->task);
- /*
- * Make sure vhost_task_fn is no longer accessing the vhost_task before
- * freeing it below. If userspace crashed or exited without closing,
- * then the vhost_task->task could already be marked dead so
- * kernel_wait will return early.
- */
- wait_for_completion(&vtsk->exited);
- /*
- * If we are just closing/removing a device and the parent process is
- * not exiting then reap the task.
- */
- kernel_wait4(pid, NULL, __WCLONE, NULL);
- kfree(vtsk);
-}
-EXPORT_SYMBOL_GPL(vhost_task_stop);
-
-/**
- * vhost_task_should_stop - should the vhost task return from the work function
- * @vtsk: vhost_task to stop
- */
-bool vhost_task_should_stop(struct vhost_task *vtsk)
-{
- return test_bit(VHOST_TASK_FLAGS_STOP, &vtsk->flags);
-}
-EXPORT_SYMBOL_GPL(vhost_task_should_stop);
-
-/**
- * vhost_task_create - create a copy of a process to be used by the kernel
- * @fn: thread stack
- * @arg: data to be passed to fn
- * @name: the thread's name
- *
- * This returns a specialized task for use by the vhost layer or NULL on
- * failure. The returned task is inactive, and the caller must fire it up
- * through vhost_task_start().
- */
-struct vhost_task *vhost_task_create(int (*fn)(void *), void *arg,
- const char *name)
-{
- struct kernel_clone_args args = {
- .flags = CLONE_FS | CLONE_UNTRACED | CLONE_VM,
- .exit_signal = 0,
- .fn = vhost_task_fn,
- .name = name,
- .user_worker = 1,
- .no_files = 1,
- .ignore_signals = 1,
- };
- struct vhost_task *vtsk;
- struct task_struct *tsk;
-
- vtsk = kzalloc(sizeof(*vtsk), GFP_KERNEL);
- if (!vtsk)
- return NULL;
- init_completion(&vtsk->exited);
- vtsk->data = arg;
- vtsk->fn = fn;
-
- args.fn_arg = vtsk;
-
- tsk = copy_process(NULL, 0, NUMA_NO_NODE, &args);
- if (IS_ERR(tsk)) {
- kfree(vtsk);
- return NULL;
- }
-
- vtsk->task = tsk;
- return vtsk;
-}
-EXPORT_SYMBOL_GPL(vhost_task_create);
-
-/**
- * vhost_task_start - start a vhost_task created with vhost_task_create
- * @vtsk: vhost_task to wake up
- */
-void vhost_task_start(struct vhost_task *vtsk)
-{
- wake_up_new_task(vtsk->task);
-}
-EXPORT_SYMBOL_GPL(vhost_task_start);