Commit 0aa926c0 authored by Darek Stojaczyk's avatar Darek Stojaczyk Committed by Changpeng Liu
Browse files

rte_vhost: introduce get/set vring base idx APIs



Adapted our custom rte_vhost APIs to the upstream DPDK
version which has independently added similar APIs.
This will potentially allow us to remove our internal
rte_vhost copy.

rte_vhost_set_vhost_vring_last_idx() was renamed to
rte_vhost_set_vring_base() and the last vring indices
have to be acquired with a newly introduced rte_vhost_get_vring_base()
rather than rte_vhost_get_vhost_vring().

This is only a refactor, no functionality is changed.

Change-Id: I1ca2c1216635c117832c9d9c784d5661145c04cd
Signed-off-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/446081


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
parent 0c0a48d1
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -83,9 +83,6 @@ struct rte_vhost_vring {
	int			callfd;
	int			kickfd;
	uint16_t		size;

	uint16_t		last_avail_idx;
	uint16_t		last_used_idx;
};

/**
@@ -469,7 +466,10 @@ int rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx,
 * @return
 *  0 on success, -1 on failure
 */
int rte_vhost_set_vhost_vring_last_idx(int vid, uint16_t vring_idx,
int rte_vhost_set_vring_base(int vid, uint16_t queue_id,
		uint16_t last_avail_idx, uint16_t last_used_idx);

int rte_vhost_get_vring_base(int vid, uint16_t queue_id,
		uint16_t *last_avail_idx, uint16_t *last_used_idx);

#endif /* _RTE_VHOST_H_ */
+27 −5
Original line number Diff line number Diff line
@@ -386,9 +386,6 @@ rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx,
	vring->kickfd  = vq->kickfd;
	vring->size    = vq->size;

	vring->last_avail_idx = vq->last_avail_idx;
	vring->last_used_idx = vq->last_used_idx;

	return 0;
}

@@ -459,8 +456,9 @@ rte_vhost_log_used_vring(int vid, uint16_t vring_idx,
}

