[v1,11/14] vhost: simplify getting the first in-flight index

Message ID 20211018130229.308694-12-maxime.coquelin@redhat.com (mailing list archive)
State Superseded, archived
Delegated to: Maxime Coquelin
Headers
Series vhost: clean-up and simplify async implementation |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Maxime Coquelin Oct. 18, 2021, 1:02 p.m. UTC
  This patch reworks the function getting the index
for the first packet in-flight.

When this index turns out to be zero, let's use the simple
path. Doing that avoid having to do a modulo with the
virtqueue size.

The patch also rename the function for better clarifty,
and only pass the virtqueue metadata pointer, as all the
needed information are stored there.

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 lib/vhost/virtio_net.c | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)
  

Patch

diff --git a/lib/vhost/virtio_net.c b/lib/vhost/virtio_net.c
index 4ab560c2f4..eca00af8c8 100644
--- a/lib/vhost/virtio_net.c
+++ b/lib/vhost/virtio_net.c
@@ -1484,11 +1484,14 @@  rte_vhost_enqueue_burst(int vid, uint16_t queue_id,
 }
 
 static __rte_always_inline uint16_t
-virtio_dev_rx_async_get_info_idx(uint16_t pkts_idx,
-	uint16_t vq_size, uint16_t n_inflight)
+async_get_first_inflight_pkt_idx(struct vhost_virtqueue *vq)
 {
-	return pkts_idx > n_inflight ? (pkts_idx - n_inflight) :
-		(vq_size - n_inflight + pkts_idx) % vq_size;
+	struct vhost_async *async = vq->async;
+
+	if (async->pkts_idx >= async->pkts_inflight_n)
+		return async->pkts_idx - async->pkts_inflight_n;
+	else
+		return vq->size - async->pkts_inflight_n + async->pkts_idx;
 }
 
 static __rte_always_inline void
@@ -1926,9 +1929,6 @@  vhost_poll_enqueue_completed(struct virtio_net *dev, uint16_t queue_id,
 	uint16_t n_descs = 0, n_buffers = 0;
 	uint16_t start_idx, from, i;
 
-	start_idx = virtio_dev_rx_async_get_info_idx(async->pkts_idx,
-		vq->size, async->pkts_inflight_n);
-
 	n_cpl = async->ops.check_completed_copies(dev->vid, queue_id, 0, count);
 	if (unlikely(n_cpl < 0)) {
 		VHOST_LOG_DATA(ERR, "(%d) %s: failed to check completed copies for queue id %d.\n",
@@ -1939,6 +1939,8 @@  vhost_poll_enqueue_completed(struct virtio_net *dev, uint16_t queue_id,
 	if (n_cpl == 0)
 		return 0;
 
+	start_idx = async_get_first_inflight_pkt_idx(vq);
+
 	for (i = 0; i < n_cpl; i++) {
 		from = (start_idx + i) % vq->size;
 		/* Only used with packed ring */