All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: Ouyang Changchun <changchun.ouyang@intel.com>
To: dev@dpdk.org
Cc: root <root@ecsmtp.sh.intel.com>
Subject: [PATCH v6 3/4] lib_vhost: Extract function
Date: Mon,  8 Jun 2015 11:18:20 +0800	[thread overview]
Message-ID: <1433733501-481-4-git-send-email-changchun.ouyang@intel.com> (raw)
In-Reply-To: <1433733501-481-1-git-send-email-changchun.ouyang@intel.com>

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.

Changes in v5
  - merge fill_buf_vec into update_secure_len
  - do both tasks in one-time loop

Signed-off-by: root <root@dpdk20.sh.intel.com>
---
 lib/librte_vhost/vhost_rxtx.c | 85 ++++++++++++++++++-------------------------
 1 file changed, 36 insertions(+), 49 deletions(-)

diff --git a/lib/librte_vhost/vhost_rxtx.c b/lib/librte_vhost/vhost_rxtx.c
index 1f145bf..aaf77ed 100644
--- a/lib/librte_vhost/vhost_rxtx.c
+++ b/lib/librte_vhost/vhost_rxtx.c
@@ -436,6 +436,34 @@ 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 id,
+	uint32_t *secure_len, 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 len = *secure_len;
+	uint32_t vec_id = *vec_idx;
+
+	do {
+		next_desc = 0;
+		len += vq->desc[idx].len;
+		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);
+
+	*secure_len = len;
+	*vec_idx = vec_id;
+}
+
 /*
  * This function works for mergeable RX.
  */
