From 510f43fc5eb936a34ac38fc61fae871d1236a062 Mon Sep 17 00:00:00 2001 From: Keiichi Watanabe Date: Mon, 22 Mar 2021 16:22:57 +0900 Subject: [PATCH] examples/vhost_blk: check features before inflight API Avoid calling rte_vhost_get_vhost_ring_inflight() and rte_vhost_get_vring_base_from_inflight() when VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD is not set. Signed-off-by: Keiichi Watanabe Reviewed-by: Maxime Coquelin --- examples/vhost_blk/vhost_blk.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/examples/vhost_blk/vhost_blk.c b/examples/vhost_blk/vhost_blk.c index 7ea60863da..5c64071604 100644 --- a/examples/vhost_blk/vhost_blk.c +++ b/examples/vhost_blk/vhost_blk.c @@ -603,10 +603,10 @@ new_device(int vid) struct vhost_blk_ctrlr *ctrlr; struct vhost_blk_queue *vq; char path[PATH_MAX]; - uint64_t features; + uint64_t features, protocol_features; pthread_t tid; int i, ret; - bool packed_ring; + bool packed_ring, inflight_shmfd; ret = rte_vhost_get_ifname(vid, path, PATH_MAX); if (ret) { @@ -631,6 +631,16 @@ new_device(int vid) } packed_ring = !!(features & (1ULL << VIRTIO_F_RING_PACKED)); + ret = rte_vhost_get_negotiated_protocol_features( + vid, &protocol_features); + if (ret) { + fprintf(stderr, + "Failed to get the negotiated protocol features\n"); + return -1; + } + inflight_shmfd = !!(features & + (1ULL << VHOST_USER_PROTOCOL_F_INFLIGHT_SHMFD)); + /* Disable Notifications and init last idx */ for (i = 0; i < NUM_OF_BLK_QUEUES; i++) { vq = &ctrlr->queues[i]; @@ -641,10 +651,13 @@ new_device(int vid) assert(rte_vhost_get_vring_base(ctrlr->vid, i, &vq->last_avail_idx, &vq->last_used_idx) == 0); - assert(rte_vhost_get_vhost_ring_inflight(ctrlr->vid, i, - &vq->inflight_ring) == 0); - if (packed_ring) { + if (inflight_shmfd) + assert(rte_vhost_get_vhost_ring_inflight( + ctrlr->vid, i, + &vq->inflight_ring) == 0); + + if (packed_ring && inflight_shmfd) { /* for the reconnection */ assert(rte_vhost_get_vring_base_from_inflight( ctrlr->vid, i, -- 2.20.1