From patchwork Tue Feb 6 10:23:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matt X-Patchwork-Id: 35008 Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 9A7731B681; Tue, 6 Feb 2018 11:23:32 +0100 (CET) Received: from zyc-PC.local (unknown [119.61.11.228]) by dpdk.org (Postfix) with SMTP id C50811B63F for ; Tue, 6 Feb 2018 11:23:30 +0100 (CET) Date: Tue, 6 Feb 2018 18:23:13 +0800 From: zhouyangchao CC: dev@dpdk.org; To: ferruh.yigit@intel.com; Message-ID: <484ad11e-41a2-4210-83cf-d39f3a66ad77@zyc-PC.local> X-Mailer: TortoiseGit MIME-Version: 1.0 Subject: [dpdk-dev] [PATCH] kni: optimize the kni release speed 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" Physical addresses in the fifo named alloc_q need to be traversed to release in user space. The physical address to the virtual address conversion in kernel space is much better. Signed-off-by: Yangchao Zhou --- lib/librte_eal/linuxapp/kni/kni_dev.h | 1 + lib/librte_eal/linuxapp/kni/kni_misc.c | 1 + lib/librte_eal/linuxapp/kni/kni_net.c | 15 +++++++++++++++ lib/librte_kni/rte_kni.c | 26 +------------------------- 4 files changed, 18 insertions(+), 25 deletions(-) diff --git a/lib/librte_eal/linuxapp/kni/kni_dev.h b/lib/librte_eal/linuxapp/kni/kni_dev.h index c9393d8..7cd9bf8 100644 --- a/lib/librte_eal/linuxapp/kni/kni_dev.h +++ b/lib/librte_eal/linuxapp/kni/kni_dev.h @@ -92,6 +92,7 @@ struct kni_dev { void *alloc_va[MBUF_BURST_SZ]; }; +void kni_net_fifo_pa2va(struct kni_dev *kni); void kni_net_rx(struct kni_dev *kni); void kni_net_init(struct net_device *dev); void kni_net_config_lo_mode(char *lo_str); diff --git a/lib/librte_eal/linuxapp/kni/kni_misc.c b/lib/librte_eal/linuxapp/kni/kni_misc.c index 01574ec..668488b 100644 --- a/lib/librte_eal/linuxapp/kni/kni_misc.c +++ b/lib/librte_eal/linuxapp/kni/kni_misc.c @@ -507,6 +507,7 @@ kni_ioctl_release(struct net *net, uint32_t ioctl_num, dev->pthread = NULL; } + kni_net_fifo_pa2va(dev); kni_dev_remove(dev); list_del(&dev->list); ret = 0; diff --git a/lib/librte_eal/linuxapp/kni/kni_net.c b/lib/librte_eal/linuxapp/kni/kni_net.c index 9f9b798..662a527 100644 --- a/lib/librte_eal/linuxapp/kni/kni_net.c +++ b/lib/librte_eal/linuxapp/kni/kni_net.c @@ -73,6 +73,21 @@ va2pa(void *va, struct rte_kni_mbuf *m) return pa; } +/* convert physical addresses to virtual addresses in fifo for kni release */ +void +kni_net_fifo_pa2va(struct kni_dev *kni) +{ + void *fifo = kni->alloc_q; + int i, count = kni_fifo_count(fifo); + void *pa = NULL, *kva, *va; + for (i = 0; i < count; ++i) { + (void)kni_fifo_get(fifo, &pa, 1); + kva = pa2kva(pa); + va = pa2va(pa, kva); + (void)kni_fifo_put(fifo, &va, 1); + } +} + /* * It can be called to process the request. */ diff --git a/lib/librte_kni/rte_kni.c b/lib/librte_kni/rte_kni.c index 2867411..f8398a9 100644 --- a/lib/librte_kni/rte_kni.c +++ b/lib/librte_kni/rte_kni.c @@ -435,30 +435,6 @@ va2pa(struct rte_mbuf *m) (unsigned long)m->buf_iova)); } -static void -obj_free(struct rte_mempool *mp __rte_unused, void *opaque, void *obj, - unsigned obj_idx __rte_unused) -{ - struct rte_mbuf *m = obj; - void *mbuf_phys = opaque; - - if (va2pa(m) == mbuf_phys) - rte_pktmbuf_free(m); -} - -static void -kni_free_fifo_phy(struct rte_mempool *mp, struct rte_kni_fifo *fifo) -{ - void *mbuf_phys; - int ret; - - do { - ret = kni_fifo_get(fifo, &mbuf_phys, 1); - if (ret) - rte_mempool_obj_iter(mp, obj_free, mbuf_phys); - } while (ret); -} - int rte_kni_release(struct rte_kni *kni) { @@ -484,7 +460,7 @@ rte_kni_release(struct rte_kni *kni) if (kni_fifo_count(kni->rx_q)) RTE_LOG(ERR, KNI, "Fail to free all Rx-q items\n"); - kni_free_fifo_phy(kni->pktmbuf_pool, kni->alloc_q); + kni_free_fifo(kni->alloc_q); kni_free_fifo(kni->tx_q); kni_free_fifo(kni->free_q);