[dpdk-dev] [PATCH v3 3/4] lib_vhost: Extract function

Ouyang Changchun changchun.ouyang at intel.com
Mon Jun 1 10:25:48 CEST 2015


Extract codes into 2 common functions:
update_secure_len which is used to accumulate the buffer len in the vring descriptors.
and fill_buf_vec which is used to fill struct buf_vec.

Signed-off-by: Changchun Ouyang <changchun.ouyang at intel.com>
---
 lib/librte_vhost/vhost_rxtx.c | 79 +++++++++++++++++++++++++------------------
 1 file changed, 47 insertions(+), 32 deletions(-)

diff --git a/lib/librte_vhost/vhost_rxtx.c b/lib/librte_vhost/vhost_rxtx.c
index de60e9b..647a0c1 100644
--- a/lib/librte_vhost/vhost_rxtx.c
+++ b/lib/librte_vhost/vhost_rxtx.c
@@ -438,6 +438,49 @@ copy_from_mbuf_to_vring(struct virtio_net *dev, uint16_t res_base_idx,
 	return entry_success;
 }
 
+static inline void __attribute__((always_inline))
+update_secure_len(struct vhost_virtqueue *vq, uint32_t idx,
+	uint32_t *secure_len)
+{
+	uint8_t next_desc = 0;
+	uint32_t len = *secure_len;
+
+	do {
+		next_desc = 0;
+		len += vq->desc[idx].len;
+		if (vq->desc[idx].flags & VRING_DESC_F_NEXT) {
+			idx = vq->desc[idx].next;
+			next_desc = 1;
+		}
+	} while (next_desc);
+
+	*secure_len = len;
+}
+
+static inline void __attribute__((always_inline))
+fill_buf_vec(struct vhost_virtqueue *vq, uint16_t id, uint32_t *vec_idx)
+{
+	uint16_t wrapped_idx = id & (vq->size - 1);
+	uint32_t idx = vq->avail->ring[wrapped_idx];
+	uint8_t next_desc;
+	uint32_t vec_id = *vec_idx;
+
+	do {
+		next_desc = 0;
+		vq->buf_vec[vec_id].buf_addr = vq->desc[idx].addr;
+		vq->buf_vec[vec_id].buf_len = vq->desc[idx].len;
+		vq->buf_vec[vec_id].desc_idx = idx;
+		vec_id++;
+
+		if (vq->desc[idx].flags & VRING_DESC_F_NEXT) {
+			idx = vq->desc[idx].next;
+			next_desc = 1;
+		}
+	} while (next_desc);
+
+	*vec_idx = vec_id;
+}
+
 /*
  * This function works for mergeable RX.
  */
@@ -468,7 +511,7 @@ virtio_dev_merge_rx(struct virtio_net *dev, uint16_t queue_id,
 		uint16_t need_cnt;
 		uint32_t vec_idx = 0;
 		uint32_t pkt_len = pkts[pkt_idx]->pkt_len + vq->vhost_hlen;
-		uint16_t i, id;
+		uint16_t i;
 
 		do {
 			/*
@@ -492,18 +535,8 @@ virtio_dev_merge_rx(struct virtio_net *dev, uint16_t queue_id,
 						(res_cur_idx) & (vq->size - 1);
 					uint32_t idx =
 						vq->avail->ring[wrapped_idx];
-					uint8_t next_desc;
-
-					do {
-						next_desc = 0;
-						secure_len += vq->desc[idx].len;
-						if (vq->desc[idx].flags &
-							VRING_DESC_F_NEXT) {
-							idx = vq->desc[idx].next;
-							next_desc = 1;
-						}
-					} while (next_desc);
 
+					update_secure_len(vq, idx, &secure_len);
 					res_cur_idx++;
 				}
 			} while (pkt_len > secure_len);
@@ -514,28 +547,10 @@ virtio_dev_merge_rx(struct virtio_net *dev, uint16_t queue_id,
 							res_cur_idx);
 		} while (success == 0);
 
-		id = res_base_idx;
 		need_cnt = res_cur_idx - res_base_idx;
 
-		for (i = 0; i < need_cnt; i++, id++) {
-			uint16_t wrapped_idx = id & (vq->size - 1);
-			uint32_t idx = vq->avail->ring[wrapped_idx];
-			uint8_t next_desc;
-			do {
-				next_desc = 0;
-				vq->buf_vec[vec_idx].buf_addr =
-					vq->desc[idx].addr;
-				vq->buf_vec[vec_idx].buf_len =
-					vq->desc[idx].len;
-				vq->buf_vec[vec_idx].desc_idx = idx;
-				vec_idx++;
-
-				if (vq->desc[idx].flags & VRING_DESC_F_NEXT) {
-					idx = vq->desc[idx].next;
-					next_desc = 1;
-				}
-			} while (next_desc);
-		}
+		for (i = 0; i < need_cnt; i++)
+			fill_buf_vec(vq, res_base_idx + i, &vec_idx);
 
 		res_end_idx = res_cur_idx;
 
-- 
1.8.4.2



More information about the dev mailing list