From patchwork Fri May 20 19:04:11 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "John Daley (johndale)" X-Patchwork-Id: 12928 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 91663C332; Fri, 20 May 2016 21:05:16 +0200 (CEST) Received: from rcdn-iport-2.cisco.com (rcdn-iport-2.cisco.com [173.37.86.73]) by dpdk.org (Postfix) with ESMTP id 0278EC316 for ; Fri, 20 May 2016 21:05:14 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=cisco.com; i=@cisco.com; l=3904; q=dns/txt; s=iport; t=1463771115; x=1464980715; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=S/pQoVTE0Cb0IacGGTUk5u7MW2Tjva+ir3g7lsASq/Q=; b=htofhQvFI9HZJK2j4zo3zaIQ36QoH2pta8ofjiR21t5bAsHnSJnKdCD3 pHoeloI9gLzK1CPH8Vd45OdsbF8lmJ1Ni0sYtObPZW3HfwEmI8m/ZxlZF mVrF/loxs4zJLBn/9d5/9ofduadfsE6C2O9svH8hsZnFN6+ehfHBfS8Sg 0=; X-IronPort-AV: E=Sophos;i="5.26,340,1459814400"; d="scan'208";a="109394704" Received: from rcdn-core-4.cisco.com ([173.37.93.155]) by rcdn-iport-2.cisco.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 May 2016 19:05:14 +0000 Received: from cisco.com (savbu-usnic-a.cisco.com [10.193.184.48]) by rcdn-core-4.cisco.com (8.14.5/8.14.5) with ESMTP id u4KJ5Enx018476; Fri, 20 May 2016 19:05:14 GMT Received: by cisco.com (Postfix, from userid 392789) id 163983FAADFC; Fri, 20 May 2016 12:05:14 -0700 (PDT) From: John Daley To: dev@dpdk.org Cc: John Daley Date: Fri, 20 May 2016 12:04:11 -0700 Message-Id: <1463771054-16861-8-git-send-email-johndale@cisco.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1463771054-16861-1-git-send-email-johndale@cisco.com> References: <1463771054-16861-1-git-send-email-johndale@cisco.com> Subject: [dpdk-dev] [PATCH 08/11] enic: Tx perf - bulk recycle mbufs, refactor X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list 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" Mbufs were returned to the pool one at a time. Use rte_mempool_put_bulk instead. There were muiltiple function calls for each buffer returned. Refactor this code into just 2 functions. Signed-off-by: John Daley --- drivers/net/enic/base/vnic_wq.h | 27 --------------------- drivers/net/enic/enic_rxtx.c | 54 ++++++++++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 46 deletions(-) diff --git a/drivers/net/enic/base/vnic_wq.h b/drivers/net/enic/base/vnic_wq.h index fe46bb4..689b81c 100644 --- a/drivers/net/enic/base/vnic_wq.h +++ b/drivers/net/enic/base/vnic_wq.h @@ -177,33 +177,6 @@ buf_idx_incr(uint32_t n_descriptors, uint32_t idx) return idx; } -static inline void vnic_wq_service(struct vnic_wq *wq, - struct cq_desc *cq_desc, u16 completed_index, - void (*buf_service)(struct vnic_wq *wq, - struct cq_desc *cq_desc, struct vnic_wq_buf *buf, void *opaque), - void *opaque) -{ - struct vnic_wq_buf *buf; - unsigned int to_clean = wq->tail_idx; - - buf = &wq->bufs[to_clean]; - while (1) { - - (*buf_service)(wq, cq_desc, buf, opaque); - - wq->ring.desc_avail++; - - - to_clean = buf_idx_incr(wq->ring.desc_count, to_clean); - - if (to_clean == completed_index) - break; - - buf = &wq->bufs[to_clean]; - } - wq->tail_idx = to_clean; -} - void vnic_wq_free(struct vnic_wq *wq); int vnic_wq_alloc(struct vnic_dev *vdev, struct vnic_wq *wq, unsigned int index, unsigned int desc_count, unsigned int desc_size); diff --git a/drivers/net/enic/enic_rxtx.c b/drivers/net/enic/enic_rxtx.c index 24b7190..8bf7640 100644 --- a/drivers/net/enic/enic_rxtx.c +++ b/drivers/net/enic/enic_rxtx.c @@ -332,33 +332,49 @@ enic_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, return nb_rx; } -static void enic_wq_free_buf(struct vnic_wq *wq, - __rte_unused struct cq_desc *cq_desc, - struct vnic_wq_buf *buf, - __rte_unused void *opaque) +static inline void enic_free_wq_bufs(struct vnic_wq *wq, u16 completed_index) { - enic_free_wq_buf(wq, buf); -} - -static int enic_wq_service(struct vnic_dev *vdev, struct cq_desc *cq_desc, - __rte_unused u8 type, u16 q_number, u16 completed_index, void *opaque) -{ - struct enic *enic = vnic_dev_priv(vdev); + struct vnic_wq_buf *buf; + struct rte_mbuf *m, *free[ENIC_MAX_WQ_DESCS]; + unsigned int nb_to_free, nb_free = 0, i; + struct rte_mempool *pool; + unsigned int tail_idx; + unsigned int desc_count = wq->ring.desc_count; + + nb_to_free = enic_ring_sub(desc_count, wq->tail_idx, completed_index) + + 1; + tail_idx = wq->tail_idx; + buf = &wq->bufs[tail_idx]; + pool = ((struct rte_mbuf *)buf->mb)->pool; + for (i = 0; i < nb_to_free; i++) { + buf = &wq->bufs[tail_idx]; + m = (struct rte_mbuf *)(buf->mb); + if (likely(m->pool == pool)) { + free[nb_free++] = m; + } else { + rte_mempool_put_bulk(pool, (void *)free, nb_free); + free[0] = m; + nb_free = 1; + pool = m->pool; + } + tail_idx = enic_ring_incr(desc_count, tail_idx); + buf->mb = NULL; + } - vnic_wq_service(&enic->wq[q_number], cq_desc, - completed_index, enic_wq_free_buf, - opaque); + rte_mempool_put_bulk(pool, (void **)free, nb_free); - return 0; + wq->tail_idx = tail_idx; + wq->ring.desc_avail += nb_to_free; } -unsigned int enic_cleanup_wq(struct enic *enic, struct vnic_wq *wq) +unsigned int enic_cleanup_wq(__rte_unused struct enic *enic, struct vnic_wq *wq) { - u16 completed_index = *((uint32_t *)wq->cqmsg_rz->addr) & 0xffff; + u16 completed_index; + + completed_index = *((uint32_t *)wq->cqmsg_rz->addr) & 0xffff; if (wq->last_completed_index != completed_index) { - enic_wq_service(enic->vdev, NULL, 0, wq->index, - completed_index, NULL); + enic_free_wq_bufs(wq, completed_index); wq->last_completed_index = completed_index; } return 0;