From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 9E2E068A1 for ; Fri, 5 May 2017 15:57:28 +0200 (CEST) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id EAC5023E6C2; Fri, 5 May 2017 13:57:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com EAC5023E6C2 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jfreiman@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com EAC5023E6C2 Received: from virtlab417.ml3.eng.bos.redhat.com (virtlab417.ml3.eng.bos.redhat.com [10.19.176.175]) by smtp.corp.redhat.com (Postfix) with ESMTP id 92B41785E5; Fri, 5 May 2017 13:57:27 +0000 (UTC) From: Jens Freimann To: yuanhan.liu@linux.intel.com Cc: dev@dpdk.org Date: Fri, 5 May 2017 09:57:19 -0400 Message-Id: <1493992642-52756-9-git-send-email-jfreiman@redhat.com> In-Reply-To: <1493992642-52756-1-git-send-email-jfreiman@redhat.com> References: <1493992642-52756-1-git-send-email-jfreiman@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Fri, 05 May 2017 13:57:28 +0000 (UTC) Subject: [dpdk-dev] [RFC PATCH 08/11] 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: , X-List-Received-Date: Fri, 05 May 2017 13:57:29 -0000 From: Yuanhan Liu Signed-off-by: Yuanhan Liu Conflicts: lib/librte_vhost/virtio_net.c --- 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 @@ } 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 @@ 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 @@ 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 @@ 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(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 @@ static inline bool __attribute__((always_inline)) */ 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 @@ static inline bool __attribute__((always_inline)) 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 @@ static inline bool __attribute__((always_inline)) 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 @@ static inline bool __attribute__((always_inline)) 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 @@ static inline bool __attribute__((always_inline)) 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; } -- 1.8.3.1