Add worker pointer to every virtqueue. Add routine to assing workers to virtqueues and call it after any worker creation Signed-off-by: Andrey Zhadchenko <andrey.zhadchenko@xxxxxxxxxxxxx> --- 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 09e3c4b1bd05..d80831d21fba 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -353,6 +353,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) @@ -667,6 +668,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) { @@ -689,6 +701,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); @@ -1907,6 +1920,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 fc365b08fc38..b9a10c85b298 100644 --- a/drivers/vhost/vhost.h +++ b/drivers/vhost/vhost.h @@ -137,6 +137,8 @@ struct vhost_virtqueue { bool user_be; #endif u32 busyloop_timeout; + + struct vhost_worker *worker; }; struct vhost_msg_node { -- 2.31.1