All of lore.kernel.org
 help / color / mirror / Atom feed
From: Yangchao Zhou <zhouyates@gmail.com>
To: dev@dpdk.org
Cc: stable@dpdk.org, ferruh.yigit@intel.com, thomas@monjalon.net
Subject: [PATCH v4] kni: fix possible rx_q mbuf leaks and speed up alloc_q release
Date: Thu, 19 Apr 2018 11:12:20 +0800	[thread overview]
Message-ID: <1524107540-11544-1-git-send-email-zhouyates@gmail.com> (raw)
In-Reply-To: <9a57896f-a2db-7f4b-f5c4-cf04970f1636@intel.com>

rx_q fifo can only be released by kernel thread. There may be
mbuf leaks in rx_q because kernel threads are randomly stopped.

When the kni is released and netdev is unregisterd, convert the
physical address mbufs in rx_q to the virtual address in free_q.
By the way, alloc_q can be processed together to speed up the
release rate in userspace.

In my test, it is improved from 300-500ms with a mempool that has
 131072 mbufs to 10ms(regardless of the specifications).

Signed-off-by: Yangchao Zhou <zhouyates@gmail.com>
Suggested-by: Ferruh Yigit <ferruh.yigit@intel.com>
---
v4:
* Add improve performance description.
---
 kernel/linux/kni/kni_dev.h  |    1 +
 kernel/linux/kni/kni_misc.c |    2 ++
 kernel/linux/kni/kni_net.c  |   40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/kernel/linux/kni/kni_dev.h b/kernel/linux/kni/kni_dev.h
index c9393d8..6275ef2 100644
--- a/kernel/linux/kni/kni_dev.h
+++ b/kernel/linux/kni/kni_dev.h
@@ -92,6 +92,7 @@ struct kni_dev {
 	void *alloc_va[MBUF_BURST_SZ];
 };
 
+void kni_net_release_fifo_phy(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/kernel/linux/kni/kni_misc.c b/kernel/linux/kni/kni_misc.c
index 01574ec..fa69f8e 100644
--- a/kernel/linux/kni/kni_misc.c
+++ b/kernel/linux/kni/kni_misc.c
@@ -192,6 +192,8 @@ struct kni_net {
 		free_netdev(dev->net_dev);
 	}
 
+	kni_net_release_fifo_phy(dev);
+
 	return 0;
 }
 
diff --git a/kernel/linux/kni/kni_net.c b/kernel/linux/kni/kni_net.c
index 9f9b798..7fcfa10 100644
--- a/kernel/linux/kni/kni_net.c
+++ b/kernel/linux/kni/kni_net.c
@@ -163,6 +163,46 @@
 	return (ret == 0) ? req.result : ret;
 }
 
+static void
+kni_fifo_trans_pa2va(struct kni_dev *kni,
+	struct rte_kni_fifo *src_pa, struct rte_kni_fifo *dst_va)
+{
+	uint32_t ret, i, num_dst, num_rx;
+	void *kva;
+	do {
+		num_dst = kni_fifo_free_count(dst_va);
+		if (num_dst == 0)
+			return;
+
+		num_rx = min_t(uint32_t, num_dst, MBUF_BURST_SZ);
+
+		num_rx = kni_fifo_get(src_pa, kni->pa, num_rx);
+		if (num_rx == 0)
+			return;
+
+		for (i = 0; i < num_rx; i++) {
+			kva = pa2kva(kni->pa[i]);
+			kni->va[i] = pa2va(kni->pa[i], kva);
+		}
+
+		ret = kni_fifo_put(dst_va, kni->va, num_rx);
+		if (ret != num_rx) {
+			/* Failing should not happen */
+			pr_err("Fail to enqueue entries into dst_va\n");
+			return;
+		}
+	} while (1);
+}
+
+/* Try to release mbufs when kni release */
+void kni_net_release_fifo_phy(struct kni_dev *kni)
+{
+	/* release rx_q first, because it can't release in userspace */
+	kni_fifo_trans_pa2va(kni, kni->rx_q, kni->free_q);
+	/* release alloc_q for speeding up kni release in userspace */
+	kni_fifo_trans_pa2va(kni, kni->alloc_q, kni->free_q);
+}
+
 /*
  * Configuration changes (passed on by ifconfig)
  */
-- 
1.7.1

  reply	other threads:[~2018-04-19  3:12 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-11 12:34 [PATCH v2] kni: fix possible rx_q mbuf leak and speed up alloc_q release Yangchao Zhou
2018-04-17  4:01 ` [PATCH v3] kni: fix possible rx_q mbuf leaks " Yangchao Zhou
2018-04-17 19:11   ` Ferruh Yigit
2018-04-19  3:12     ` Yangchao Zhou [this message]
2018-05-04 12:46       ` [PATCH v4] " Ferruh Yigit
2018-05-13 22:02         ` [dpdk-stable] " Thomas Monjalon

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1524107540-11544-1-git-send-email-zhouyates@gmail.com \
    --to=zhouyates@gmail.com \
    --cc=dev@dpdk.org \
    --cc=ferruh.yigit@intel.com \
    --cc=stable@dpdk.org \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.