int
rte_vhost_set_vhost_vring_last_idx(int vid, uint16_t vring_idx,
			      uint16_t last_avail_idx, uint16_t last_used_idx) {
rte_vhost_set_vring_base(int vid, uint16_t vring_idx,
		uint16_t last_avail_idx, uint16_t last_used_idx)
{
	struct virtio_net *dev;
	struct vhost_virtqueue *vq;

@@ -480,3 +478,27 @@ rte_vhost_set_vhost_vring_last_idx(int vid, uint16_t vring_idx,

	return 0;
}

int
rte_vhost_get_vring_base(int vid, uint16_t vring_idx,
		uint16_t *last_avail_idx, uint16_t *last_used_idx)
{
	struct virtio_net *dev;
	struct vhost_virtqueue *vq;

	dev = get_device(vid);
	if (!dev)
		return -1;

	if (vring_idx >= VHOST_MAX_VRING)
		return -1;

	vq = dev->virtqueue[vring_idx];
	if (!vq)
		return -1;

	*last_avail_idx = vq->last_avail_idx;
	*last_used_idx = vq->last_used_idx;

	return 0;
}
+20 −14
Original line number Diff line number Diff line
@@ -182,7 +182,7 @@ spdk_vhost_vq_avail_ring_get(struct spdk_vhost_virtqueue *virtqueue, uint16_t *r
	struct rte_vhost_vring *vring = &virtqueue->vring;
	struct vring_avail *avail = vring->avail;
	uint16_t size_mask = vring->size - 1;
	uint16_t last_idx = vring->last_avail_idx, avail_idx = avail->idx;
	uint16_t last_idx = virtqueue->last_avail_idx, avail_idx = avail->idx;
	uint16_t count, i;

	count = avail_idx - last_idx;
@@ -198,7 +198,7 @@ spdk_vhost_vq_avail_ring_get(struct spdk_vhost_virtqueue *virtqueue, uint16_t *r
	}

	count = spdk_min(count, reqs_len);
	vring->last_avail_idx += count;
	virtqueue->last_avail_idx += count;
	for (i = 0; i < count; i++) {
		reqs[i] = vring->avail->ring[(last_idx + i) & size_mask];
	}
@@ -259,7 +259,7 @@ spdk_vhost_vq_used_signal(struct spdk_vhost_session *vsession,

	SPDK_DEBUGLOG(SPDK_LOG_VHOST_RING,
		      "Queue %td - USED RING: sending IRQ: last used %"PRIu16"\n",
		      virtqueue - vsession->virtqueue, virtqueue->vring.last_used_idx);
		      virtqueue - vsession->virtqueue, virtqueue->last_used_idx);

	eventfd_write(virtqueue->vring.callfd, (eventfd_t)1);
	return 1;
@@ -401,15 +401,15 @@ spdk_vhost_vq_used_ring_enqueue(struct spdk_vhost_session *vsession,
{
	struct rte_vhost_vring *vring = &virtqueue->vring;
	struct vring_used *used = vring->used;
	uint16_t last_idx = vring->last_used_idx & (vring->size - 1);
	uint16_t last_idx = virtqueue->last_used_idx & (vring->size - 1);

	SPDK_DEBUGLOG(SPDK_LOG_VHOST_RING,
		      "Queue %td - USED RING: last_idx=%"PRIu16" req id=%"PRIu16" len=%"PRIu32"\n",
		      virtqueue - vsession->virtqueue, vring->last_used_idx, id, len);
		      virtqueue - vsession->virtqueue, virtqueue->last_used_idx, id, len);

	spdk_vhost_log_req_desc(vsession, virtqueue, id);

	vring->last_used_idx++;
	virtqueue->last_used_idx++;
	used->ring[last_idx].id = id;
	used->ring[last_idx].len = len;

@@ -417,7 +417,7 @@ spdk_vhost_vq_used_ring_enqueue(struct spdk_vhost_session *vsession,
	spdk_smp_wmb();

	spdk_vhost_log_used_vring_elem(vsession, virtqueue, last_idx);
	* (volatile uint16_t *) &used->idx = vring->last_used_idx;
	* (volatile uint16_t *) &used->idx = virtqueue->last_used_idx;
	spdk_vhost_log_used_vring_idx(vsession, virtqueue);

	/* Ensure all our used ring changes are visible to the guest at the time
@@ -999,7 +999,7 @@ stop_device(int vid)
{
	struct spdk_vhost_dev *vdev;
	struct spdk_vhost_session *vsession;
	struct rte_vhost_vring *q;
	struct spdk_vhost_virtqueue *q;
	int rc;
	uint16_t i;

@@ -1026,11 +1026,11 @@ stop_device(int vid)
	}

	for (i = 0; i < vsession->max_queues; i++) {
		q = &vsession->virtqueue[i].vring;
		if (q->desc == NULL) {
		q = &vsession->virtqueue[i];
		if (q->vring.desc == NULL) {
			continue;
		}
		rte_vhost_set_vhost_vring_last_idx(vsession->vid, i, q->last_avail_idx, q->last_used_idx);
		rte_vhost_set_vring_base(vsession->vid, i, q->last_avail_idx, q->last_used_idx);
	}

	spdk_vhost_session_mem_unregister(vsession);
@@ -1066,12 +1066,18 @@ start_device(int vid)
	vsession->max_queues = 0;
	memset(vsession->virtqueue, 0, sizeof(vsession->virtqueue));
	for (i = 0; i < SPDK_VHOST_MAX_VQUEUES; i++) {
		if (rte_vhost_get_vhost_vring(vid, i, &vsession->virtqueue[i].vring)) {
		struct spdk_vhost_virtqueue *q = &vsession->virtqueue[i];

		if (rte_vhost_get_vhost_vring(vid, i, &q->vring)) {
			continue;
		}

		if (q->vring.desc == NULL || q->vring.size == 0) {
			continue;
		}

		if (vsession->virtqueue[i].vring.desc == NULL ||
		    vsession->virtqueue[i].vring.size == 0) {
		if (rte_vhost_get_vring_base(vsession->vid, i, &q->last_avail_idx, &q->last_used_idx)) {
			q->vring.desc = NULL;
			continue;
		}

+3 −0
Original line number Diff line number Diff line
@@ -95,6 +95,9 @@

struct spdk_vhost_virtqueue {
	struct rte_vhost_vring vring;
	uint16_t last_avail_idx;
	uint16_t last_used_idx;

	void *tasks;

	/* Request count from last stats check */
+1 −1
Original line number Diff line number Diff line
@@ -415,7 +415,7 @@ process_ctrl_request(struct spdk_vhost_scsi_task *task)

	SPDK_DEBUGLOG(SPDK_LOG_VHOST_SCSI_QUEUE,
		      "Processing controlq descriptor: desc %d/%p, desc_addr %p, len %d, flags %d, last_used_idx %d; kickfd %d; size %d\n",
		      task->req_idx, desc, (void *)desc->addr, desc->len, desc->flags, task->vq->vring.last_used_idx,
		      task->req_idx, desc, (void *)desc->addr, desc->len, desc->flags, task->vq->last_used_idx,
		      task->vq->vring.kickfd, task->vq->vring.size);
	SPDK_LOGDUMP(SPDK_LOG_VHOST_SCSI_QUEUE, "Request descriptor", (uint8_t *)ctrl_req, desc->len);

Loading