* [PATCH v9 1/4] vhost: Add a new parameter in vhost_dev to allow user select kthread
2025-04-21 2:44 [PATCH v9 0/4] vhost: Add support of kthread API Cindy Lu
@ 2025-04-21 2:44 ` Cindy Lu
2025-04-21 3:25 ` Jason Wang
2025-04-22 13:36 ` Stefano Garzarella
2025-04-21 2:44 ` [PATCH v9 2/4] vhost: Reintroduce kthread mode support in vhost Cindy Lu
` (2 subsequent siblings)
3 siblings, 2 replies; 28+ messages in thread
From: Cindy Lu @ 2025-04-21 2:44 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.
Introduce a new parameter to enable users to choose between kthread and
task mode.
By default, this parameter is set to true, so the default behavior
remains unchanged by this patch.
Signed-off-by: Cindy Lu <lulu@redhat.com>
---
drivers/vhost/vhost.c | 1 +
drivers/vhost/vhost.h | 9 +++++++++
2 files changed, 10 insertions(+)
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 63612faeab72..250dc43f1786 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -552,6 +552,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 = true;
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..19bb94922a0e 100644
--- a/drivers/vhost/vhost.h
+++ b/drivers/vhost/vhost.h
@@ -176,6 +176,15 @@ 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
+ */
+ 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] 28+ messages in thread* Re: [PATCH v9 1/4] vhost: Add a new parameter in vhost_dev to allow user select kthread
2025-04-21 2:44 ` [PATCH v9 1/4] vhost: Add a new parameter in vhost_dev to allow user select kthread Cindy Lu
@ 2025-04-21 3:25 ` Jason Wang
2025-04-22 13:36 ` Stefano Garzarella
1 sibling, 0 replies; 28+ messages in thread
From: Jason Wang @ 2025-04-21 3:25 UTC (permalink / raw)
To: Cindy Lu
Cc: mst, michael.christie, sgarzare, linux-kernel, virtualization,
netdev
On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> 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.
>
> Introduce a new parameter to enable users to choose between kthread and
> task mode.
>
> By default, this parameter is set to true, so the default behavior
> remains unchanged by this patch.
>
> Signed-off-by: Cindy Lu <lulu@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Thanks
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 1/4] vhost: Add a new parameter in vhost_dev to allow user select kthread
2025-04-21 2:44 ` [PATCH v9 1/4] vhost: Add a new parameter in vhost_dev to allow user select kthread Cindy Lu
2025-04-21 3:25 ` Jason Wang
@ 2025-04-22 13:36 ` Stefano Garzarella
1 sibling, 0 replies; 28+ messages in thread
From: Stefano Garzarella @ 2025-04-22 13:36 UTC (permalink / raw)
To: Cindy Lu
Cc: jasowang, mst, michael.christie, linux-kernel, virtualization,
netdev
On Mon, Apr 21, 2025 at 10:44:07AM +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.
>
>Introduce a new parameter to enable users to choose between kthread and
>task mode.
>
>By default, this parameter is set to true, so the default behavior
>remains unchanged by this patch.
>
>Signed-off-by: Cindy Lu <lulu@redhat.com>
>---
> drivers/vhost/vhost.c | 1 +
> drivers/vhost/vhost.h | 9 +++++++++
> 2 files changed, 10 insertions(+)
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
>
>diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
>index 63612faeab72..250dc43f1786 100644
>--- a/drivers/vhost/vhost.c
>+++ b/drivers/vhost/vhost.c
>@@ -552,6 +552,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 = true;
> 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..19bb94922a0e 100644
>--- a/drivers/vhost/vhost.h
>+++ b/drivers/vhost/vhost.h
>@@ -176,6 +176,15 @@ 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
>+ */
>+ 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] 28+ messages in thread
* [PATCH v9 2/4] vhost: Reintroduce kthread mode support in vhost
2025-04-21 2:44 [PATCH v9 0/4] vhost: Add support of kthread API Cindy Lu
2025-04-21 2:44 ` [PATCH v9 1/4] vhost: Add a new parameter in vhost_dev to allow user select kthread Cindy Lu
@ 2025-04-21 2:44 ` Cindy Lu
2025-04-21 3:39 ` Jason Wang
2025-04-21 10:58 ` Michael S. Tsirkin
2025-04-21 2:44 ` [PATCH v9 3/4] vhost: add VHOST_FORK_FROM_OWNER ioctl and validate inherit_owner Cindy Lu
2025-04-21 2:44 ` [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER Cindy Lu
3 siblings, 2 replies; 28+ messages in thread
From: Cindy Lu @ 2025-04-21 2:44 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 250dc43f1786..be97028a8baf 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>
@@ -242,7 +243,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);
}
}
@@ -388,6 +389,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;
@@ -582,6 +621,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)
{
@@ -627,7 +706,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);
}
@@ -650,42 +729,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 19bb94922a0e..af4b2f7d3b91 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] 28+ messages in thread* Re: [PATCH v9 2/4] vhost: Reintroduce kthread mode support in vhost
2025-04-21 2:44 ` [PATCH v9 2/4] vhost: Reintroduce kthread mode support in vhost Cindy Lu
@ 2025-04-21 3:39 ` Jason Wang
2025-04-21 10:59 ` Michael S. Tsirkin
2025-04-21 10:58 ` Michael S. Tsirkin
1 sibling, 1 reply; 28+ messages in thread
From: Jason Wang @ 2025-04-21 3:39 UTC (permalink / raw)
To: Cindy Lu
Cc: mst, michael.christie, sgarzare, linux-kernel, virtualization,
netdev
On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
>
> 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 250dc43f1786..be97028a8baf 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>
> @@ -242,7 +243,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);
> }
> }
>
> @@ -388,6 +389,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;
> @@ -582,6 +621,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;
I wonder if it's easier to re-introduce the flush that was used before
vhost kthread to avoid the tricks here. We can have flush ops for
example.
Thanks
^ permalink raw reply [flat|nested] 28+ messages in thread* Re: [PATCH v9 2/4] vhost: Reintroduce kthread mode support in vhost
2025-04-21 3:39 ` Jason Wang
@ 2025-04-21 10:59 ` Michael S. Tsirkin
0 siblings, 0 replies; 28+ messages in thread
From: Michael S. Tsirkin @ 2025-04-21 10:59 UTC (permalink / raw)
To: Jason Wang
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Mon, Apr 21, 2025 at 11:39:14AM +0800, Jason Wang wrote:
> On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> >
> > 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 250dc43f1786..be97028a8baf 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>
> > @@ -242,7 +243,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);
> > }
> > }
> >
> > @@ -388,6 +389,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;
> > @@ -582,6 +621,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;
>
> I wonder if it's easier to re-introduce the flush that was used before
> vhost kthread to avoid the tricks here. We can have flush ops for
> example.
>
> Thanks
Nah we do not need ops, __vhost_worker_flush is just an internal
function. Refactor it so we can call the part without the check.
--
MST
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 2/4] vhost: Reintroduce kthread mode support in vhost
2025-04-21 2:44 ` [PATCH v9 2/4] vhost: Reintroduce kthread mode support in vhost Cindy Lu
2025-04-21 3:39 ` Jason Wang
@ 2025-04-21 10:58 ` Michael S. Tsirkin
1 sibling, 0 replies; 28+ messages in thread
From: Michael S. Tsirkin @ 2025-04-21 10:58 UTC (permalink / raw)
To: Cindy Lu
Cc: jasowang, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Mon, Apr 21, 2025 at 10:44:08AM +0800, Cindy Lu wrote:
> 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 250dc43f1786..be97028a8baf 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>
> @@ -242,7 +243,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);
> }
> }
>
> @@ -388,6 +389,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;
> @@ -582,6 +621,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;
You mean this one?
if (!worker->attachment_cnt || worker->killed)
return;
Just introduce a variant of __vhost_worker_flush that
skips this check.
E.g.
Rename __vhost_worker_flush -> _vhost_worker_flush.
then rework:
static void _vhost_worker_flush(struct vhost_worker *worker)
{
struct vhost_flush_struct flush;
if (!worker->attachment_cnt || worker->killed)
return;
__vhost_worker_flush(worker);
}
> +
> + mutex_unlock(&worker->mutex);
> +
> + return attach.ret;
> +}
> +
> /* Caller should have device mutex */
> bool vhost_dev_has_owner(struct vhost_dev *dev)
> {
> @@ -627,7 +706,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);
> }
>
> @@ -650,42 +729,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 19bb94922a0e..af4b2f7d3b91 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 [flat|nested] 28+ messages in thread
* [PATCH v9 3/4] vhost: add VHOST_FORK_FROM_OWNER ioctl and validate inherit_owner
2025-04-21 2:44 [PATCH v9 0/4] vhost: Add support of kthread API Cindy Lu
2025-04-21 2:44 ` [PATCH v9 1/4] vhost: Add a new parameter in vhost_dev to allow user select kthread Cindy Lu
2025-04-21 2:44 ` [PATCH v9 2/4] vhost: Reintroduce kthread mode support in vhost Cindy Lu
@ 2025-04-21 2:44 ` Cindy Lu
2025-04-21 3:40 ` Jason Wang
2025-04-22 13:45 ` Stefano Garzarella
2025-04-21 2:44 ` [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER Cindy Lu
3 siblings, 2 replies; 28+ messages in thread
From: Cindy Lu @ 2025-04-21 2:44 UTC (permalink / raw)
To: lulu, jasowang, mst, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
Add a new UAPI to configure the vhost device to use the kthread mode.
The userspace application can use IOCTL VHOST_FORK_FROM_OWNER
to choose between owner and kthread mode if necessary.
This setting must be applied before VHOST_SET_OWNER, as the worker
will be created in the VHOST_SET_OWNER function.
In addition, the VHOST_NEW_WORKER requires the inherit_owner
setting to be true. So we need to add a check for this.
Signed-off-by: Cindy Lu <lulu@redhat.com>
---
drivers/vhost/vhost.c | 29 +++++++++++++++++++++++++++--
include/uapi/linux/vhost.h | 16 ++++++++++++++++
2 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index be97028a8baf..fb0c7fb43f78 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -1018,6 +1018,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;
@@ -1134,7 +1141,7 @@ void vhost_dev_reset_owner(struct vhost_dev *dev, struct vhost_iotlb *umem)
int i;
vhost_dev_cleanup(dev);
-
+ dev->inherit_owner = true;
dev->umem = umem;
/* We don't need VQ locks below since vhost_dev_cleanup makes sure
* VQs aren't running.
@@ -2287,7 +2294,25 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
r = vhost_dev_set_owner(d);
goto done;
}
-
+ 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;
+ }
/* 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 b95dd84eef2d..1ae0917bfeca 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] 28+ messages in thread* Re: [PATCH v9 3/4] vhost: add VHOST_FORK_FROM_OWNER ioctl and validate inherit_owner
2025-04-21 2:44 ` [PATCH v9 3/4] vhost: add VHOST_FORK_FROM_OWNER ioctl and validate inherit_owner Cindy Lu
@ 2025-04-21 3:40 ` Jason Wang
2025-04-22 13:45 ` Stefano Garzarella
1 sibling, 0 replies; 28+ messages in thread
From: Jason Wang @ 2025-04-21 3:40 UTC (permalink / raw)
To: Cindy Lu
Cc: mst, michael.christie, sgarzare, linux-kernel, virtualization,
netdev
On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
>
> Add a new UAPI to configure the vhost device to use the kthread mode.
> The userspace application can use IOCTL VHOST_FORK_FROM_OWNER
> to choose between owner and kthread mode if necessary.
> This setting must be applied before VHOST_SET_OWNER, as the worker
> will be created in the VHOST_SET_OWNER function.
>
> In addition, the VHOST_NEW_WORKER requires the inherit_owner
> setting to be true. So we need to add a check for this.
>
> Signed-off-by: Cindy Lu <lulu@redhat.com>
Acked-by: Jason Wang <jasowang@redhat.com>
Thanks
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 3/4] vhost: add VHOST_FORK_FROM_OWNER ioctl and validate inherit_owner
2025-04-21 2:44 ` [PATCH v9 3/4] vhost: add VHOST_FORK_FROM_OWNER ioctl and validate inherit_owner Cindy Lu
2025-04-21 3:40 ` Jason Wang
@ 2025-04-22 13:45 ` Stefano Garzarella
1 sibling, 0 replies; 28+ messages in thread
From: Stefano Garzarella @ 2025-04-22 13:45 UTC (permalink / raw)
To: Cindy Lu
Cc: jasowang, mst, michael.christie, linux-kernel, virtualization,
netdev
On Mon, Apr 21, 2025 at 10:44:09AM +0800, Cindy Lu wrote:
>Add a new UAPI to configure the vhost device to use the kthread mode.
>The userspace application can use IOCTL VHOST_FORK_FROM_OWNER
>to choose between owner and kthread mode if necessary.
>This setting must be applied before VHOST_SET_OWNER, as the worker
>will be created in the VHOST_SET_OWNER function.
>
>In addition, the VHOST_NEW_WORKER requires the inherit_owner
>setting to be true. So we need to add a check for this.
>
>Signed-off-by: Cindy Lu <lulu@redhat.com>
>---
> drivers/vhost/vhost.c | 29 +++++++++++++++++++++++++++--
> include/uapi/linux/vhost.h | 16 ++++++++++++++++
> 2 files changed, 43 insertions(+), 2 deletions(-)
>
>diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
>index be97028a8baf..fb0c7fb43f78 100644
>--- a/drivers/vhost/vhost.c
>+++ b/drivers/vhost/vhost.c
>@@ -1018,6 +1018,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;
>@@ -1134,7 +1141,7 @@ void vhost_dev_reset_owner(struct vhost_dev *dev, struct vhost_iotlb *umem)
> int i;
>
> vhost_dev_cleanup(dev);
>-
nit: I'd avoid removing this empty line, it helps while reading code.
>+ dev->inherit_owner = true;
> dev->umem = umem;
> /* We don't need VQ locks below since vhost_dev_cleanup makes sure
> * VQs aren't running.
>@@ -2287,7 +2294,25 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> r = vhost_dev_set_owner(d);
> goto done;
> }
>-
>+ 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;
>+ }
Ditto, an empty like should help to separate to the next step.
> /* 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 b95dd84eef2d..1ae0917bfeca 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.
Shoud we mention that this IOCTL is only supported if
CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is y?
>+ *
>+ * @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 [flat|nested] 28+ messages in thread
* [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-21 2:44 [PATCH v9 0/4] vhost: Add support of kthread API Cindy Lu
` (2 preceding siblings ...)
2025-04-21 2:44 ` [PATCH v9 3/4] vhost: add VHOST_FORK_FROM_OWNER ioctl and validate inherit_owner Cindy Lu
@ 2025-04-21 2:44 ` Cindy Lu
2025-04-21 3:45 ` Jason Wang
2025-04-22 13:50 ` Stefano Garzarella
3 siblings, 2 replies; 28+ messages in thread
From: Cindy Lu @ 2025-04-21 2:44 UTC (permalink / raw)
To: lulu, jasowang, mst, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
is disabled, and any attempt to use it will result in failure.
Signed-off-by: Cindy Lu <lulu@redhat.com>
---
drivers/vhost/Kconfig | 15 +++++++++++++++
drivers/vhost/vhost.c | 3 +++
2 files changed, 18 insertions(+)
diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
index 020d4fbb947c..bc8fadb06f98 100644
--- a/drivers/vhost/Kconfig
+++ b/drivers/vhost/Kconfig
@@ -96,3 +96,18 @@ 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, which allows
+ userspace applications to modify the thread mode for vhost devices.
+
+ By default, `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL` is set to `n`,
+ meaning the ioctl is disabled and any operation using this ioctl
+ will fail.
+ When the configuration is enabled (y), the ioctl becomes
+ available, allowing users to set the mode if needed.
+
+ If unsure, say "N".
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index fb0c7fb43f78..568e43cb54a9 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -2294,6 +2294,8 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
r = vhost_dev_set_owner(d);
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*/
@@ -2313,6 +2315,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
r = 0;
goto done;
}
+#endif
/* You must be the owner to do anything else */
r = vhost_dev_check_owner(d);
if (r)
--
2.45.0
^ permalink raw reply related [flat|nested] 28+ messages in thread* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-21 2:44 ` [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER Cindy Lu
@ 2025-04-21 3:45 ` Jason Wang
2025-04-21 3:46 ` Jason Wang
2025-04-22 13:50 ` Stefano Garzarella
1 sibling, 1 reply; 28+ messages in thread
From: Jason Wang @ 2025-04-21 3:45 UTC (permalink / raw)
To: Cindy Lu
Cc: mst, michael.christie, sgarzare, linux-kernel, virtualization,
netdev
On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
>
> Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> is disabled, and any attempt to use it will result in failure.
I think we need to describe why the default value was chosen to be false.
What's more, should we document the implications here?
inherit_owner was set to false: this means "legacy" userspace may
still be broken unless it can do VHOST_FORK_FROM_OWNER which is
impractical. Does this defeat the purpose of this series actually?
>
> Signed-off-by: Cindy Lu <lulu@redhat.com>
> ---
> drivers/vhost/Kconfig | 15 +++++++++++++++
> drivers/vhost/vhost.c | 3 +++
> 2 files changed, 18 insertions(+)
>
> diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
> index 020d4fbb947c..bc8fadb06f98 100644
> --- a/drivers/vhost/Kconfig
> +++ b/drivers/vhost/Kconfig
> @@ -96,3 +96,18 @@ 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, which allows
> + userspace applications to modify the thread mode for vhost devices.
> +
> + By default, `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL` is set to `n`,
> + meaning the ioctl is disabled and any operation using this ioctl
> + will fail.
> + When the configuration is enabled (y), the ioctl becomes
> + available, allowing users to set the mode if needed.
> +
> + If unsure, say "N".
> diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> index fb0c7fb43f78..568e43cb54a9 100644
> --- a/drivers/vhost/vhost.c
> +++ b/drivers/vhost/vhost.c
> @@ -2294,6 +2294,8 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> r = vhost_dev_set_owner(d);
> 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*/
> @@ -2313,6 +2315,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> r = 0;
> goto done;
> }
> +#endif
> /* You must be the owner to do anything else */
> r = vhost_dev_check_owner(d);
> if (r)
> --
> 2.45.0
>
Thanks
^ permalink raw reply [flat|nested] 28+ messages in thread* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-21 3:45 ` Jason Wang
@ 2025-04-21 3:46 ` Jason Wang
2025-04-29 3:39 ` Jason Wang
0 siblings, 1 reply; 28+ messages in thread
From: Jason Wang @ 2025-04-21 3:46 UTC (permalink / raw)
To: Cindy Lu
Cc: mst, michael.christie, sgarzare, linux-kernel, virtualization,
netdev
On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
>
> On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> >
> > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > is disabled, and any attempt to use it will result in failure.
>
> I think we need to describe why the default value was chosen to be false.
>
> What's more, should we document the implications here?
>
> inherit_owner was set to false: this means "legacy" userspace may
I meant "true" actually.
> still be broken unless it can do VHOST_FORK_FROM_OWNER which is
> impractical. Does this defeat the purpose of this series actually?
>
> >
> > Signed-off-by: Cindy Lu <lulu@redhat.com>
> > ---
> > drivers/vhost/Kconfig | 15 +++++++++++++++
> > drivers/vhost/vhost.c | 3 +++
> > 2 files changed, 18 insertions(+)
> >
> > diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
> > index 020d4fbb947c..bc8fadb06f98 100644
> > --- a/drivers/vhost/Kconfig
> > +++ b/drivers/vhost/Kconfig
> > @@ -96,3 +96,18 @@ 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, which allows
> > + userspace applications to modify the thread mode for vhost devices.
> > +
> > + By default, `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL` is set to `n`,
> > + meaning the ioctl is disabled and any operation using this ioctl
> > + will fail.
> > + When the configuration is enabled (y), the ioctl becomes
> > + available, allowing users to set the mode if needed.
> > +
> > + If unsure, say "N".
> > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> > index fb0c7fb43f78..568e43cb54a9 100644
> > --- a/drivers/vhost/vhost.c
> > +++ b/drivers/vhost/vhost.c
> > @@ -2294,6 +2294,8 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> > r = vhost_dev_set_owner(d);
> > 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*/
> > @@ -2313,6 +2315,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> > r = 0;
> > goto done;
> > }
> > +#endif
> > /* You must be the owner to do anything else */
> > r = vhost_dev_check_owner(d);
> > if (r)
> > --
> > 2.45.0
> >
>
> Thanks
Thanks
^ permalink raw reply [flat|nested] 28+ messages in thread* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-21 3:46 ` Jason Wang
@ 2025-04-29 3:39 ` Jason Wang
2025-04-29 10:55 ` Michael S. Tsirkin
0 siblings, 1 reply; 28+ messages in thread
From: Jason Wang @ 2025-04-29 3:39 UTC (permalink / raw)
To: mst
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
>
> On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> >
> > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > >
> > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > is disabled, and any attempt to use it will result in failure.
> >
> > I think we need to describe why the default value was chosen to be false.
> >
> > What's more, should we document the implications here?
> >
> > inherit_owner was set to false: this means "legacy" userspace may
>
> I meant "true" actually.
MIchael, I'd expect inherit_owner to be false. Otherwise legacy
applications need to be modified in order to get the behaviour
recovered which is an impossible taks.
Any idea on this?
Thanks
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-29 3:39 ` Jason Wang
@ 2025-04-29 10:55 ` Michael S. Tsirkin
2025-04-30 3:34 ` Jason Wang
0 siblings, 1 reply; 28+ messages in thread
From: Michael S. Tsirkin @ 2025-04-29 10:55 UTC (permalink / raw)
To: Jason Wang
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> >
> > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > >
> > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > >
> > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > is disabled, and any attempt to use it will result in failure.
> > >
> > > I think we need to describe why the default value was chosen to be false.
> > >
> > > What's more, should we document the implications here?
> > >
> > > inherit_owner was set to false: this means "legacy" userspace may
> >
> > I meant "true" actually.
>
> MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> applications need to be modified in order to get the behaviour
> recovered which is an impossible taks.
>
> Any idea on this?
>
> Thanks
At this point, as we changed the behaviour, we have two types of legacy applications
- ones expecting inherit_owner false
- ones expecting inherit_owner true
Whatever we do, some of these will have to be changed.
Given current
kernel has it as true, and given it is a cleaner behaviour that will
keep working when we disable CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL in 10
years, I think it's the better default.
If you want to change it transparently, look for ways to
distinguish between the two types.
The application in question is qemu, is it not?
I do not see how sticking an ioctl call into its source is such
a big deal, if this is what we want to do.
A bit of short term pain but we get clear maintainable semantics.
--
MST
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-29 10:55 ` Michael S. Tsirkin
@ 2025-04-30 3:34 ` Jason Wang
2025-04-30 9:27 ` Michael S. Tsirkin
0 siblings, 1 reply; 28+ messages in thread
From: Jason Wang @ 2025-04-30 3:34 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > >
> > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > >
> > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > >
> > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > is disabled, and any attempt to use it will result in failure.
> > > >
> > > > I think we need to describe why the default value was chosen to be false.
> > > >
> > > > What's more, should we document the implications here?
> > > >
> > > > inherit_owner was set to false: this means "legacy" userspace may
> > >
> > > I meant "true" actually.
> >
> > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > applications need to be modified in order to get the behaviour
> > recovered which is an impossible taks.
> >
> > Any idea on this?
> >
> > Thanks
>
> At this point, as we changed the behaviour, we have two types of legacy applications
> - ones expecting inherit_owner false
> - ones expecting inherit_owner true
Considering vhost has been used for more than a decade, I would expect
more will expect inhert_owner to be false.
>
> Whatever we do, some of these will have to be changed.
If we must choose one to break, I'd expect to break less.
> Given current
> kernel has it as true, and given it is a cleaner behaviour that will
> keep working when we disable CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL in 10
> years, I think it's the better default.
The problem is, if we set it to true and only an ioctl will bring the
old behavior back. Who will use this ioctl? We can't modify all legacy
applications.
> If you want to change it transparently, look for ways to
> distinguish between the two types.
>
> The application in question is qemu, is it not?
Looks not, it's the application or management layer that tries to set
the affinity to the owner of the vhost.
For example, if I start a testpmd + vhost_net and pinn testpmd runs on
cpu0. I will get half of the performance since vhost will contend with
cpu with testpmd.
> I do not see how sticking an ioctl call into its source is such
> a big deal, if this is what we want to do.
> A bit of short term pain but we get clear maintainable semantics.
What's more important, the way that introduces new fork behaviors
without a new uAPI is a bug. We need to fix that by introducing new
uAPI for the behaviour. This seems to be the short term pain instead
of introducing new uAPI for the old behaviour.
Thanks
>
> --
> MST
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-30 3:34 ` Jason Wang
@ 2025-04-30 9:27 ` Michael S. Tsirkin
2025-05-13 4:08 ` Jason Wang
0 siblings, 1 reply; 28+ messages in thread
From: Michael S. Tsirkin @ 2025-04-30 9:27 UTC (permalink / raw)
To: Jason Wang
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Wed, Apr 30, 2025 at 11:34:49AM +0800, Jason Wang wrote:
> On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> >
> > On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > > >
> > > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > >
> > > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > > >
> > > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > > is disabled, and any attempt to use it will result in failure.
> > > > >
> > > > > I think we need to describe why the default value was chosen to be false.
> > > > >
> > > > > What's more, should we document the implications here?
> > > > >
> > > > > inherit_owner was set to false: this means "legacy" userspace may
> > > >
> > > > I meant "true" actually.
> > >
> > > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > > applications need to be modified in order to get the behaviour
> > > recovered which is an impossible taks.
> > >
> > > Any idea on this?
> > >
> > > Thanks
So, let's say we had a modparam? Enough for this customer?
WDYT?
--
MST
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-30 9:27 ` Michael S. Tsirkin
@ 2025-05-13 4:08 ` Jason Wang
2025-05-13 7:08 ` Michael S. Tsirkin
0 siblings, 1 reply; 28+ messages in thread
From: Jason Wang @ 2025-05-13 4:08 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Wed, Apr 30, 2025 at 5:27 PM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> On Wed, Apr 30, 2025 at 11:34:49AM +0800, Jason Wang wrote:
> > On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > >
> > > On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > > > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > >
> > > > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > >
> > > > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > > > >
> > > > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > > > is disabled, and any attempt to use it will result in failure.
> > > > > >
> > > > > > I think we need to describe why the default value was chosen to be false.
> > > > > >
> > > > > > What's more, should we document the implications here?
> > > > > >
> > > > > > inherit_owner was set to false: this means "legacy" userspace may
> > > > >
> > > > > I meant "true" actually.
> > > >
> > > > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > > > applications need to be modified in order to get the behaviour
> > > > recovered which is an impossible taks.
> > > >
> > > > Any idea on this?
> > > >
> > > > Thanks
>
> So, let's say we had a modparam? Enough for this customer?
> WDYT?
Just to make sure I understand the proposal.
Did you mean a module parameter like "inherit_owner_by_default"? I
think it would be fine if we make it false by default.
Thanks
>
> --
> MST
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-05-13 4:08 ` Jason Wang
@ 2025-05-13 7:08 ` Michael S. Tsirkin
2025-05-14 2:52 ` Jason Wang
0 siblings, 1 reply; 28+ messages in thread
From: Michael S. Tsirkin @ 2025-05-13 7:08 UTC (permalink / raw)
To: Jason Wang
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Tue, May 13, 2025 at 12:08:51PM +0800, Jason Wang wrote:
> On Wed, Apr 30, 2025 at 5:27 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> >
> > On Wed, Apr 30, 2025 at 11:34:49AM +0800, Jason Wang wrote:
> > > On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > >
> > > > On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > > > > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > >
> > > > > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > >
> > > > > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > > > > >
> > > > > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > > > > is disabled, and any attempt to use it will result in failure.
> > > > > > >
> > > > > > > I think we need to describe why the default value was chosen to be false.
> > > > > > >
> > > > > > > What's more, should we document the implications here?
> > > > > > >
> > > > > > > inherit_owner was set to false: this means "legacy" userspace may
> > > > > >
> > > > > > I meant "true" actually.
> > > > >
> > > > > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > > > > applications need to be modified in order to get the behaviour
> > > > > recovered which is an impossible taks.
> > > > >
> > > > > Any idea on this?
> > > > >
> > > > > Thanks
> >
> > So, let's say we had a modparam? Enough for this customer?
> > WDYT?
>
> Just to make sure I understand the proposal.
>
> Did you mean a module parameter like "inherit_owner_by_default"? I
> think it would be fine if we make it false by default.
>
> Thanks
I think we should keep it true by default, changing the default
risks regressing what we already fixes. The specific customer can
flip the modparam and be happy.
> >
> > --
> > MST
> >
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-05-13 7:08 ` Michael S. Tsirkin
@ 2025-05-14 2:52 ` Jason Wang
2025-05-15 6:05 ` Cindy Lu
2025-05-15 6:14 ` Michael S. Tsirkin
0 siblings, 2 replies; 28+ messages in thread
From: Jason Wang @ 2025-05-14 2:52 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Tue, May 13, 2025 at 3:09 PM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> On Tue, May 13, 2025 at 12:08:51PM +0800, Jason Wang wrote:
> > On Wed, Apr 30, 2025 at 5:27 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > >
> > > On Wed, Apr 30, 2025 at 11:34:49AM +0800, Jason Wang wrote:
> > > > On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > >
> > > > > On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > > > > > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > >
> > > > > > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > >
> > > > > > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > > > > > >
> > > > > > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > > > > > is disabled, and any attempt to use it will result in failure.
> > > > > > > >
> > > > > > > > I think we need to describe why the default value was chosen to be false.
> > > > > > > >
> > > > > > > > What's more, should we document the implications here?
> > > > > > > >
> > > > > > > > inherit_owner was set to false: this means "legacy" userspace may
> > > > > > >
> > > > > > > I meant "true" actually.
> > > > > >
> > > > > > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > > > > > applications need to be modified in order to get the behaviour
> > > > > > recovered which is an impossible taks.
> > > > > >
> > > > > > Any idea on this?
> > > > > >
> > > > > > Thanks
> > >
> > > So, let's say we had a modparam? Enough for this customer?
> > > WDYT?
> >
> > Just to make sure I understand the proposal.
> >
> > Did you mean a module parameter like "inherit_owner_by_default"? I
> > think it would be fine if we make it false by default.
> >
> > Thanks
>
> I think we should keep it true by default, changing the default
> risks regressing what we already fixes.
I think it's not a regression since it comes since the day vhost is
introduced. To my understanding the real regression is the user space
noticeable behaviour changes introduced by vhost thread.
> The specific customer can
> flip the modparam and be happy.
If you stick to the false as default, I'm fine.
Thanks
>
> > >
> > > --
> > > MST
> > >
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-05-14 2:52 ` Jason Wang
@ 2025-05-15 6:05 ` Cindy Lu
2025-05-15 6:14 ` Michael S. Tsirkin
1 sibling, 0 replies; 28+ messages in thread
From: Cindy Lu @ 2025-05-15 6:05 UTC (permalink / raw)
To: Jason Wang
Cc: Michael S. Tsirkin, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
Thank you for the comments; I will prepare a new patch version.
Thanks,
Cindy
On Wed, May 14, 2025 at 10:53 AM Jason Wang <jasowang@redhat.com> wrote:
>
> On Tue, May 13, 2025 at 3:09 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> >
> > On Tue, May 13, 2025 at 12:08:51PM +0800, Jason Wang wrote:
> > > On Wed, Apr 30, 2025 at 5:27 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > >
> > > > On Wed, Apr 30, 2025 at 11:34:49AM +0800, Jason Wang wrote:
> > > > > On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > > >
> > > > > > On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > > > > > > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > >
> > > > > > > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > > >
> > > > > > > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > > > > > > >
> > > > > > > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > > > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > > > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > > > > > > is disabled, and any attempt to use it will result in failure.
> > > > > > > > >
> > > > > > > > > I think we need to describe why the default value was chosen to be false.
> > > > > > > > >
> > > > > > > > > What's more, should we document the implications here?
> > > > > > > > >
> > > > > > > > > inherit_owner was set to false: this means "legacy" userspace may
> > > > > > > >
> > > > > > > > I meant "true" actually.
> > > > > > >
> > > > > > > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > > > > > > applications need to be modified in order to get the behaviour
> > > > > > > recovered which is an impossible taks.
> > > > > > >
> > > > > > > Any idea on this?
> > > > > > >
> > > > > > > Thanks
> > > >
> > > > So, let's say we had a modparam? Enough for this customer?
> > > > WDYT?
> > >
> > > Just to make sure I understand the proposal.
> > >
> > > Did you mean a module parameter like "inherit_owner_by_default"? I
> > > think it would be fine if we make it false by default.
> > >
> > > Thanks
> >
> > I think we should keep it true by default, changing the default
> > risks regressing what we already fixes.
>
> I think it's not a regression since it comes since the day vhost is
> introduced. To my understanding the real regression is the user space
> noticeable behaviour changes introduced by vhost thread.
>
> > The specific customer can
> > flip the modparam and be happy.
>
> If you stick to the false as default, I'm fine.
>
> Thanks
>
> >
> > > >
> > > > --
> > > > MST
> > > >
> >
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-05-14 2:52 ` Jason Wang
2025-05-15 6:05 ` Cindy Lu
@ 2025-05-15 6:14 ` Michael S. Tsirkin
2025-05-16 1:31 ` Jason Wang
1 sibling, 1 reply; 28+ messages in thread
From: Michael S. Tsirkin @ 2025-05-15 6:14 UTC (permalink / raw)
To: Jason Wang
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Wed, May 14, 2025 at 10:52:58AM +0800, Jason Wang wrote:
> On Tue, May 13, 2025 at 3:09 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> >
> > On Tue, May 13, 2025 at 12:08:51PM +0800, Jason Wang wrote:
> > > On Wed, Apr 30, 2025 at 5:27 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > >
> > > > On Wed, Apr 30, 2025 at 11:34:49AM +0800, Jason Wang wrote:
> > > > > On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > > >
> > > > > > On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > > > > > > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > >
> > > > > > > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > > >
> > > > > > > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > > > > > > >
> > > > > > > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > > > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > > > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > > > > > > is disabled, and any attempt to use it will result in failure.
> > > > > > > > >
> > > > > > > > > I think we need to describe why the default value was chosen to be false.
> > > > > > > > >
> > > > > > > > > What's more, should we document the implications here?
> > > > > > > > >
> > > > > > > > > inherit_owner was set to false: this means "legacy" userspace may
> > > > > > > >
> > > > > > > > I meant "true" actually.
> > > > > > >
> > > > > > > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > > > > > > applications need to be modified in order to get the behaviour
> > > > > > > recovered which is an impossible taks.
> > > > > > >
> > > > > > > Any idea on this?
> > > > > > >
> > > > > > > Thanks
> > > >
> > > > So, let's say we had a modparam? Enough for this customer?
> > > > WDYT?
> > >
> > > Just to make sure I understand the proposal.
> > >
> > > Did you mean a module parameter like "inherit_owner_by_default"? I
> > > think it would be fine if we make it false by default.
> > >
> > > Thanks
> >
> > I think we should keep it true by default, changing the default
> > risks regressing what we already fixes.
>
> I think it's not a regression since it comes since the day vhost is
> introduced. To my understanding the real regression is the user space
> noticeable behaviour changes introduced by vhost thread.
>
> > The specific customer can
> > flip the modparam and be happy.
>
> If you stick to the false as default, I'm fine.
>
> Thanks
That would be yet another behaviour change.
I think one was enough, don't you think?
> >
> > > >
> > > > --
> > > > MST
> > > >
> >
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-05-15 6:14 ` Michael S. Tsirkin
@ 2025-05-16 1:31 ` Jason Wang
2025-05-16 10:39 ` Michael S. Tsirkin
0 siblings, 1 reply; 28+ messages in thread
From: Jason Wang @ 2025-05-16 1:31 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Thu, May 15, 2025 at 2:14 PM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> On Wed, May 14, 2025 at 10:52:58AM +0800, Jason Wang wrote:
> > On Tue, May 13, 2025 at 3:09 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > >
> > > On Tue, May 13, 2025 at 12:08:51PM +0800, Jason Wang wrote:
> > > > On Wed, Apr 30, 2025 at 5:27 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > >
> > > > > On Wed, Apr 30, 2025 at 11:34:49AM +0800, Jason Wang wrote:
> > > > > > On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > > > >
> > > > > > > On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > > > > > > > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > > >
> > > > > > > > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > > > >
> > > > > > > > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > > > > > > > >
> > > > > > > > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > > > > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > > > > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > > > > > > > is disabled, and any attempt to use it will result in failure.
> > > > > > > > > >
> > > > > > > > > > I think we need to describe why the default value was chosen to be false.
> > > > > > > > > >
> > > > > > > > > > What's more, should we document the implications here?
> > > > > > > > > >
> > > > > > > > > > inherit_owner was set to false: this means "legacy" userspace may
> > > > > > > > >
> > > > > > > > > I meant "true" actually.
> > > > > > > >
> > > > > > > > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > > > > > > > applications need to be modified in order to get the behaviour
> > > > > > > > recovered which is an impossible taks.
> > > > > > > >
> > > > > > > > Any idea on this?
> > > > > > > >
> > > > > > > > Thanks
> > > > >
> > > > > So, let's say we had a modparam? Enough for this customer?
> > > > > WDYT?
> > > >
> > > > Just to make sure I understand the proposal.
> > > >
> > > > Did you mean a module parameter like "inherit_owner_by_default"? I
> > > > think it would be fine if we make it false by default.
> > > >
> > > > Thanks
> > >
> > > I think we should keep it true by default, changing the default
> > > risks regressing what we already fixes.
> >
> > I think it's not a regression since it comes since the day vhost is
> > introduced. To my understanding the real regression is the user space
> > noticeable behaviour changes introduced by vhost thread.
> >
> > > The specific customer can
> > > flip the modparam and be happy.
> >
> > If you stick to the false as default, I'm fine.
> >
> > Thanks
>
> That would be yet another behaviour change.
Back to the original behaviour.
> I think one was enough, don't you think?
I think such kind of change is unavoidable if we want to fix the
usersapce behaviour change.
Thanks
>
>
> > >
> > > > >
> > > > > --
> > > > > MST
> > > > >
> > >
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-05-16 1:31 ` Jason Wang
@ 2025-05-16 10:39 ` Michael S. Tsirkin
2025-05-19 7:34 ` Jason Wang
0 siblings, 1 reply; 28+ messages in thread
From: Michael S. Tsirkin @ 2025-05-16 10:39 UTC (permalink / raw)
To: Jason Wang
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Fri, May 16, 2025 at 09:31:42AM +0800, Jason Wang wrote:
> On Thu, May 15, 2025 at 2:14 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> >
> > On Wed, May 14, 2025 at 10:52:58AM +0800, Jason Wang wrote:
> > > On Tue, May 13, 2025 at 3:09 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > >
> > > > On Tue, May 13, 2025 at 12:08:51PM +0800, Jason Wang wrote:
> > > > > On Wed, Apr 30, 2025 at 5:27 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > > >
> > > > > > On Wed, Apr 30, 2025 at 11:34:49AM +0800, Jason Wang wrote:
> > > > > > > On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > > > > >
> > > > > > > > On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > > > > > > > > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > > > >
> > > > > > > > > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > > > > >
> > > > > > > > > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > > > > > > > > >
> > > > > > > > > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > > > > > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > > > > > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > > > > > > > > is disabled, and any attempt to use it will result in failure.
> > > > > > > > > > >
> > > > > > > > > > > I think we need to describe why the default value was chosen to be false.
> > > > > > > > > > >
> > > > > > > > > > > What's more, should we document the implications here?
> > > > > > > > > > >
> > > > > > > > > > > inherit_owner was set to false: this means "legacy" userspace may
> > > > > > > > > >
> > > > > > > > > > I meant "true" actually.
> > > > > > > > >
> > > > > > > > > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > > > > > > > > applications need to be modified in order to get the behaviour
> > > > > > > > > recovered which is an impossible taks.
> > > > > > > > >
> > > > > > > > > Any idea on this?
> > > > > > > > >
> > > > > > > > > Thanks
> > > > > >
> > > > > > So, let's say we had a modparam? Enough for this customer?
> > > > > > WDYT?
> > > > >
> > > > > Just to make sure I understand the proposal.
> > > > >
> > > > > Did you mean a module parameter like "inherit_owner_by_default"? I
> > > > > think it would be fine if we make it false by default.
> > > > >
> > > > > Thanks
> > > >
> > > > I think we should keep it true by default, changing the default
> > > > risks regressing what we already fixes.
> > >
> > > I think it's not a regression since it comes since the day vhost is
> > > introduced. To my understanding the real regression is the user space
> > > noticeable behaviour changes introduced by vhost thread.
> > >
> > > > The specific customer can
> > > > flip the modparam and be happy.
> > >
> > > If you stick to the false as default, I'm fine.
> > >
> > > Thanks
> >
> > That would be yet another behaviour change.
>
> Back to the original behaviour.
yes but the original was also a bugfix.
> > I think one was enough, don't you think?
>
> I think such kind of change is unavoidable if we want to fix the
> usersapce behaviour change.
>
> Thanks
I feel it is too late to "fix". the new behaviour is generally ok, and I
feel the right thing so to give management control knobs do pick the
desired behaviour.
And really modparam is wrong here because different userspace
can have different requirements, and in ~10 years I want to see us
disable the legacy behaviour altogether.
But given your time constraints, a modparam knob as a quick workaround
for the specific customer is kind of not very terrible.
> >
> >
> > > >
> > > > > >
> > > > > > --
> > > > > > MST
> > > > > >
> > > >
> >
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-05-16 10:39 ` Michael S. Tsirkin
@ 2025-05-19 7:34 ` Jason Wang
0 siblings, 0 replies; 28+ messages in thread
From: Jason Wang @ 2025-05-19 7:34 UTC (permalink / raw)
To: Michael S. Tsirkin
Cc: Cindy Lu, michael.christie, sgarzare, linux-kernel,
virtualization, netdev
On Fri, May 16, 2025 at 6:39 PM Michael S. Tsirkin <mst@redhat.com> wrote:
>
> On Fri, May 16, 2025 at 09:31:42AM +0800, Jason Wang wrote:
> > On Thu, May 15, 2025 at 2:14 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > >
> > > On Wed, May 14, 2025 at 10:52:58AM +0800, Jason Wang wrote:
> > > > On Tue, May 13, 2025 at 3:09 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > >
> > > > > On Tue, May 13, 2025 at 12:08:51PM +0800, Jason Wang wrote:
> > > > > > On Wed, Apr 30, 2025 at 5:27 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > > > >
> > > > > > > On Wed, Apr 30, 2025 at 11:34:49AM +0800, Jason Wang wrote:
> > > > > > > > On Tue, Apr 29, 2025 at 6:56 PM Michael S. Tsirkin <mst@redhat.com> wrote:
> > > > > > > > >
> > > > > > > > > On Tue, Apr 29, 2025 at 11:39:37AM +0800, Jason Wang wrote:
> > > > > > > > > > On Mon, Apr 21, 2025 at 11:46 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > > > > >
> > > > > > > > > > > On Mon, Apr 21, 2025 at 11:45 AM Jason Wang <jasowang@redhat.com> wrote:
> > > > > > > > > > > >
> > > > > > > > > > > > On Mon, Apr 21, 2025 at 10:45 AM Cindy Lu <lulu@redhat.com> wrote:
> > > > > > > > > > > > >
> > > > > > > > > > > > > Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> > > > > > > > > > > > > to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> > > > > > > > > > > > > When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> > > > > > > > > > > > > is disabled, and any attempt to use it will result in failure.
> > > > > > > > > > > >
> > > > > > > > > > > > I think we need to describe why the default value was chosen to be false.
> > > > > > > > > > > >
> > > > > > > > > > > > What's more, should we document the implications here?
> > > > > > > > > > > >
> > > > > > > > > > > > inherit_owner was set to false: this means "legacy" userspace may
> > > > > > > > > > >
> > > > > > > > > > > I meant "true" actually.
> > > > > > > > > >
> > > > > > > > > > MIchael, I'd expect inherit_owner to be false. Otherwise legacy
> > > > > > > > > > applications need to be modified in order to get the behaviour
> > > > > > > > > > recovered which is an impossible taks.
> > > > > > > > > >
> > > > > > > > > > Any idea on this?
> > > > > > > > > >
> > > > > > > > > > Thanks
> > > > > > >
> > > > > > > So, let's say we had a modparam? Enough for this customer?
> > > > > > > WDYT?
> > > > > >
> > > > > > Just to make sure I understand the proposal.
> > > > > >
> > > > > > Did you mean a module parameter like "inherit_owner_by_default"? I
> > > > > > think it would be fine if we make it false by default.
> > > > > >
> > > > > > Thanks
> > > > >
> > > > > I think we should keep it true by default, changing the default
> > > > > risks regressing what we already fixes.
> > > >
> > > > I think it's not a regression since it comes since the day vhost is
> > > > introduced. To my understanding the real regression is the user space
> > > > noticeable behaviour changes introduced by vhost thread.
> > > >
> > > > > The specific customer can
> > > > > flip the modparam and be happy.
> > > >
> > > > If you stick to the false as default, I'm fine.
> > > >
> > > > Thanks
> > >
> > > That would be yet another behaviour change.
> >
> > Back to the original behaviour.
>
> yes but the original was also a bugfix.
>
> > > I think one was enough, don't you think?
> >
> > I think such kind of change is unavoidable if we want to fix the
> > usersapce behaviour change.
> >
> > Thanks
>
> I feel it is too late to "fix". the new behaviour is generally ok, and I
> feel the right thing so to give management control knobs do pick the
> desired behaviour.
> And really modparam is wrong here because different userspace
> can have different requirements, and in ~10 years I want to see us
> disable the legacy behaviour altogether.
> But given your time constraints, a modparam knob as a quick workaround
> for the specific customer is kind of not very terrible.
>
Ok, that makes sense.
Thanks
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-21 2:44 ` [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER Cindy Lu
2025-04-21 3:45 ` Jason Wang
@ 2025-04-22 13:50 ` Stefano Garzarella
2025-04-23 1:01 ` Cindy Lu
1 sibling, 1 reply; 28+ messages in thread
From: Stefano Garzarella @ 2025-04-22 13:50 UTC (permalink / raw)
To: Cindy Lu
Cc: jasowang, mst, michael.christie, linux-kernel, virtualization,
netdev
On Mon, Apr 21, 2025 at 10:44:10AM +0800, Cindy Lu wrote:
>Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
>to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
>When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
>is disabled, and any attempt to use it will result in failure.
>
>Signed-off-by: Cindy Lu <lulu@redhat.com>
>---
> drivers/vhost/Kconfig | 15 +++++++++++++++
> drivers/vhost/vhost.c | 3 +++
> 2 files changed, 18 insertions(+)
>
>diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
>index 020d4fbb947c..bc8fadb06f98 100644
>--- a/drivers/vhost/Kconfig
>+++ b/drivers/vhost/Kconfig
>@@ -96,3 +96,18 @@ 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, which allows
>+ userspace applications to modify the thread mode for vhost devices.
>+
>+ By default, `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL` is set to `n`,
>+ meaning the ioctl is disabled and any operation using this ioctl
>+ will fail.
>+ When the configuration is enabled (y), the ioctl becomes
>+ available, allowing users to set the mode if needed.
I think I already pointed out, but here there is a mix of tabs and
spaces that IMHO we should fix.
>+
>+ If unsure, say "N".
>diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
>index fb0c7fb43f78..568e43cb54a9 100644
>--- a/drivers/vhost/vhost.c
>+++ b/drivers/vhost/vhost.c
>@@ -2294,6 +2294,8 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> r = vhost_dev_set_owner(d);
> goto done;
> }
>+
>+#ifdef CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL
As I mentioned in the previous version, IMO this patch should be merged
with the previous patch. I don't think it is good for bisection to have
a commit with an IOCTL supported in any case and in the next commit
instead supported only through a config.
Maybe I'm missing something, but what's the point of having a separate
patch for this?
Thanks,
Stefano
> if (ioctl == VHOST_FORK_FROM_OWNER) {
> u8 inherit_owner;
> /*inherit_owner can only be modified before owner is set*/
>@@ -2313,6 +2315,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> r = 0;
> goto done;
> }
>+#endif
> /* You must be the owner to do anything else */
> r = vhost_dev_check_owner(d);
> if (r)
>--
>2.45.0
>
^ permalink raw reply [flat|nested] 28+ messages in thread* Re: [PATCH v9 4/4] vhost: Add a KConfig knob to enable IOCTL VHOST_FORK_FROM_OWNER
2025-04-22 13:50 ` Stefano Garzarella
@ 2025-04-23 1:01 ` Cindy Lu
0 siblings, 0 replies; 28+ messages in thread
From: Cindy Lu @ 2025-04-23 1:01 UTC (permalink / raw)
To: Stefano Garzarella
Cc: jasowang, mst, michael.christie, linux-kernel, virtualization,
netdev
On Tue, Apr 22, 2025 at 9:50 PM Stefano Garzarella <sgarzare@redhat.com> wrote:
>
> On Mon, Apr 21, 2025 at 10:44:10AM +0800, Cindy Lu wrote:
> >Introduce a new config knob `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL`,
> >to control the availability of the `VHOST_FORK_FROM_OWNER` ioctl.
> >When CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL is set to n, the ioctl
> >is disabled, and any attempt to use it will result in failure.
> >
> >Signed-off-by: Cindy Lu <lulu@redhat.com>
> >---
> > drivers/vhost/Kconfig | 15 +++++++++++++++
> > drivers/vhost/vhost.c | 3 +++
> > 2 files changed, 18 insertions(+)
> >
> >diff --git a/drivers/vhost/Kconfig b/drivers/vhost/Kconfig
> >index 020d4fbb947c..bc8fadb06f98 100644
> >--- a/drivers/vhost/Kconfig
> >+++ b/drivers/vhost/Kconfig
> >@@ -96,3 +96,18 @@ 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, which allows
> >+ userspace applications to modify the thread mode for vhost devices.
> >+
> >+ By default, `CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL` is set to `n`,
> >+ meaning the ioctl is disabled and any operation using this ioctl
> >+ will fail.
> >+ When the configuration is enabled (y), the ioctl becomes
> >+ available, allowing users to set the mode if needed.
>
> I think I already pointed out, but here there is a mix of tabs and
> spaces that IMHO we should fix.
>
Sorry, I missed this comment while preparing the patch; I’ll fix it.
> >+
> >+ If unsure, say "N".
> >diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
> >index fb0c7fb43f78..568e43cb54a9 100644
> >--- a/drivers/vhost/vhost.c
> >+++ b/drivers/vhost/vhost.c
> >@@ -2294,6 +2294,8 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> > r = vhost_dev_set_owner(d);
> > goto done;
> > }
> >+
> >+#ifdef CONFIG_VHOST_ENABLE_FORK_OWNER_IOCTL
>
> As I mentioned in the previous version, IMO this patch should be merged
> with the previous patch. I don't think it is good for bisection to have
> a commit with an IOCTL supported in any case and in the next commit
> instead supported only through a config.
>
> Maybe I'm missing something, but what's the point of having a separate
> patch for this?
>
> Thanks,
> Stefano
>
will fix this
thanks
cindy
> > if (ioctl == VHOST_FORK_FROM_OWNER) {
> > u8 inherit_owner;
> > /*inherit_owner can only be modified before owner is set*/
> >@@ -2313,6 +2315,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
> > r = 0;
> > goto done;
> > }
> >+#endif
> > /* You must be the owner to do anything else */
> > r = vhost_dev_check_owner(d);
> > if (r)
> >--
> >2.45.0
> >
>
^ permalink raw reply [flat|nested] 28+ messages in thread