Commit 737bdb64 authored by Mike Christie's avatar Mike Christie Committed by Michael S. Tsirkin
Browse files

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: default avatarMike Christie <michael.christie@oracle.com>
Message-Id: <20230626232307.97930-4-michael.christie@oracle.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent c011bb66
Loading
Loading
Loading
Loading
+14 −7
Original line number Diff line number Diff line
@@ -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,11 +605,16 @@ 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;

err_worker:
+1 −0
Original line number Diff line number Diff line
@@ -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;