From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ouyang Changchun Subject: [PATCH v4 3/4] lib_vhost: Extract function Date: Tue, 2 Jun 2015 16:51:03 +0800 Message-ID: <1433235064-2773-4-git-send-email-changchun.ouyang@intel.com> References: <1433147149-31645-1-git-send-email-changchun.ouyang@intel.com> <1433235064-2773-1-git-send-email-changchun.ouyang@intel.com> To: dev@dpdk.org Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 07631C38A for ; Tue, 2 Jun 2015 10:51:18 +0200 (CEST) In-Reply-To: <1433235064-2773-1-git-send-email-changchun.ouyang@intel.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" 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 --- 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 0286a92..e08609c 100644 --- a/lib/librte_vhost/vhost_rxtx.c +++ b/lib/librte_vhost/vhost_rxtx.c @@ -436,6 +436,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. */ @@ -466,7 +509,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 { /* @@ -490,18 +533,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); @@ -512,28 +545,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