From patchwork Wed Jun 21 02:57:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tiwei Bie X-Patchwork-Id: 25515 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 2F36E6841; Wed, 21 Jun 2017 04:59:52 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 878922C8 for ; Wed, 21 Jun 2017 04:59:31 +0200 (CEST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP; 20 Jun 2017 19:59:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.39,367,1493708400"; d="scan'208";a="101830292" Received: from dpdk25.sh.intel.com ([10.67.111.75]) by orsmga002.jf.intel.com with ESMTP; 20 Jun 2017 19:59:30 -0700 From: Tiwei Bie To: dev@dpdk.org Cc: Yuanhan Liu Date: Wed, 21 Jun 2017 10:57:44 +0800 Message-Id: <1498013885-102779-9-git-send-email-tiwei.bie@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1498013885-102779-1-git-send-email-tiwei.bie@intel.com> References: <1498013885-102779-1-git-send-email-tiwei.bie@intel.com> Subject: [dpdk-dev] [RFC 08/29] xxx: batch the desc_hw update? X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Yuanhan Liu Signed-off-by: Yuanhan Liu --- drivers/net/virtio/virtio_rxtx_1.1.c | 18 ++++++++++-------- lib/librte_vhost/virtio_net.c | 17 ++++++++++------- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/drivers/net/virtio/virtio_rxtx_1.1.c b/drivers/net/virtio/virtio_rxtx_1.1.c index e47a346..05f9dc7 100644 --- a/drivers/net/virtio/virtio_rxtx_1.1.c +++ b/drivers/net/virtio/virtio_rxtx_1.1.c @@ -89,7 +89,7 @@ virtio_xmit_cleanup(struct virtqueue *vq) } static inline void -virtio_xmit(struct virtnet_tx *txvq, struct rte_mbuf *mbuf) +virtio_xmit(struct virtnet_tx *txvq, struct rte_mbuf *mbuf, int first_mbuf) { struct virtio_tx_region *txr = txvq->virtio_net_hdr_mz->addr; struct virtqueue *vq = txvq->vq; @@ -105,6 +105,8 @@ virtio_xmit(struct virtnet_tx *txvq, struct rte_mbuf *mbuf) RTE_PTR_DIFF(&txr[idx].tx_hdr, txr); desc[idx].len = vq->hw->vtnet_hdr_size; desc[idx].flags = VRING_DESC_F_NEXT; + if (!first_mbuf) + desc[idx].flags |= DESC_HW; do { idx = (vq->vq_avail_idx++) & (vq->vq_nentries - 1); @@ -115,12 +117,6 @@ virtio_xmit(struct virtnet_tx *txvq, struct rte_mbuf *mbuf) desc[idx].flags &= ~VRING_DESC_F_NEXT; - /* - * update the head last, so that when the host saw such flag - * is set, it means all others in the same chain is also set - */ - rte_smp_wmb(); - desc[head_idx].flags |= DESC_HW; } uint16_t @@ -129,6 +125,7 @@ virtio_xmit_pkts_1_1(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts struct virtnet_tx *txvq = tx_queue; struct virtqueue *vq = txvq->vq; uint16_t i; + uint16_t head_idx = vq->vq_avail_idx; if (unlikely(nb_pkts < 1)) return nb_pkts; @@ -148,10 +145,15 @@ virtio_xmit_pkts_1_1(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts } } - virtio_xmit(txvq, txm); + virtio_xmit(txvq, txm, i == 0); txvq->stats.bytes += txm->pkt_len; } + if (likely(i)) { + rte_smp_wmb(); + vq->vq_ring.desc_1_1[head_idx & (vq->vq_nentries - 1)].flags |= DESC_HW; + } + txvq->stats.packets += i; txvq->stats.errors += nb_pkts - i; diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c index df88e31..c9e466f 100644 --- a/lib/librte_vhost/virtio_net.c +++ b/lib/librte_vhost/virtio_net.c @@ -1009,9 +1009,6 @@ dequeue_desc(struct virtio_net *dev, struct vhost_virtqueue *vq, */ if (likely((desc->len == dev->vhost_hlen) && (desc->flags & VRING_DESC_F_NEXT) != 0)) { - rte_smp_wmb(); - desc->flags = 0; - desc = &descs[(head_idx++) & (vq->size - 1)]; if (unlikely(desc->flags & VRING_DESC_F_INDIRECT)) return -1; @@ -1072,8 +1069,6 @@ dequeue_desc(struct virtio_net *dev, struct vhost_virtqueue *vq, if ((desc->flags & VRING_DESC_F_NEXT) == 0) break; - rte_smp_wmb(); - desc->flags = 0; desc = &descs[(head_idx++) & (vq->size - 1)]; if (unlikely(desc->flags & VRING_DESC_F_INDIRECT)) return -1; @@ -1112,8 +1107,6 @@ dequeue_desc(struct virtio_net *dev, struct vhost_virtqueue *vq, mbuf_avail = cur->buf_len - RTE_PKTMBUF_HEADROOM; } } - rte_smp_wmb(); - desc->flags = 0; prev->data_len = mbuf_offset; m->pkt_len += mbuf_offset; @@ -1134,7 +1127,9 @@ vhost_dequeue_burst_1_1(struct virtio_net *dev, struct vhost_virtqueue *vq, uint16_t i; uint16_t idx; struct vring_desc_1_1 *desc = vq->desc_1_1; + uint16_t head_idx = vq->last_used_idx; + count = RTE_MIN(MAX_PKT_BURST, count); for (i = 0; i < count; i++) { idx = vq->last_used_idx & (vq->size - 1); if (!(desc[idx].flags & DESC_HW)) @@ -1150,6 +1145,14 @@ vhost_dequeue_burst_1_1(struct virtio_net *dev, struct vhost_virtqueue *vq, dequeue_desc(dev, vq, mbuf_pool, pkts[i], desc); } + if (likely(i)) { + for (idx = 1; idx < (uint16_t)(vq->last_used_idx - head_idx); idx++) { + desc[(idx + head_idx) & (vq->size - 1)].flags = 0; + } + rte_smp_wmb(); + desc[head_idx & (vq->size - 1)].flags = 0; + } + return i; }