Add worker pointer to every virtqueue. Add routine to assing workers to virtqueues and call it after any worker creation
https://jira.sw.ru/browse/PSBM-139414 Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com> --- v4: Set vq->worker = NULL in vhost_vq_reset. This will fix both https://jira.sw.ru/browse/PSBM-142058 https://jira.sw.ru/browse/PSBM-142852 drivers/vhost/vhost.c | 14 ++++++++++++++ drivers/vhost/vhost.h | 2 ++ 2 files changed, 16 insertions(+) diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index d681352c9cbd..2c5d32ed7012 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -361,6 +361,7 @@ static void vhost_vq_reset(struct vhost_dev *dev, vq->iotlb = NULL; vhost_vring_call_reset(&vq->call_ctx); __vhost_vq_meta_reset(vq); + vq->worker = NULL; } static void vhost_worker_reset(struct vhost_worker *w) @@ -675,6 +676,17 @@ static int vhost_set_workers(struct vhost_dev *dev, int n) return ret; } +static void vhost_assign_workers(struct vhost_dev *dev) +{ + int i, j = 0; + + for (i = 0; i < dev->nvqs; i++) { + dev->vqs[i]->worker = &dev->workers[j]; + if (++j >= dev->nworkers) + j = 0; + } +} + /* Caller should have device mutex */ long vhost_dev_set_owner(struct vhost_dev *dev) { @@ -697,6 +709,7 @@ long vhost_dev_set_owner(struct vhost_dev *dev) if (err) goto err_worker; + vhost_assign_workers(dev); return 0; err_worker: vhost_cleanup_workers(dev); @@ -1895,6 +1908,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp) } r = vhost_set_workers(d, n); + vhost_assign_workers(d); break; default: r = -ENOIOCTLCMD; diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h index 634ea828cbba..9632f6501617 100644 --- a/drivers/vhost/vhost.h +++ b/drivers/vhost/vhost.h @@ -138,6 +138,8 @@ struct vhost_virtqueue { bool user_be; #endif u32 busyloop_timeout; + + struct vhost_worker *worker; }; struct vhost_msg_node { -- 2.31.1 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel