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: Darek Stojaczyk <dariusz.stojaczyk@intel.com> Reviewed-on: https://review.gerrithub.io/c/446081 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
parent
0c0a48d14c
commit
0aa926c0c0
@ -83,9 +83,6 @@ struct rte_vhost_vring {
|
|||||||
int callfd;
|
int callfd;
|
||||||
int kickfd;
|
int kickfd;
|
||||||
uint16_t size;
|
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
|
* @return
|
||||||
* 0 on success, -1 on failure
|
* 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);
|
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_ */
|
#endif /* _RTE_VHOST_H_ */
|
||||||
|
@ -386,9 +386,6 @@ rte_vhost_get_vhost_vring(int vid, uint16_t vring_idx,
|
|||||||
vring->kickfd = vq->kickfd;
|
vring->kickfd = vq->kickfd;
|
||||||
vring->size = vq->size;
|
vring->size = vq->size;
|
||||||
|
|
||||||
vring->last_avail_idx = vq->last_avail_idx;
|
|
||||||
vring->last_used_idx = vq->last_used_idx;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -459,8 +456,9 @@ rte_vhost_log_used_vring(int vid, uint16_t vring_idx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
rte_vhost_set_vhost_vring_last_idx(int vid, uint16_t vring_idx,
|
rte_vhost_set_vring_base(int vid, uint16_t vring_idx,
|
||||||
uint16_t last_avail_idx, uint16_t last_used_idx) {
|
uint16_t last_avail_idx, uint16_t last_used_idx)
|
||||||
|
{
|
||||||
struct virtio_net *dev;
|
struct virtio_net *dev;
|
||||||
struct vhost_virtqueue *vq;
|
struct vhost_virtqueue *vq;
|
||||||
|
|
||||||
@ -480,3 +478,27 @@ rte_vhost_set_vhost_vring_last_idx(int vid, uint16_t vring_idx,
|
|||||||
|
|
||||||
return 0;
|
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;
|
||||||
|
}
|
||||||
|
@ -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 rte_vhost_vring *vring = &virtqueue->vring;
|
||||||
struct vring_avail *avail = vring->avail;
|
struct vring_avail *avail = vring->avail;
|
||||||
uint16_t size_mask = vring->size - 1;
|
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;
|
uint16_t count, i;
|
||||||
|
|
||||||
count = avail_idx - last_idx;
|
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);
|
count = spdk_min(count, reqs_len);
|
||||||
vring->last_avail_idx += count;
|
virtqueue->last_avail_idx += count;
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
reqs[i] = vring->avail->ring[(last_idx + i) & size_mask];
|
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,
|
SPDK_DEBUGLOG(SPDK_LOG_VHOST_RING,
|
||||||
"Queue %td - USED RING: sending IRQ: last used %"PRIu16"\n",
|
"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);
|
eventfd_write(virtqueue->vring.callfd, (eventfd_t)1);
|
||||||
return 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 rte_vhost_vring *vring = &virtqueue->vring;
|
||||||
struct vring_used *used = vring->used;
|
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,
|
SPDK_DEBUGLOG(SPDK_LOG_VHOST_RING,
|
||||||
"Queue %td - USED RING: last_idx=%"PRIu16" req id=%"PRIu16" len=%"PRIu32"\n",
|
"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);
|
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].id = id;
|
||||||
used->ring[last_idx].len = len;
|
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_smp_wmb();
|
||||||
|
|
||||||
spdk_vhost_log_used_vring_elem(vsession, virtqueue, last_idx);
|
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);
|
spdk_vhost_log_used_vring_idx(vsession, virtqueue);
|
||||||
|
|
||||||
/* Ensure all our used ring changes are visible to the guest at the time
|
/* 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_dev *vdev;
|
||||||
struct spdk_vhost_session *vsession;
|
struct spdk_vhost_session *vsession;
|
||||||
struct rte_vhost_vring *q;
|
struct spdk_vhost_virtqueue *q;
|
||||||
int rc;
|
int rc;
|
||||||
uint16_t i;
|
uint16_t i;
|
||||||
|
|
||||||
@ -1026,11 +1026,11 @@ stop_device(int vid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < vsession->max_queues; i++) {
|
for (i = 0; i < vsession->max_queues; i++) {
|
||||||
q = &vsession->virtqueue[i].vring;
|
q = &vsession->virtqueue[i];
|
||||||
if (q->desc == NULL) {
|
if (q->vring.desc == NULL) {
|
||||||
continue;
|
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);
|
spdk_vhost_session_mem_unregister(vsession);
|
||||||
@ -1066,12 +1066,18 @@ start_device(int vid)
|
|||||||
vsession->max_queues = 0;
|
vsession->max_queues = 0;
|
||||||
memset(vsession->virtqueue, 0, sizeof(vsession->virtqueue));
|
memset(vsession->virtqueue, 0, sizeof(vsession->virtqueue));
|
||||||
for (i = 0; i < SPDK_VHOST_MAX_VQUEUES; i++) {
|
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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vsession->virtqueue[i].vring.desc == NULL ||
|
if (q->vring.desc == NULL || q->vring.size == 0) {
|
||||||
vsession->virtqueue[i].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;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,6 +95,9 @@
|
|||||||
|
|
||||||
struct spdk_vhost_virtqueue {
|
struct spdk_vhost_virtqueue {
|
||||||
struct rte_vhost_vring vring;
|
struct rte_vhost_vring vring;
|
||||||
|
uint16_t last_avail_idx;
|
||||||
|
uint16_t last_used_idx;
|
||||||
|
|
||||||
void *tasks;
|
void *tasks;
|
||||||
|
|
||||||
/* Request count from last stats check */
|
/* Request count from last stats check */
|
||||||
|
@ -415,7 +415,7 @@ process_ctrl_request(struct spdk_vhost_scsi_task *task)
|
|||||||
|
|
||||||
SPDK_DEBUGLOG(SPDK_LOG_VHOST_SCSI_QUEUE,
|
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",
|
"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);
|
task->vq->vring.kickfd, task->vq->vring.size);
|
||||||
SPDK_LOGDUMP(SPDK_LOG_VHOST_SCSI_QUEUE, "Request descriptor", (uint8_t *)ctrl_req, desc->len);
|
SPDK_LOGDUMP(SPDK_LOG_VHOST_SCSI_QUEUE, "Request descriptor", (uint8_t *)ctrl_req, desc->len);
|
||||||
|
|
||||||
|
@ -42,6 +42,10 @@
|
|||||||
|
|
||||||
#include "vhost/vhost.c"
|
#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(rte_vhost_driver_unregister, int, (const char *path), 0);
|
||||||
DEFINE_STUB(spdk_event_allocate, struct spdk_event *,
|
DEFINE_STUB(spdk_event_allocate, struct spdk_event *,
|
||||||
(uint32_t lcore, spdk_event_fn fn, void *arg1, void *arg2), NULL);
|
(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_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_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(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 *
|
void *
|
||||||
spdk_call_unaffinitized(void *cb(void *arg), void *arg)
|
spdk_call_unaffinitized(void *cb(void *arg), void *arg)
|
||||||
|
Loading…
Reference in New Issue
Block a user