vhost: add vhost_worker pointer to vhost_virtqueue
This patchset allows userspace to map vqs to different workers. This patch adds a worker pointer to the vq so in later patches in this set we can queue/flush specific vqs and their workers. Signed-off-by: Mike Christie <michael.christie@oracle.com> Message-Id: <20230626232307.97930-4-michael.christie@oracle.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
c011bb669d
commit
737bdb643c
@ -333,6 +333,7 @@ static void vhost_vq_reset(struct vhost_dev *dev,
|
||||
vq->busyloop_timeout = 0;
|
||||
vq->umem = NULL;
|
||||
vq->iotlb = NULL;
|
||||
vq->worker = NULL;
|
||||
vhost_vring_call_reset(&vq->call_ctx);
|
||||
__vhost_vq_meta_reset(vq);
|
||||
}
|
||||
@ -545,7 +546,7 @@ static void vhost_worker_free(struct vhost_dev *dev)
|
||||
dev->worker = NULL;
|
||||
}
|
||||
|
||||
static int vhost_worker_create(struct vhost_dev *dev)
|
||||
static struct vhost_worker *vhost_worker_create(struct vhost_dev *dev)
|
||||
{
|
||||
struct vhost_worker *worker;
|
||||
struct vhost_task *vtsk;
|
||||
@ -553,7 +554,7 @@ static int vhost_worker_create(struct vhost_dev *dev)
|
||||
|
||||
worker = kzalloc(sizeof(*worker), GFP_KERNEL_ACCOUNT);
|
||||
if (!worker)
|
||||
return -ENOMEM;
|
||||
return NULL;
|
||||
|
||||
snprintf(name, sizeof(name), "vhost-%d", current->pid);
|
||||
|
||||
@ -572,17 +573,18 @@ static int vhost_worker_create(struct vhost_dev *dev)
|
||||
dev->worker = worker;
|
||||
|
||||
vhost_task_start(vtsk);
|
||||
return 0;
|
||||
return worker;
|
||||
|
||||
free_worker:
|
||||
kfree(worker);
|
||||
return -ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Caller should have device mutex */
|
||||
long vhost_dev_set_owner(struct vhost_dev *dev)
|
||||
{
|
||||
int err;
|
||||
struct vhost_worker *worker;
|
||||
int err, i;
|
||||
|
||||
/* Is there an owner already? */
|
||||
if (vhost_dev_has_owner(dev)) {
|
||||
@ -603,9 +605,14 @@ long vhost_dev_set_owner(struct vhost_dev *dev)
|
||||
* below since we don't have to worry about vsock queueing
|
||||
* while we free the worker.
|
||||
*/
|
||||
err = vhost_worker_create(dev);
|
||||
if (err)
|
||||
worker = vhost_worker_create(dev);
|
||||
if (!worker) {
|
||||
err = -ENOMEM;
|
||||
goto err_worker;
|
||||
}
|
||||
|
||||
for (i = 0; i < dev->nvqs; i++)
|
||||
dev->vqs[i]->worker = worker;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -74,6 +74,7 @@ struct vhost_vring_call {
|
||||
/* The virtqueue structure describes a queue attached to a device. */
|
||||
struct vhost_virtqueue {
|
||||
struct vhost_dev *dev;
|
||||
struct vhost_worker *worker;
|
||||
|
||||
/* The actual ring of buffers. */
|
||||
struct mutex mutex;
|
||||
|
Loading…
Reference in New Issue
Block a user