From patchwork Tue Jul 18 15:40:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tiwei Bie X-Patchwork-Id: 27035 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 9ADAE6841; Tue, 18 Jul 2017 17:41:56 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id B1B3D47CD for ; Tue, 18 Jul 2017 17:41:45 +0200 (CEST) Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Jul 2017 08:41:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.40,378,1496127600"; d="scan'208";a="994343824" Received: from dpdk25.sh.intel.com ([10.67.111.96]) by orsmga003.jf.intel.com with ESMTP; 18 Jul 2017 08:41:44 -0700 From: Tiwei Bie To: dev@dpdk.org, jfreiman@redhat.com Date: Tue, 18 Jul 2017 23:40:18 +0800 Message-Id: <1500392421-76672-4-git-send-email-tiwei.bie@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1500392421-76672-1-git-send-email-tiwei.bie@intel.com> References: <1500392421-76672-1-git-send-email-tiwei.bie@intel.com> Subject: [dpdk-dev] [RFC 3/6] net/virtio: optimize the tx path 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" Signed-off-by: Tiwei Bie --- drivers/net/virtio/virtio_rxtx_1.1.c | 65 ++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/drivers/net/virtio/virtio_rxtx_1.1.c b/drivers/net/virtio/virtio_rxtx_1.1.c index 4602e6d..883a027 100644 --- a/drivers/net/virtio/virtio_rxtx_1.1.c +++ b/drivers/net/virtio/virtio_rxtx_1.1.c @@ -80,42 +80,6 @@ virtio_xmit_cleanup(struct virtqueue *vq) } } -static inline void -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; - struct vring_desc_1_1 *desc = vq->vq_ring.desc_1_1; - uint16_t idx; - uint16_t head_idx = (vq->vq_avail_idx++) & (vq->vq_nentries - 1); - struct vq_desc_extra *dxp; - - idx = head_idx; - vq->vq_free_cnt -= mbuf->nb_segs + 1; - - dxp = &vq->vq_descx[idx]; - if (dxp->cookie != NULL) - rte_pktmbuf_free(dxp->cookie); - dxp->cookie = mbuf; - - desc[idx].addr = txvq->virtio_net_hdr_mem + - 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); - desc[idx].addr = VIRTIO_MBUF_DATA_DMA_ADDR(mbuf, vq); - desc[idx].len = mbuf->data_len; - desc[idx].flags = DESC_HW | VRING_DESC_F_NEXT; - } while ((mbuf = mbuf->next) != NULL); - - desc[idx].flags &= ~VRING_DESC_F_NEXT; - -} - uint16_t virtio_xmit_pkts_1_1(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) { @@ -123,6 +87,9 @@ virtio_xmit_pkts_1_1(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts struct virtqueue *vq = txvq->vq; uint16_t i; uint16_t head_idx = vq->vq_avail_idx; + struct vring_desc_1_1 *desc = vq->vq_ring.desc_1_1; + uint16_t idx; + struct vq_desc_extra *dxp; if (unlikely(nb_pkts < 1)) return nb_pkts; @@ -134,6 +101,7 @@ virtio_xmit_pkts_1_1(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts for (i = 0; i < nb_pkts; i++) { struct rte_mbuf *txm = tx_pkts[i]; + struct virtio_tx_region *txr = txvq->virtio_net_hdr_mz->addr; if (unlikely(txm->nb_segs + 1 > vq->vq_free_cnt)) { virtio_xmit_cleanup(vq); @@ -145,8 +113,31 @@ virtio_xmit_pkts_1_1(void *tx_queue, struct rte_mbuf **tx_pkts, uint16_t nb_pkts } } - virtio_xmit(txvq, txm, i == 0); txvq->stats.bytes += txm->pkt_len; + + vq->vq_free_cnt -= txm->nb_segs + 1; + + idx = (vq->vq_avail_idx++) & (vq->vq_nentries - 1); + dxp = &vq->vq_descx[idx]; + if (dxp->cookie != NULL) + rte_pktmbuf_free(dxp->cookie); + dxp->cookie = txm; + + desc[idx].addr = txvq->virtio_net_hdr_mem + + RTE_PTR_DIFF(&txr[idx].tx_hdr, txr); + desc[idx].len = vq->hw->vtnet_hdr_size; + desc[idx].flags = VRING_DESC_F_NEXT; + if (i != 0) + desc[idx].flags |= DESC_HW; + + do { + idx = (vq->vq_avail_idx++) & (vq->vq_nentries - 1); + desc[idx].addr = VIRTIO_MBUF_DATA_DMA_ADDR(txm, vq); + desc[idx].len = txm->data_len; + desc[idx].flags = DESC_HW | VRING_DESC_F_NEXT; + } while ((txm = txm->next) != NULL); + + desc[idx].flags &= ~VRING_DESC_F_NEXT; } if (likely(i)) {