* [PATCH RESEND v10 0/3] vhost: Add support of kthread API
@ 2025-05-31 9:57 Cindy Lu
2025-05-31 9:57 ` [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread Cindy Lu
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Cindy Lu @ 2025-05-31 9:57 UTC (permalink / raw)
To: lulu, jasowang, mst, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
In commit 6e890c5d5021 ("vhost: use vhost_tasks for worker threads"),
the vhost now uses vhost_task and operates as a child of the
owner thread. This aligns with containerization principles.
However, this change has caused confusion for some legacy
userspace applications. Therefore, we are reintroducing
support for the kthread API.
In this series, a new UAPI is implemented to allow
userspace applications to configure their thread mode.
Changelog v2:
1. Change the module_param's name to enforce_inherit_owner, and the default value is true.
2. Change the UAPI's name to VHOST_SET_INHERIT_FROM_OWNER.
Changelog v3:
1. Change the module_param's name to inherit_owner_default, and the default value is true.
2. Add a structure for task function; the worker will select a different mode based on the value inherit_owner.
3. device will have their own inherit_owner in struct vhost_dev
4. Address other comments
Changelog v4:
1. remove the module_param, only keep the UAPI
2. remove the structure for task function; change to use the function pointer in vhost_worker
3. fix the issue in vhost_worker_create and vhost_dev_ioctl
4. Address other comments
Changelog v5:
1. Change wakeup and stop function pointers in struct vhost_worker to void.
2. merging patches 4, 5, 6 in a single patch
3. Fix spelling issues and address other comments.
Changelog v6:
1. move the check of VHOST_NEW_WORKER from vhost_scsi to vhost
2. Change the ioctl name VHOST_SET_INHERIT_FROM_OWNER to VHOST_FORK_FROM_OWNER
3. reuse the function __vhost_worker_flush
4. use a ops sturct to support worker relates function
5. reset the value of inherit_owner in vhost_dev_reset_owner.
Changelog v7:
1. add a KConfig knob to disable legacy app support
2. Split the changes into two patches to separately introduce the ops and add kthread support.
3. Utilized INX_MAX to avoid modifications in __vhost_worker_flush
4. Rebased on the latest kernel
5. Address other comments
Changelog v8:
1. Rebased on the latest kernel
2. Address some other comments
Changelog v9:
1. Rebased on the latest kernel.
2. Squashed patches 6‑7.
3. Squashed patches 2‑4.
4. Minor fixes in commit log
Changelog v10:
1.Add support for the module_param.
2.Squash patches 3 and 4.
3.Make minor fixes in the commit log.
4.Fix the mismatched tabs in Kconfig.
5.Rebase on the latest kernel.
Tested with QEMU with kthread mode/task mode/kthread+task mode
Cindy Lu (3):
vhost: Add a new modparam to allow userspace select kthread
vhost: Reintroduce kthread mode support in vhost
vhost: Add new UAPI to select kthread mode and KConfig to enable this
IOCTL
drivers/vhost/Kconfig | 13 +++
drivers/vhost/vhost.c | 223 +++++++++++++++++++++++++++++++++----
drivers/vhost/vhost.h | 22 ++++
include/uapi/linux/vhost.h | 16 +++
4 files changed, 255 insertions(+), 19 deletions(-)
--
2.45.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread
2025-05-31 9:57 [PATCH RESEND v10 0/3] vhost: Add support of kthread API Cindy Lu
@ 2025-05-31 9:57 ` Cindy Lu
2025-06-01 10:51 ` Michael S. Tsirkin
2025-06-03 7:34 ` Simon Horman
2025-05-31 9:57 ` [PATCH RESEND v10 2/3] vhost: Reintroduce kthread mode support in vhost Cindy Lu
` (2 subsequent siblings)
3 siblings, 2 replies; 11+ messages in thread
From: Cindy Lu @ 2025-05-31 9:57 UTC (permalink / raw)
To: lulu, jasowang, mst, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
The vhost now uses vhost_task and workers as a child of the owner thread.
While this aligns with containerization principles, it confuses some
legacy userspace applications, therefore, we are reintroducing kthread
API support.
Add a new module parameter to allow userspace to select behavior
between using kthread and task.
By default, this parameter is set to true (task mode). This means the
default behavior remains unchanged by this patch.
Signed-off-by: Cindy Lu <lulu@redhat.com>
---
drivers/vhost/vhost.c | 5 +++++
drivers/vhost/vhost.h | 10 ++++++++++
2 files changed, 15 insertions(+)
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 3a5ebb973dba..240ba78b1e3f 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -41,6 +41,10 @@ static int max_iotlb_entries = 2048;
module_param(max_iotlb_entries, int, 0444);
MODULE_PARM_DESC(max_iotlb_entries,
"Maximum number of iotlb entries. (default: 2048)");
+bool inherit_owner_default = true;
+module_param(inherit_owner_default, bool, 0444);
+MODULE_PARM_DESC(inherit_owner_default,
+ "Set task mode as the default(default: Y)");
enum {
VHOST_MEMORY_F_LOG = 0x1,
@@ -552,6 +556,7 @@ void vhost_dev_init(struct vhost_dev *dev,
dev->byte_weight = byte_weight;
dev->use_worker = use_worker;
dev->msg_handler = msg_handler;
+ dev->inherit_owner = inherit_owner_default;
init_waitqueue_head(&dev->wait);
INIT_LIST_HEAD(&dev->read_list);
INIT_LIST_HEAD(&dev->pending_list);
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
index bb75a292d50c..c1ff4a92b925 100644
--- a/drivers/vhost/vhost.h
+++ b/drivers/vhost/vhost.h
@@ -176,6 +176,16 @@ struct vhost_dev {
int byte_weight;
struct xarray worker_xa;
bool use_worker;
+ /*
+ * If inherit_owner is true we use vhost_tasks to create
+ * the worker so all settings/limits like cgroups, NPROC,
+ * scheduler, etc are inherited from the owner. If false,
+ * we use kthreads and only attach to the same cgroups
+ * as the owner for compat with older kernels.
+ * here we use true as default value.
+ * The default value is set by modparam inherit_owner_default
+ */
+ bool inherit_owner;
int (*msg_handler)(struct vhost_dev *dev, u32 asid,
struct vhost_iotlb_msg *msg);
};
--
2.45.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH RESEND v10 2/3] vhost: Reintroduce kthread mode support in vhost
2025-05-31 9:57 [PATCH RESEND v10 0/3] vhost: Add support of kthread API Cindy Lu
2025-05-31 9:57 ` [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread Cindy Lu
@ 2025-05-31 9:57 ` Cindy Lu
2025-05-31 9:57 ` [PATCH RESEND v10 3/3] vhost: Add new UAPI to select kthread mode and KConfig to enable this IOCTL Cindy Lu
2025-06-04 6:00 ` [PATCH RESEND v10 0/3] vhost: Add support of kthread API Lei Yang
3 siblings, 0 replies; 11+ messages in thread
From: Cindy Lu @ 2025-05-31 9:57 UTC (permalink / raw)
To: lulu, jasowang, mst, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
This patch reintroduces kthread mode support in vhost,
It also introduces struct vhost_worker_ops to abstract
worker create/stop/wakeup operations.
* Bring back the original vhost_worker() implementation,
and renamed to vhost_run_work_kthread_list().
* Add cgroup support for the kthread
* Introduce struct vhost_worker_ops:
- Encapsulates create / stop / wake‑up callbacks.
- vhost_worker_create() selects the proper ops according to
inherit_owner.
This partially reverts or improves upon:
commit 6e890c5d5021 ("vhost: use vhost_tasks for worker threads")
commit 1cdaafa1b8b4 ("vhost: replace single worker pointer with xarray")
Signed-off-by: Cindy Lu <lulu@redhat.com>
---
drivers/vhost/vhost.c | 188 ++++++++++++++++++++++++++++++++++++++----
drivers/vhost/vhost.h | 12 +++
2 files changed, 182 insertions(+), 18 deletions(-)
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 240ba78b1e3f..2d2909be1bb2 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -22,6 +22,7 @@
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/kthread.h>
+#include <linux/cgroup.h>
#include <linux/module.h>
#include <linux/sort.h>
#include <linux/sched/mm.h>
@@ -246,7 +247,7 @@ static void vhost_worker_queue(struct vhost_worker *worker,
* test_and_set_bit() implies a memory barrier.
*/
llist_add(&work->node, &worker->work_list);
- vhost_task_wake(worker->vtsk);
+ worker->ops->wakeup(worker);
}
}
@@ -392,6 +393,44 @@ static void vhost_vq_reset(struct vhost_dev *dev,
__vhost_vq_meta_reset(vq);
}
+static int vhost_run_work_kthread_list(void *data)
+{
+ struct vhost_worker *worker = data;
+ struct vhost_work *work, *work_next;
+ struct vhost_dev *dev = worker->dev;
+ struct llist_node *node;
+
+ kthread_use_mm(dev->mm);
+
+ for (;;) {
+ /* mb paired w/ kthread_stop */
+ set_current_state(TASK_INTERRUPTIBLE);
+
+ if (kthread_should_stop()) {
+ __set_current_state(TASK_RUNNING);
+ break;
+ }
+ node = llist_del_all(&worker->work_list);
+ if (!node)
+ schedule();
+
+ node = llist_reverse_order(node);
+ /* make sure flag is seen after deletion */
+ smp_wmb();
+ llist_for_each_entry_safe(work, work_next, node, node) {
+ clear_bit(VHOST_WORK_QUEUED, &work->flags);
+ __set_current_state(TASK_RUNNING);
+ kcov_remote_start_common(worker->kcov_handle);
+ work->fn(work);
+ kcov_remote_stop();
+ cond_resched();
+ }
+ }
+ kthread_unuse_mm(dev->mm);
+
+ return 0;
+}
+
static bool vhost_run_work_list(void *data)
{
struct vhost_worker *worker = data;
@@ -586,6 +625,46 @@ long vhost_dev_check_owner(struct vhost_dev *dev)
}
EXPORT_SYMBOL_GPL(vhost_dev_check_owner);
+struct vhost_attach_cgroups_struct {
+ struct vhost_work work;
+ struct task_struct *owner;
+ int ret;
+};
+
+static void vhost_attach_cgroups_work(struct vhost_work *work)
+{
+ struct vhost_attach_cgroups_struct *s;
+
+ s = container_of(work, struct vhost_attach_cgroups_struct, work);
+ s->ret = cgroup_attach_task_all(s->owner, current);
+}
+
+static int vhost_attach_task_to_cgroups(struct vhost_worker *worker)
+{
+ struct vhost_attach_cgroups_struct attach;
+ int saved_cnt;
+
+ attach.owner = current;
+
+ vhost_work_init(&attach.work, vhost_attach_cgroups_work);
+ vhost_worker_queue(worker, &attach.work);
+
+ mutex_lock(&worker->mutex);
+
+ /*
+ * Bypass attachment_cnt check in __vhost_worker_flush:
+ * Temporarily change it to INT_MAX to bypass the check
+ */
+ saved_cnt = worker->attachment_cnt;
+ worker->attachment_cnt = INT_MAX;
+ __vhost_worker_flush(worker);
+ worker->attachment_cnt = saved_cnt;
+
+ mutex_unlock(&worker->mutex);
+
+ return attach.ret;
+}
+
/* Caller should have device mutex */
bool vhost_dev_has_owner(struct vhost_dev *dev)
{
@@ -631,7 +710,7 @@ static void vhost_worker_destroy(struct vhost_dev *dev,
WARN_ON(!llist_empty(&worker->work_list));
xa_erase(&dev->worker_xa, worker->id);
- vhost_task_stop(worker->vtsk);
+ worker->ops->stop(worker);
kfree(worker);
}
@@ -654,42 +733,115 @@ static void vhost_workers_free(struct vhost_dev *dev)
xa_destroy(&dev->worker_xa);
}
+static void vhost_task_wakeup(struct vhost_worker *worker)
+{
+ return vhost_task_wake(worker->vtsk);
+}
+
+static void vhost_kthread_wakeup(struct vhost_worker *worker)
+{
+ wake_up_process(worker->kthread_task);
+}
+
+static void vhost_task_do_stop(struct vhost_worker *worker)
+{
+ return vhost_task_stop(worker->vtsk);
+}
+
+static void vhost_kthread_do_stop(struct vhost_worker *worker)
+{
+ kthread_stop(worker->kthread_task);
+}
+
+static int vhost_task_worker_create(struct vhost_worker *worker,
+ struct vhost_dev *dev, const char *name)
+{
+ struct vhost_task *vtsk;
+ u32 id;
+ int ret;
+
+ vtsk = vhost_task_create(vhost_run_work_list, vhost_worker_killed,
+ worker, name);
+ if (IS_ERR(vtsk))
+ return PTR_ERR(vtsk);
+
+ worker->vtsk = vtsk;
+ vhost_task_start(vtsk);
+ ret = xa_alloc(&dev->worker_xa, &id, worker, xa_limit_32b, GFP_KERNEL);
+ if (ret < 0) {
+ vhost_task_do_stop(worker);
+ return ret;
+ }
+ worker->id = id;
+ return 0;
+}
+
+static int vhost_kthread_worker_create(struct vhost_worker *worker,
+ struct vhost_dev *dev, const char *name)
+{
+ struct task_struct *task;
+ u32 id;
+ int ret;
+
+ task = kthread_create(vhost_run_work_kthread_list, worker, "%s", name);
+ if (IS_ERR(task))
+ return PTR_ERR(task);
+
+ worker->kthread_task = task;
+ wake_up_process(task);
+ ret = xa_alloc(&dev->worker_xa, &id, worker, xa_limit_32b, GFP_KERNEL);
+ if (ret < 0)
+ goto stop_worker;
+
+ ret = vhost_attach_task_to_cgroups(worker);
+ if (ret)
+ goto stop_worker;
+
+ worker->id = id;
+ return 0;
+
+stop_worker:
+ vhost_kthread_do_stop(worker);
+ return ret;
+}
+
+static const struct vhost_worker_ops kthread_ops = {
+ .create = vhost_kthread_worker_create,
+ .stop = vhost_kthread_do_stop,
+ .wakeup = vhost_kthread_wakeup,
+};
+
+static const struct vhost_worker_ops vhost_task_ops = {
+ .create = vhost_task_worker_create,
+ .stop = vhost_task_do_stop,
+ .wakeup = vhost_task_wakeup,
+};
+
static struct vhost_worker *vhost_worker_create(struct vhost_dev *dev)
{
struct vhost_worker *worker;
- struct vhost_task *vtsk;
char name[TASK_COMM_LEN];
int ret;
- u32 id;
+ const struct vhost_worker_ops *ops =
+ dev->inherit_owner ? &vhost_task_ops : &kthread_ops;
worker = kzalloc(sizeof(*worker), GFP_KERNEL_ACCOUNT);
if (!worker)
return NULL;
worker->dev = dev;
+ worker->ops = ops;
snprintf(name, sizeof(name), "vhost-%d", current->pid);
- vtsk = vhost_task_create(vhost_run_work_list, vhost_worker_killed,
- worker, name);
- if (IS_ERR(vtsk))
- goto free_worker;
-
mutex_init(&worker->mutex);
init_llist_head(&worker->work_list);
worker->kcov_handle = kcov_common_handle();
- worker->vtsk = vtsk;
-
- vhost_task_start(vtsk);
-
- ret = xa_alloc(&dev->worker_xa, &id, worker, xa_limit_32b, GFP_KERNEL);
+ ret = ops->create(worker, dev, name);
if (ret < 0)
- goto stop_worker;
- worker->id = id;
+ goto free_worker;
return worker;
-stop_worker:
- vhost_task_stop(vtsk);
free_worker:
kfree(worker);
return NULL;
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
index c1ff4a92b925..bef42ed51485 100644
--- a/drivers/vhost/vhost.h
+++ b/drivers/vhost/vhost.h
@@ -26,7 +26,18 @@ struct vhost_work {
unsigned long flags;
};
+struct vhost_worker;
+struct vhost_dev;
+
+struct vhost_worker_ops {
+ int (*create)(struct vhost_worker *worker, struct vhost_dev *dev,
+ const char *name);
+ void (*stop)(struct vhost_worker *worker);
+ void (*wakeup)(struct vhost_worker *worker);
+};
+
struct vhost_worker {
+ struct task_struct *kthread_task;
struct vhost_task *vtsk;
struct vhost_dev *dev;
/* Used to serialize device wide flushing with worker swapping. */
@@ -36,6 +47,7 @@ struct vhost_worker {
u32 id;
int attachment_cnt;
bool killed;
+ const struct vhost_worker_ops *ops;
};
/* Poll a file (eventfd or socket) */
--
2.45.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH RESEND v10 3/3] vhost: Add new UAPI to select kthread mode and KConfig to enable this IOCTL
2025-05-31 9:57 [PATCH RESEND v10 0/3] vhost: Add support of kthread API Cindy Lu
2025-05-31 9:57 ` [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread Cindy Lu
2025-05-31 9:57 ` [PATCH RESEND v10 2/3] vhost: Reintroduce kthread mode support in vhost Cindy Lu
@ 2025-05-31 9:57 ` Cindy Lu
2025-06-01 10:49 ` Michael S. Tsirkin
2025-06-04 6:00 ` [PATCH RESEND v10 0/3] vhost: Add support of kthread API Lei Yang
3 siblings, 1 reply; 11+ messages in thread
From: Cindy Lu @ 2025-05-31 9:57 UTC (permalink / raw)
To: lulu, jasowang, mst, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
This patch introduces a new UAPI that allows the vhost device to select
in kthread mode. Userspace applications can utilize IOCTL
VHOST_FORK_FROM_OWNER to select between task and kthread modes, which
must be invoked before IOCTL VHOST_SET_OWNER, as the worker will be
created during that call.
The VHOST_NEW_WORKER requires the inherit_owner setting to be true, and
a check has been added to ensure proper configuration.
Additionally, a new KConfig option, CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL,
is introduced to control the availability of the IOCTL
VHOST_FORK_FROM_OWNER. When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set
to n, the IOCTL is disabled, and any attempt to use it will result in a
failure.
Signed-off-by: Cindy Lu <lulu@redhat.com>
---
drivers/vhost/Kconfig | 13 +++++++++++++
drivers/vhost/vhost.c | 30 +++++++++++++++++++++++++++++-
include/uapi/linux/vhost.h | 16 ++++++++++++++++
3 files changed, 58 insertions(+), 1 deletion(-)
diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
index 020d4fbb947c..300e474b60fd 100644
--- a/drivers/vhost/Kconfig
+++ b/drivers/vhost/Kconfig
@@ -96,3 +96,16 @@ config VHOST_CROSS_ENDIAN_LEGACY
If unsure, say "N".
endif
+
+config VHOST_ENABLE_FORK_OWNER_IOCTL
+ bool "Enable IOCTL VHOST_FORK_FROM_OWNER"
+ default n
+ help
+ This option enables the IOCTL VHOST_FORK_FROM_OWNER, allowing
+ userspace applications to modify the thread mode for vhost devices.
+
+ By default, `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL` is set to `n`,
+ which disables the IOCTL. When enabled (y), the IOCTL allows
+ users to set the mode as needed.
+
+ If unsure, say "N".
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 2d2909be1bb2..cfa60dc438f9 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -1022,6 +1022,13 @@ long vhost_worker_ioctl(struct vhost_dev *dev, unsigned int ioctl,
switch (ioctl) {
/* dev worker ioctls */
case VHOST_NEW_WORKER:
+ /*
+ * vhost_tasks will account for worker threads under the parent's
+ * NPROC value but kthreads do not. To avoid userspace overflowing
+ * the system with worker threads inherit_owner must be true.
+ */
+ if (!dev->inherit_owner)
+ return -EFAULT;
ret = vhost_new_worker(dev, &state);
if (!ret && copy_to_user(argp, &state, sizeof(state)))
ret = -EFAULT;
@@ -1138,7 +1145,7 @@ void vhost_dev_reset_owner(struct vhost_dev *dev, struct vhost_iotlb *umem)
int i;
vhost_dev_cleanup(dev);
-
+ dev->inherit_owner = inherit_owner_default;
dev->umem = umem;
/* We don't need VQ locks below since vhost_dev_cleanup makes sure
* VQs aren't running.
@@ -2292,6 +2299,27 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
goto done;
}
+#ifdef CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL
+ if (ioctl == VHOST_FORK_FROM_OWNER) {
+ u8 inherit_owner;
+ /*inherit_owner can only be modified before owner is set*/
+ if (vhost_dev_has_owner(d)) {
+ r = -EBUSY;
+ goto done;
+ }
+ if (copy_from_user(&inherit_owner, argp, sizeof(u8))) {
+ r = -EFAULT;
+ goto done;
+ }
+ if (inherit_owner > 1) {
+ r = -EINVAL;
+ goto done;
+ }
+ d->inherit_owner = (bool)inherit_owner;
+ r = 0;
+ goto done;
+ }
+#endif
/* You must be the owner to do anything else */
r = vhost_dev_check_owner(d);
if (r)
diff --git a/include/uapi/linux/vhost.h b/include/uapi/linux/vhost.h
index d4b3e2ae1314..d2692c7ef450 100644
--- a/include/uapi/linux/vhost.h
+++ b/include/uapi/linux/vhost.h
@@ -235,4 +235,20 @@
*/
#define VHOST_VDPA_GET_VRING_SIZE _IOWR(VHOST_VIRTIO, 0x82, \
struct vhost_vring_state)
+
+/**
+ * VHOST_FORK_FROM_OWNER - Set the inherit_owner flag for the vhost device,
+ * This ioctl must called before VHOST_SET_OWNER.
+ *
+ * @param inherit_owner: An 8-bit value that determines the vhost thread mode
+ *
+ * When inherit_owner is set to 1(default value):
+ * - Vhost will create tasks similar to processes forked from the owner,
+ * inheriting all of the owner's attributes.
+ *
+ * When inherit_owner is set to 0:
+ * - Vhost will create tasks as kernel thread.
+ */
+#define VHOST_FORK_FROM_OWNER _IOW(VHOST_VIRTIO, 0x83, __u8)
+
#endif
--
2.45.0
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH RESEND v10 3/3] vhost: Add new UAPI to select kthread mode and KConfig to enable this IOCTL
2025-05-31 9:57 ` [PATCH RESEND v10 3/3] vhost: Add new UAPI to select kthread mode and KConfig to enable this IOCTL Cindy Lu
@ 2025-06-01 10:49 ` Michael S. Tsirkin
2025-06-05 7:34 ` Cindy Lu
0 siblings, 1 reply; 11+ messages in thread
From: Michael S. Tsirkin @ 2025-06-01 10:49 UTC (permalink / raw)
To: Cindy Lu
Cc: jasowang, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Sat, May 31, 2025 at 05:57:28PM +0800, Cindy Lu wrote:
> This patch introduces a new UAPI that allows the vhost device to select
> in kthread mode. Userspace applications can utilize IOCTL
> VHOST_FORK_FROM_OWNER to select between task and kthread modes, which
> must be invoked before IOCTL VHOST_SET_OWNER, as the worker will be
> created during that call.
>
> The VHOST_NEW_WORKER requires the inherit_owner setting to be true, and
> a check has been added to ensure proper configuration.
>
> Additionally, a new KConfig option, CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL,
> is introduced to control the availability of the IOCTL
> VHOST_FORK_FROM_OWNER. When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set
> to n, the IOCTL is disabled, and any attempt to use it will result in a
> failure.
>
> Signed-off-by: Cindy Lu <lulu@redhat.com>
I propose renaming
CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL
to
CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL
and it should also control the presence of the module parameter
and a get ioctl (more on which below).
Otherwise we can get a situation where task mode is disabled and
there is no way for userspace to override or check.
> ---
> drivers/vhost/Kconfig | 13 +++++++++++++
> drivers/vhost/vhost.c | 30 +++++++++++++++++++++++++++++-
> include/uapi/linux/vhost.h | 16 ++++++++++++++++
> 3 files changed, 58 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
> index 020d4fbb947c..300e474b60fd 100644
> --- a/drivers/vhost/Kconfig
> +++ b/drivers/vhost/Kconfig
> @@ -96,3 +96,16 @@ config VHOST_CROSS_ENDIAN_LEGACY
> If unsure, say "N".
>
> endif
> +
> +config VHOST_ENABLE_FORK_OWNER_IOCTL
> + bool "Enable IOCTL VHOST_FORK_FROM_OWNER"
> + default n
> + help
> + This option enables the IOCTL VHOST_FORK_FROM_OWNER, allowing
> + userspace applications to modify the thread mode for vhost devices.
> +
> + By default, `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL` is set to `n`,
> + which disables the IOCTL. When enabled (y), the IOCTL allows
> + users to set the mode as needed.
> +
> + If unsure, say "N".
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 2d2909be1bb2..cfa60dc438f9 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -1022,6 +1022,13 @@ long vhost_worker_ioctl(struct vhost_dev *dev, unsigned int ioctl,
> switch (ioctl) {
> /* dev worker ioctls */
> case VHOST_NEW_WORKER:
> + /*
> + * vhost_tasks will account for worker threads under the parent's
> + * NPROC value but kthreads do not. To avoid userspace overflowing
> + * the system with worker threads inherit_owner must be true.
> + */
> + if (!dev->inherit_owner)
> + return -EFAULT;
> ret = vhost_new_worker(dev, &state);
> if (!ret && copy_to_user(argp, &state, sizeof(state)))
> ret = -EFAULT;
> @@ -1138,7 +1145,7 @@ void vhost_dev_reset_owner(struct vhost_dev *dev, struct vhost_iotlb *umem)
> int i;
>
> vhost_dev_cleanup(dev);
> -
> + dev->inherit_owner = inherit_owner_default;
> dev->umem = umem;
> /* We don't need VQ locks below since vhost_dev_cleanup makes sure
> * VQs aren't running.
> @@ -2292,6 +2299,27 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> goto done;
> }
>
> +#ifdef CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL
> + if (ioctl == VHOST_FORK_FROM_OWNER) {
> + u8 inherit_owner;
> + /*inherit_owner can only be modified before owner is set*/
> + if (vhost_dev_has_owner(d)) {
> + r = -EBUSY;
> + goto done;
> + }
> + if (copy_from_user(&inherit_owner, argp, sizeof(u8))) {
> + r = -EFAULT;
> + goto done;
> + }
> + if (inherit_owner > 1) {
> + r = -EINVAL;
> + goto done;
> + }
> + d->inherit_owner = (bool)inherit_owner;
> + r = 0;
> + goto done;
> + }
> +#endif
> /* You must be the owner to do anything else */
> r = vhost_dev_check_owner(d);
> if (r)
> diff --git a/include/uapi/linux/vhost.h b/include/uapi/linux/vhost.h
> index d4b3e2ae1314..d2692c7ef450 100644
> --- a/include/uapi/linux/vhost.h
> +++ b/include/uapi/linux/vhost.h
> @@ -235,4 +235,20 @@
> */
> #define VHOST_VDPA_GET_VRING_SIZE _IOWR(VHOST_VIRTIO, 0x82, \
> struct vhost_vring_state)
> +
> +/**
> + * VHOST_FORK_FROM_OWNER - Set the inherit_owner flag for the vhost device,
> + * This ioctl must called before VHOST_SET_OWNER.
> + *
> + * @param inherit_owner: An 8-bit value that determines the vhost thread mode
> + *
> + * When inherit_owner is set to 1(default value):
> + * - Vhost will create tasks similar to processes forked from the owner,
> + * inheriting all of the owner's attributes.
> + *
> + * When inherit_owner is set to 0:
> + * - Vhost will create tasks as kernel thread.
> + */
> +#define VHOST_FORK_FROM_OWNER _IOW(VHOST_VIRTIO, 0x83, __u8)
Given default now depends on the module parameter, we should
have both GET and SET ioctls. All controlled by the kconfig knob.
> +
> #endif
> --
> 2.45.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread
2025-05-31 9:57 ` [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread Cindy Lu
@ 2025-06-01 10:51 ` Michael S. Tsirkin
2025-06-05 7:34 ` Cindy Lu
2025-06-03 7:34 ` Simon Horman
1 sibling, 1 reply; 11+ messages in thread
From: Michael S. Tsirkin @ 2025-06-01 10:51 UTC (permalink / raw)
To: Cindy Lu
Cc: jasowang, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Sat, May 31, 2025 at 05:57:26PM +0800, Cindy Lu wrote:
> The vhost now uses vhost_task and workers as a child of the owner thread.
> While this aligns with containerization principles, it confuses some
> legacy userspace applications, therefore, we are reintroducing kthread
> API support.
>
> Add a new module parameter to allow userspace to select behavior
> between using kthread and task.
>
> By default, this parameter is set to true (task mode). This means the
> default behavior remains unchanged by this patch.
>
> Signed-off-by: Cindy Lu <lulu@redhat.com>
So modparam is here but does nothing.
This should be the last patch in the series, or squashed with 3/3.
why is this inherit_owner but ioctl is fork_owner? is there
a difference? If not
can't the name be consistent with the ioctl? vhost_fork_owner?
> ---
> drivers/vhost/vhost.c | 5 +++++
> drivers/vhost/vhost.h | 10 ++++++++++
> 2 files changed, 15 insertions(+)
>
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 3a5ebb973dba..240ba78b1e3f 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -41,6 +41,10 @@ static int max_iotlb_entries = 2048;
> module_param(max_iotlb_entries, int, 0444);
> MODULE_PARM_DESC(max_iotlb_entries,
> "Maximum number of iotlb entries. (default: 2048)");
> +bool inherit_owner_default = true;
> +module_param(inherit_owner_default, bool, 0444);
> +MODULE_PARM_DESC(inherit_owner_default,
> + "Set task mode as the default(default: Y)");
>
> enum {
> VHOST_MEMORY_F_LOG = 0x1,
> @@ -552,6 +556,7 @@ void vhost_dev_init(struct vhost_dev *dev,
> dev->byte_weight = byte_weight;
> dev->use_worker = use_worker;
> dev->msg_handler = msg_handler;
> + dev->inherit_owner = inherit_owner_default;
> init_waitqueue_head(&dev->wait);
> INIT_LIST_HEAD(&dev->read_list);
> INIT_LIST_HEAD(&dev->pending_list);
> diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
> index bb75a292d50c..c1ff4a92b925 100644
> --- a/drivers/vhost/vhost.h
> +++ b/drivers/vhost/vhost.h
> @@ -176,6 +176,16 @@ struct vhost_dev {
> int byte_weight;
> struct xarray worker_xa;
> bool use_worker;
> + /*
> + * If inherit_owner is true we use vhost_tasks to create
> + * the worker so all settings/limits like cgroups, NPROC,
> + * scheduler, etc are inherited from the owner. If false,
> + * we use kthreads and only attach to the same cgroups
> + * as the owner for compat with older kernels.
> + * here we use true as default value.
> + * The default value is set by modparam inherit_owner_default
> + */
> + bool inherit_owner;
> int (*msg_handler)(struct vhost_dev *dev, u32 asid,
> struct vhost_iotlb_msg *msg);
> };
> --
> 2.45.0
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread
2025-05-31 9:57 ` [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread Cindy Lu
2025-06-01 10:51 ` Michael S. Tsirkin
@ 2025-06-03 7:34 ` Simon Horman
2025-06-05 7:35 ` Cindy Lu
1 sibling, 1 reply; 11+ messages in thread
From: Simon Horman @ 2025-06-03 7:34 UTC (permalink / raw)
To: Cindy Lu
Cc: jasowang, mst, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Sat, May 31, 2025 at 05:57:26PM +0800, Cindy Lu wrote:
> The vhost now uses vhost_task and workers as a child of the owner thread.
> While this aligns with containerization principles, it confuses some
> legacy userspace applications, therefore, we are reintroducing kthread
> API support.
>
> Add a new module parameter to allow userspace to select behavior
> between using kthread and task.
>
> By default, this parameter is set to true (task mode). This means the
> default behavior remains unchanged by this patch.
>
> Signed-off-by: Cindy Lu <lulu@redhat.com>
> ---
> drivers/vhost/vhost.c | 5 +++++
> drivers/vhost/vhost.h | 10 ++++++++++
> 2 files changed, 15 insertions(+)
>
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index 3a5ebb973dba..240ba78b1e3f 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -41,6 +41,10 @@ static int max_iotlb_entries = 2048;
> module_param(max_iotlb_entries, int, 0444);
> MODULE_PARM_DESC(max_iotlb_entries,
> "Maximum number of iotlb entries. (default: 2048)");
> +bool inherit_owner_default = true;
Hi Cindy,
I don't mean to block progress of this patchset.
But it looks like inherit_owner_default can be static.
Flagged by Sparse.
> +module_param(inherit_owner_default, bool, 0444);
> +MODULE_PARM_DESC(inherit_owner_default,
> + "Set task mode as the default(default: Y)");
...
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH RESEND v10 0/3] vhost: Add support of kthread API
2025-05-31 9:57 [PATCH RESEND v10 0/3] vhost: Add support of kthread API Cindy Lu
` (2 preceding siblings ...)
2025-05-31 9:57 ` [PATCH RESEND v10 3/3] vhost: Add new UAPI to select kthread mode and KConfig to enable this IOCTL Cindy Lu
@ 2025-06-04 6:00 ` Lei Yang
3 siblings, 0 replies; 11+ messages in thread
From: Lei Yang @ 2025-06-04 6:00 UTC (permalink / raw)
To: Cindy Lu
Cc: jasowang, mst, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
Tested this patch with virtio-net regression tests, everything works fine.
Tested-by: Lei Yang <leiyang@redhat.com>
On Sat, May 31, 2025 at 5:58 PM Cindy Lu <lulu@redhat.com> wrote:
>
> In commit 6e890c5d5021 ("vhost: use vhost_tasks for worker threads"),
> the vhost now uses vhost_task and operates as a child of the
> owner thread. This aligns with containerization principles.
> However, this change has caused confusion for some legacy
> userspace applications. Therefore, we are reintroducing
> support for the kthread API.
>
> In this series, a new UAPI is implemented to allow
> userspace applications to configure their thread mode.
>
> Changelog v2:
> 1. Change the module_param's name to enforce_inherit_owner, and the default value is true.
> 2. Change the UAPI's name to VHOST_SET_INHERIT_FROM_OWNER.
>
> Changelog v3:
> 1. Change the module_param's name to inherit_owner_default, and the default value is true.
> 2. Add a structure for task function; the worker will select a different mode based on the value inherit_owner.
> 3. device will have their own inherit_owner in struct vhost_dev
> 4. Address other comments
>
> Changelog v4:
> 1. remove the module_param, only keep the UAPI
> 2. remove the structure for task function; change to use the function pointer in vhost_worker
> 3. fix the issue in vhost_worker_create and vhost_dev_ioctl
> 4. Address other comments
>
> Changelog v5:
> 1. Change wakeup and stop function pointers in struct vhost_worker to void.
> 2. merging patches 4, 5, 6 in a single patch
> 3. Fix spelling issues and address other comments.
>
> Changelog v6:
> 1. move the check of VHOST_NEW_WORKER from vhost_scsi to vhost
> 2. Change the ioctl name VHOST_SET_INHERIT_FROM_OWNER to VHOST_FORK_FROM_OWNER
> 3. reuse the function __vhost_worker_flush
> 4. use a ops sturct to support worker relates function
> 5. reset the value of inherit_owner in vhost_dev_reset_owner.
>
> Changelog v7:
> 1. add a KConfig knob to disable legacy app support
> 2. Split the changes into two patches to separately introduce the ops and add kthread support.
> 3. Utilized INX_MAX to avoid modifications in __vhost_worker_flush
> 4. Rebased on the latest kernel
> 5. Address other comments
>
> Changelog v8:
> 1. Rebased on the latest kernel
> 2. Address some other comments
>
> Changelog v9:
> 1. Rebased on the latest kernel.
> 2. Squashed patches 6‑7.
> 3. Squashed patches 2‑4.
> 4. Minor fixes in commit log
>
>
> Changelog v10:
> 1.Add support for the module_param.
> 2.Squash patches 3 and 4.
> 3.Make minor fixes in the commit log.
> 4.Fix the mismatched tabs in Kconfig.
> 5.Rebase on the latest kernel.
>
> Tested with QEMU with kthread mode/task mode/kthread+task mode
>
> Cindy Lu (3):
> vhost: Add a new modparam to allow userspace select kthread
> vhost: Reintroduce kthread mode support in vhost
> vhost: Add new UAPI to select kthread mode and KConfig to enable this
> IOCTL
>
> drivers/vhost/Kconfig | 13 +++
> drivers/vhost/vhost.c | 223 +++++++++++++++++++++++++++++++++----
> drivers/vhost/vhost.h | 22 ++++
> include/uapi/linux/vhost.h | 16 +++
> 4 files changed, 255 insertions(+), 19 deletions(-)
>
> --
> 2.45.0
>
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH RESEND v10 3/3] vhost: Add new UAPI to select kthread mode and KConfig to enable this IOCTL
2025-06-01 10:49 ` Michael S. Tsirkin
@ 2025-06-05 7:34 ` Cindy Lu
0 siblings, 0 replies; 11+ messages in thread
From: Cindy Lu @ 2025-06-05 7:34 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: jasowang, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Sun, Jun 1, 2025 at 6:49 PM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> On Sat, May 31, 2025 at 05:57:28PM +0800, Cindy Lu wrote:
> > This patch introduces a new UAPI that allows the vhost device to select
> > in kthread mode. Userspace applications can utilize IOCTL
> > VHOST_FORK_FROM_OWNER to select between task and kthread modes, which
> > must be invoked before IOCTL VHOST_SET_OWNER, as the worker will be
> > created during that call.
> >
> > The VHOST_NEW_WORKER requires the inherit_owner setting to be true, and
> > a check has been added to ensure proper configuration.
> >
> > Additionally, a new KConfig option, CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL,
> > is introduced to control the availability of the IOCTL
> > VHOST_FORK_FROM_OWNER. When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set
> > to n, the IOCTL is disabled, and any attempt to use it will result in a
> > failure.
> >
> > Signed-off-by: Cindy Lu <lulu@redhat.com>
>
> I propose renaming
> CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL
> to
> CONFIG_VHOST_ENABLE_FORK_OWNER_CONTROL
> and it should also control the presence of the module parameter
> and a get ioctl (more on which below).
>
> Otherwise we can get a situation where task mode is disabled and
> there is no way for userspace to override or check.
>
>
sure, will do
Thanks
cindy
>
> > ---
> > drivers/vhost/Kconfig | 13 +++++++++++++
> > drivers/vhost/vhost.c | 30 +++++++++++++++++++++++++++++-
> > include/uapi/linux/vhost.h | 16 ++++++++++++++++
> > 3 files changed, 58 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
> > index 020d4fbb947c..300e474b60fd 100644
> > --- a/drivers/vhost/Kconfig
> > +++ b/drivers/vhost/Kconfig
> > @@ -96,3 +96,16 @@ config VHOST_CROSS_ENDIAN_LEGACY
> > If unsure, say "N".
> >
> > endif
> > +
> > +config VHOST_ENABLE_FORK_OWNER_IOCTL
> > + bool "Enable IOCTL VHOST_FORK_FROM_OWNER"
> > + default n
> > + help
> > + This option enables the IOCTL VHOST_FORK_FROM_OWNER, allowing
> > + userspace applications to modify the thread mode for vhost devices.
> > +
> > + By default, `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL` is set to `n`,
> > + which disables the IOCTL. When enabled (y), the IOCTL allows
> > + users to set the mode as needed.
> > +
> > + If unsure, say "N".
> > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> > index 2d2909be1bb2..cfa60dc438f9 100644
> > --- a/drivers/vhost/vhost.c
> > +++ b/drivers/vhost/vhost.c
> > @@ -1022,6 +1022,13 @@ long vhost_worker_ioctl(struct vhost_dev *dev, unsigned int ioctl,
> > switch (ioctl) {
> > /* dev worker ioctls */
> > case VHOST_NEW_WORKER:
> > + /*
> > + * vhost_tasks will account for worker threads under the parent's
> > + * NPROC value but kthreads do not. To avoid userspace overflowing
> > + * the system with worker threads inherit_owner must be true.
> > + */
> > + if (!dev->inherit_owner)
> > + return -EFAULT;
> > ret = vhost_new_worker(dev, &state);
> > if (!ret && copy_to_user(argp, &state, sizeof(state)))
> > ret = -EFAULT;
> > @@ -1138,7 +1145,7 @@ void vhost_dev_reset_owner(struct vhost_dev *dev, struct vhost_iotlb *umem)
> > int i;
> >
> > vhost_dev_cleanup(dev);
> > -
> > + dev->inherit_owner = inherit_owner_default;
> > dev->umem = umem;
> > /* We don't need VQ locks below since vhost_dev_cleanup makes sure
> > * VQs aren't running.
> > @@ -2292,6 +2299,27 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> > goto done;
> > }
> >
> > +#ifdef CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL
> > + if (ioctl == VHOST_FORK_FROM_OWNER) {
> > + u8 inherit_owner;
> > + /*inherit_owner can only be modified before owner is set*/
> > + if (vhost_dev_has_owner(d)) {
> > + r = -EBUSY;
> > + goto done;
> > + }
> > + if (copy_from_user(&inherit_owner, argp, sizeof(u8))) {
> > + r = -EFAULT;
> > + goto done;
> > + }
> > + if (inherit_owner > 1) {
> > + r = -EINVAL;
> > + goto done;
> > + }
> > + d->inherit_owner = (bool)inherit_owner;
> > + r = 0;
> > + goto done;
> > + }
> > +#endif
> > /* You must be the owner to do anything else */
> > r = vhost_dev_check_owner(d);
> > if (r)
> > diff --git a/include/uapi/linux/vhost.h b/include/uapi/linux/vhost.h
> > index d4b3e2ae1314..d2692c7ef450 100644
> > --- a/include/uapi/linux/vhost.h
> > +++ b/include/uapi/linux/vhost.h
> > @@ -235,4 +235,20 @@
> > */
> > #define VHOST_VDPA_GET_VRING_SIZE _IOWR(VHOST_VIRTIO, 0x82, \
> > struct vhost_vring_state)
> > +
> > +/**
> > + * VHOST_FORK_FROM_OWNER - Set the inherit_owner flag for the vhost device,
> > + * This ioctl must called before VHOST_SET_OWNER.
> > + *
> > + * @param inherit_owner: An 8-bit value that determines the vhost thread mode
> > + *
> > + * When inherit_owner is set to 1(default value):
> > + * - Vhost will create tasks similar to processes forked from the owner,
> > + * inheriting all of the owner's attributes.
> > + *
> > + * When inherit_owner is set to 0:
> > + * - Vhost will create tasks as kernel thread.
> > + */
> > +#define VHOST_FORK_FROM_OWNER _IOW(VHOST_VIRTIO, 0x83, __u8)
>
>
>
> Given default now depends on the module parameter, we should
> have both GET and SET ioctls. All controlled by the kconfig knob.
>
Sure, will do
Thanks
cindy
> > +
> > #endif
> > --
> > 2.45.0
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread
2025-06-01 10:51 ` Michael S. Tsirkin
@ 2025-06-05 7:34 ` Cindy Lu
0 siblings, 0 replies; 11+ messages in thread
From: Cindy Lu @ 2025-06-05 7:34 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: jasowang, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Sun, Jun 1, 2025 at 6:51 PM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> On Sat, May 31, 2025 at 05:57:26PM +0800, Cindy Lu wrote:
> > The vhost now uses vhost_task and workers as a child of the owner thread.
> > While this aligns with containerization principles, it confuses some
> > legacy userspace applications, therefore, we are reintroducing kthread
> > API support.
> >
> > Add a new module parameter to allow userspace to select behavior
> > between using kthread and task.
> >
> > By default, this parameter is set to true (task mode). This means the
> > default behavior remains unchanged by this patch.
> >
> > Signed-off-by: Cindy Lu <lulu@redhat.com>
>
> So modparam is here but does nothing.
> This should be the last patch in the series, or squashed with 3/3.
>
> why is this inherit_owner but ioctl is fork_owner? is there
> a difference? If not
> can't the name be consistent with the ioctl? vhost_fork_owner?
>
>
sure, will fix this
Thanks
cindy
> > ---
> > drivers/vhost/vhost.c | 5 +++++
> > drivers/vhost/vhost.h | 10 ++++++++++
> > 2 files changed, 15 insertions(+)
> >
> > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> > index 3a5ebb973dba..240ba78b1e3f 100644
> > --- a/drivers/vhost/vhost.c
> > +++ b/drivers/vhost/vhost.c
> > @@ -41,6 +41,10 @@ static int max_iotlb_entries = 2048;
> > module_param(max_iotlb_entries, int, 0444);
> > MODULE_PARM_DESC(max_iotlb_entries,
> > "Maximum number of iotlb entries. (default: 2048)");
> > +bool inherit_owner_default = true;
> > +module_param(inherit_owner_default, bool, 0444);
> > +MODULE_PARM_DESC(inherit_owner_default,
> > + "Set task mode as the default(default: Y)");
> >
> > enum {
> > VHOST_MEMORY_F_LOG = 0x1,
> > @@ -552,6 +556,7 @@ void vhost_dev_init(struct vhost_dev *dev,
> > dev->byte_weight = byte_weight;
> > dev->use_worker = use_worker;
> > dev->msg_handler = msg_handler;
> > + dev->inherit_owner = inherit_owner_default;
> > init_waitqueue_head(&dev->wait);
> > INIT_LIST_HEAD(&dev->read_list);
> > INIT_LIST_HEAD(&dev->pending_list);
> > diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h
> > index bb75a292d50c..c1ff4a92b925 100644
> > --- a/drivers/vhost/vhost.h
> > +++ b/drivers/vhost/vhost.h
> > @@ -176,6 +176,16 @@ struct vhost_dev {
> > int byte_weight;
> > struct xarray worker_xa;
> > bool use_worker;
> > + /*
> > + * If inherit_owner is true we use vhost_tasks to create
> > + * the worker so all settings/limits like cgroups, NPROC,
> > + * scheduler, etc are inherited from the owner. If false,
> > + * we use kthreads and only attach to the same cgroups
> > + * as the owner for compat with older kernels.
> > + * here we use true as default value.
> > + * The default value is set by modparam inherit_owner_default
> > + */
> > + bool inherit_owner;
> > int (*msg_handler)(struct vhost_dev *dev, u32 asid,
> > struct vhost_iotlb_msg *msg);
> > };
> > --
> > 2.45.0
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread
2025-06-03 7:34 ` Simon Horman
@ 2025-06-05 7:35 ` Cindy Lu
0 siblings, 0 replies; 11+ messages in thread
From: Cindy Lu @ 2025-06-05 7:35 UTC (permalink / raw)
To: Simon Horman
Cc: jasowang, mst, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Tue, Jun 3, 2025 at 3:34 PM Simon Horman <horms@kernel.org> wrote:
>
> On Sat, May 31, 2025 at 05:57:26PM +0800, Cindy Lu wrote:
> > The vhost now uses vhost_task and workers as a child of the owner thread.
> > While this aligns with containerization principles, it confuses some
> > legacy userspace applications, therefore, we are reintroducing kthread
> > API support.
> >
> > Add a new module parameter to allow userspace to select behavior
> > between using kthread and task.
> >
> > By default, this parameter is set to true (task mode). This means the
> > default behavior remains unchanged by this patch.
> >
> > Signed-off-by: Cindy Lu <lulu@redhat.com>
> > ---
> > drivers/vhost/vhost.c | 5 +++++
> > drivers/vhost/vhost.h | 10 ++++++++++
> > 2 files changed, 15 insertions(+)
> >
> > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> > index 3a5ebb973dba..240ba78b1e3f 100644
> > --- a/drivers/vhost/vhost.c
> > +++ b/drivers/vhost/vhost.c
> > @@ -41,6 +41,10 @@ static int max_iotlb_entries = 2048;
> > module_param(max_iotlb_entries, int, 0444);
> > MODULE_PARM_DESC(max_iotlb_entries,
> > "Maximum number of iotlb entries. (default: 2048)");
> > +bool inherit_owner_default = true;
>
> Hi Cindy,
>
> I don't mean to block progress of this patchset.
> But it looks like inherit_owner_default can be static.
>
> Flagged by Sparse.
>
sure, will fix this
Thanks
cindy
> > +module_param(inherit_owner_default, bool, 0444);
> > +MODULE_PARM_DESC(inherit_owner_default,
> > + "Set task mode as the default(default: Y)");
>
> ...
>
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2025-06-05 7:36 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-05-31 9:57 [PATCH RESEND v10 0/3] vhost: Add support of kthread API Cindy Lu
2025-05-31 9:57 ` [PATCH RESEND v10 1/3] vhost: Add a new modparam to allow userspace select kthread Cindy Lu
2025-06-01 10:51 ` Michael S. Tsirkin
2025-06-05 7:34 ` Cindy Lu
2025-06-03 7:34 ` Simon Horman
2025-06-05 7:35 ` Cindy Lu
2025-05-31 9:57 ` [PATCH RESEND v10 2/3] vhost: Reintroduce kthread mode support in vhost Cindy Lu
2025-05-31 9:57 ` [PATCH RESEND v10 3/3] vhost: Add new UAPI to select kthread mode and KConfig to enable this IOCTL Cindy Lu
2025-06-01 10:49 ` Michael S. Tsirkin
2025-06-05 7:34 ` Cindy Lu
2025-06-04 6:00 ` [PATCH RESEND v10 0/3] vhost: Add support of kthread API Lei Yang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).