From patchwork Wed Jun 21 02:58:01 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tiwei Bie X-Patchwork-Id: 25532 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 0F8457CEE; Wed, 21 Jun 2017 05:00:43 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by dpdk.org (Postfix) with ESMTP id 5FC5E5699 for ; Wed, 21 Jun 2017 04:59:45 +0200 (CEST) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP; 20 Jun 2017 19:59:45 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.39,367,1493708400"; d="scan'208";a="101830350" Received: from dpdk25.sh.intel.com ([10.67.111.75]) by orsmga002.jf.intel.com with ESMTP; 20 Jun 2017 19:59:44 -0700 From: Tiwei Bie To: dev@dpdk.org Date: Wed, 21 Jun 2017 10:58:01 +0800 Message-Id: <1498013885-102779-26-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 25/29] net/virtio: refill descs for vhost in batch 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.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/drivers/net/virtio/virtio_rxtx.c b/drivers/net/virtio/virtio_rxtx.c index 93d564f..3dc5eaf 100644 --- a/drivers/net/virtio/virtio_rxtx.c +++ b/drivers/net/virtio/virtio_rxtx.c @@ -299,9 +299,6 @@ virtqueue_enqueue_recv_refill_1_1(struct virtqueue *vq, struct rte_mbuf *cookie) vq->vq_free_cnt -= needed; - rte_smp_wmb(); - desc[idx].flags |= DESC_HW; - return 0; } @@ -381,6 +378,7 @@ virtio_dev_rx_queue_setup(struct rte_eth_dev *dev, int error, nbufs; struct rte_mbuf *m; uint16_t desc_idx; + uint16_t head_idx; PMD_INIT_FUNC_TRACE(); @@ -418,6 +416,8 @@ virtio_dev_rx_queue_setup(struct rte_eth_dev *dev, &rxvq->fake_mbuf; } + head_idx = vq->vq_desc_head_idx; + while (!virtqueue_full(vq)) { m = rte_mbuf_raw_alloc(rxvq->mpool); if (m == NULL) @@ -438,6 +438,14 @@ virtio_dev_rx_queue_setup(struct rte_eth_dev *dev, if (!vtpci_version_1_1(hw)) vq_update_avail_idx(vq); + else { + struct vring_desc_1_1 *desc = vq->vq_ring.desc_1_1; + int i; + for (i = 0; i < nbufs; i++) { + desc[head_idx & (vq->vq_nentries - 1)].flags |= DESC_HW; + head_idx++; + } + } PMD_INIT_LOG(DEBUG, "Allocated %d bufs", nbufs); @@ -701,6 +709,7 @@ virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) uint32_t hdr_size; int offload; struct virtio_net_hdr *hdr; + uint16_t head_idx, idx; nb_rx = 0; if (unlikely(hw->started == 0)) @@ -774,8 +783,11 @@ virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) rxvq->stats.packets += nb_rx; + head_idx = vq->vq_desc_head_idx; + /* Allocate new mbuf for the used descriptor */ error = ENOSPC; + int count = 0; while (likely(!virtqueue_full(vq))) { new_mbuf = rte_mbuf_raw_alloc(rxvq->mpool); if (unlikely(new_mbuf == NULL)) { @@ -790,9 +802,21 @@ virtio_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts) break; } nb_enqueued++; + count++; } - if (likely(nb_enqueued) && !vtpci_version_1_1(hw)) { + if (vtpci_version_1_1(hw)) { + struct vring_desc_1_1 *desc = vq->vq_ring.desc_1_1; + if (count > 0) { + rte_smp_wmb(); + idx = head_idx + 1; + while (--count) { + desc[idx & (vq->vq_nentries - 1)].flags |= DESC_HW; + idx++; + } + desc[head_idx & (vq->vq_nentries - 1)].flags |= DESC_HW; + } + } else if (likely(nb_enqueued)) { vq_update_avail_idx(vq); if (unlikely(virtqueue_kick_prepare(vq))) {