diff --git a/lib/vhost/rte_vhost/rte_vhost.h b/lib/vhost/rte_vhost/rte_vhost.h index 17b2c67b4b..b99cfb740e 100644 --- a/lib/vhost/rte_vhost/rte_vhost.h +++ b/lib/vhost/rte_vhost/rte_vhost.h @@ -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, - uint16_t last_avail_idx, uint16_t last_used_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_ */ diff --git a/lib/vhost/rte_vhost/vhost.c b/lib/vhost/rte_vhost/vhost.c index 9d4ae71b3c..e2db306b42 100644 --- a/lib/vhost/rte_vhost/vhost.c +++ b/lib/vhost/rte_vhost/vhost.c @@ -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; +} diff --git a/lib/vhost/vhost.c b/lib/vhost/vhost.c index ee8f132778..1244784f99 100644 --- a/lib/vhost/vhost.c +++ b/lib/vhost/vhost.c @@ -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 (vsession->virtqueue[i].vring.desc == NULL || - vsession->virtqueue[i].vring.size == 0) { + if (q->vring.desc == NULL || q->vring.size == 0) { + continue; + } + + if (rte_vhost_get_vring_base(vsession->vid, i, &q->last_avail_idx, &q->last_used_idx)) { + q->vring.desc = NULL; continue; } diff --git a/lib/vhost/vhost_internal.h b/lib/vhost/vhost_internal.h index a5ded833b2..bcfd120d34 100644 --- a/lib/vhost/vhost_internal.h +++ b/lib/vhost/vhost_internal.h @@ -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 */ diff --git a/lib/vhost/vhost_scsi.c b/lib/vhost/vhost_scsi.c index a460161624..8ed99663b8 100644 --- a/lib/vhost/vhost_scsi.c +++ b/lib/vhost/vhost_scsi.c @@ -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); diff --git a/test/unit/lib/vhost/vhost.c/vhost_ut.c b/test/unit/lib/vhost/vhost.c/vhost_ut.c index 66b45b8aad..62f6588d38 100644 --- a/test/unit/lib/vhost/vhost.c/vhost_ut.c +++ b/test/unit/lib/vhost/vhost.c/vhost_ut.c @@ -42,6 +42,10 @@ #include "vhost/vhost.c" +DEFINE_STUB(rte_vhost_set_vring_base, int, (int vid, uint16_t queue_id, + uint16_t last_avail_idx, uint16_t last_used_idx), 0); +DEFINE_STUB(rte_vhost_get_vring_base, int, (int vid, uint16_t queue_id, + uint16_t *last_avail_idx, uint16_t *last_used_idx), 0); DEFINE_STUB(rte_vhost_driver_unregister, int, (const char *path), 0); DEFINE_STUB(spdk_event_allocate, struct spdk_event *, (uint32_t lcore, spdk_event_fn fn, void *arg1, void *arg2), NULL); @@ -96,8 +100,6 @@ DEFINE_STUB(spdk_vhost_nvme_admin_passthrough, int, (int vid, void *cmd, void *c DEFINE_STUB(spdk_vhost_nvme_set_cq_call, int, (int vid, uint16_t qid, int fd), 0); DEFINE_STUB(spdk_vhost_nvme_set_bar_mr, int, (int vid, void *bar, uint64_t bar_size), 0); DEFINE_STUB(spdk_vhost_nvme_get_cap, int, (int vid, uint64_t *cap), 0); -DEFINE_STUB(rte_vhost_set_vhost_vring_last_idx, int, - (int vid, uint16_t vring_idx, uint16_t last_avail_idx, uint16_t last_used_idx), 0); void * spdk_call_unaffinitized(void *cb(void *arg), void *arg)