@@ -445,8 +473,8 @@ virtio_dev_merge_rx(struct virtio_net *dev, uint16_t queue_id,
 {
 	struct vhost_virtqueue *vq;
 	uint32_t pkt_idx = 0, entry_success = 0;
-	uint16_t avail_idx, res_cur_idx;
-	uint16_t res_base_idx, res_end_idx;
+	uint16_t avail_idx;
+	uint16_t res_base_idx, res_cur_idx;
 	uint8_t success = 0;
 
 	LOG_DEBUG(VHOST_DATA, "(%"PRIu64") virtio_dev_merge_rx()\n",
@@ -462,17 +490,16 @@ virtio_dev_merge_rx(struct virtio_net *dev, uint16_t queue_id,
 		return 0;
 
 	for (pkt_idx = 0; pkt_idx < count; pkt_idx++) {
-		uint32_t secure_len = 0;
-		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;
 
 		do {
 			/*
 			 * As many data cores may want access to available
 			 * buffers, they need to be reserved.
 			 */
+			uint32_t secure_len = 0;
+			uint32_t vec_idx = 0;
+
 			res_base_idx = vq->last_used_idx_res;
 			res_cur_idx = res_base_idx;
 
@@ -486,22 +513,7 @@ virtio_dev_merge_rx(struct virtio_net *dev, uint16_t queue_id,
 						dev->device_fh);
 					return pkt_idx;
 				} else {
-					uint16_t wrapped_idx =
-						(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, res_cur_idx, &secure_len, &vec_idx);
 					res_cur_idx++;
 				}
 			} while (pkt_len > secure_len);
@@ -512,33 +524,8 @@ 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);
-		}
-
-		res_end_idx = res_cur_idx;
-
 		entry_success = copy_from_mbuf_to_vring(dev, res_base_idx,
-			res_end_idx, pkts[pkt_idx]);
+			res_cur_idx, pkts[pkt_idx]);
 
 		rte_compiler_barrier();
 
@@ -550,7 +537,7 @@ virtio_dev_merge_rx(struct virtio_net *dev, uint16_t queue_id,
 			rte_pause();
 
 		*(volatile uint16_t *)&vq->used->idx += entry_success;
-		vq->last_used_idx = res_end_idx;
+		vq->last_used_idx = res_cur_idx;
 
 		/* flush used->idx update before we read avail->flags. */
 		rte_mb();
-- 
1.8.4.2

  parent reply	other threads:[~2015-06-08  3:18 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-04  6:26 [PATCH] virtio: Fix enqueue/dequeue can't handle chained vring descriptors Ouyang Changchun
2015-05-12 10:00 ` Thomas Monjalon
2015-05-18  9:39 ` Xie, Huawei
2015-05-18 13:23   ` Ouyang, Changchun
2015-05-20  5:26     ` Xie, Huawei
2015-05-28 15:16 ` [PATCH v2 0/5] Fix vhost enqueue/dequeue issue Ouyang Changchun
2015-05-28 15:16   ` [PATCH v2 1/5] lib_vhost: Fix enqueue/dequeue can't handle chained vring descriptors Ouyang Changchun
2015-05-31  5:03     ` Xie, Huawei
2015-05-31 13:20       ` Ouyang, Changchun
2015-05-31  8:40     ` Xie, Huawei
2015-05-31 12:59       ` Ouyang, Changchun
2015-05-31 13:22         ` Ouyang, Changchun
2015-05-31 13:33       ` Ouyang, Changchun
2015-05-28 15:16   ` [PATCH v2 2/5] lib_vhost: Refine code style Ouyang Changchun
2015-05-28 15:16   ` [PATCH v2 3/5] lib_vhost: Extract function Ouyang Changchun
2015-05-28 15:16   ` [PATCH v2 4/5] lib_vhost: Remove unnecessary vring descriptor length updating Ouyang Changchun
2015-05-28 15:16   ` [PATCH v2 5/5] lib_vhost: Add support copying scattered mbuf to vring Ouyang Changchun
2015-05-31  9:10     ` Xie, Huawei
2015-05-31 13:07       ` Ouyang, Changchun
2015-06-01  8:25   ` [PATCH v3 0/4] Fix vhost enqueue/dequeue issue Ouyang Changchun
2015-06-01  8:25     ` [PATCH v3 1/4] lib_vhost: Fix enqueue/dequeue can't handle chained vring descriptors Ouyang Changchun
2015-06-02  7:51       ` Xie, Huawei
2015-06-02  8:10         ` Ouyang, Changchun
2015-06-01  8:25     ` [PATCH v3 2/4] lib_vhost: Refine code style Ouyang Changchun
2015-06-01  8:25     ` [PATCH v3 3/4] lib_vhost: Extract function Ouyang Changchun
2015-06-01  8:25     ` [PATCH v3 4/4] lib_vhost: Remove unnecessary vring descriptor length updating Ouyang Changchun
2015-06-02  8:51     ` [PATCH v4 0/4] Fix vhost enqueue/dequeue issue Ouyang Changchun
2015-06-02  8:51       ` [PATCH v4 1/4] lib_vhost: Fix enqueue/dequeue can't handle chained vring descriptors Ouyang Changchun
2015-06-02  8:51       ` [PATCH v4 2/4] lib_vhost: Refine code style Ouyang Changchun
2015-06-02  8:51       ` [PATCH v4 3/4] lib_vhost: Extract function Ouyang Changchun
2015-06-02  8:51       ` [PATCH v4 4/4] lib_vhost: Remove unnecessary vring descriptor length updating Ouyang Changchun
2015-06-03  6:02       ` [PATCH v5 0/4] Fix vhost enqueue/dequeue issue Ouyang Changchun
2015-06-03  6:02         ` [PATCH v5 1/4] lib_vhost: Fix enqueue/dequeue can't handle chained vring descriptors Ouyang Changchun
2015-06-03  6:02         ` [PATCH v5 2/4] lib_vhost: Refine code style Ouyang Changchun
2015-06-03  6:02         ` [PATCH v5 3/4] lib_vhost: Extract function Ouyang Changchun
2015-06-03  6:02         ` [PATCH v5 4/4] lib_vhost: Remove unnecessary vring descriptor length updating Ouyang Changchun
2015-06-03  7:50         ` [PATCH v5 0/4] Fix vhost enqueue/dequeue issue Xu, Qian Q
2015-06-08  3:18         ` [PATCH v6 " Ouyang Changchun
2015-06-08  3:18           ` [PATCH v6 1/4] lib_vhost: Fix enqueue/dequeue can't handle chained vring descriptors Ouyang Changchun
2015-06-08  3:18           ` [PATCH v6 2/4] lib_vhost: Refine code style Ouyang Changchun
2015-06-08  3:18           ` Ouyang Changchun [this message]
2015-06-08  3:18           ` [PATCH v6 4/4] lib_vhost: Remove unnecessary vring descriptor length updating Ouyang Changchun
2015-06-09  1:03           ` [PATCH v7 0/4] Fix vhost enqueue/dequeue issue Ouyang Changchun
2015-06-09  1:03             ` [PATCH v7 1/4] lib_vhost: Fix enqueue/dequeue can't handle chained vring descriptors Ouyang Changchun
2015-06-09  1:03             ` [PATCH v7 2/4] lib_vhost: Refine code style Ouyang Changchun
2015-06-09  1:03             ` [PATCH v7 3/4] lib_vhost: Extract function Ouyang Changchun
2015-06-09  1:03             ` [PATCH v7 4/4] lib_vhost: Remove unnecessary vring descriptor length updating Ouyang Changchun
2015-06-10  1:40             ` [PATCH v7 0/4] Fix vhost enqueue/dequeue issue Xie, Huawei
2015-06-10  6:49             ` Xie, Huawei
2015-06-17 14:57               ` Thomas Monjalon
2015-06-15  9:42             ` Thomas Monjalon
2015-06-16  1:01               ` Ouyang, Changchun

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1433733501-481-4-git-send-email-changchun.ouyang@intel.com \
    --to=changchun.ouyang@intel.com \
    --cc=dev@dpdk.org \
    --cc=root@ecsmtp.sh.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.