patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Yuanhan Liu <yliu@fridaylinux.org>
To: Maxime Coquelin <maxime.coquelin@redhat.com>
Cc: dpdk stable <stable@dpdk.org>
Subject: [dpdk-stable] patch 'vhost: fix IOTLB pool out-of-memory handling' has been queued to LTS release 17.11.1
Date: Wed,  7 Feb 2018 16:57:02 +0800	[thread overview]
Message-ID: <1517993838-26692-8-git-send-email-yliu@fridaylinux.org> (raw)
In-Reply-To: <1517993838-26692-1-git-send-email-yliu@fridaylinux.org>

Hi,

FYI, your patch has been queued to LTS release 17.11.1

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 02/09/18. So please
shout if anyone has objections.

Thanks.

	--yliu

---
>From 2f6b2ae70c32cc9e9bcc377945cdedaa3d7e515d Mon Sep 17 00:00:00 2001
From: Maxime Coquelin <maxime.coquelin@redhat.com>
Date: Mon, 5 Feb 2018 16:04:56 +0100
Subject: [PATCH] vhost: fix IOTLB pool out-of-memory handling

[ upstream commit 37771844a05c7b0a7b039dcae1b4b0a69b4acced ]

In the unlikely case the IOTLB memory pool runs out of memory,
an issue may happen if all entries are used by the IOTLB cache,
and an IOTLB miss happen. If the iotlb pending list is empty,
then no memory is freed and allocation fails a second time.

This patch fixes this by doing an IOTLB cache random evict if
the IOTLB pending list is empty, ensuring the second allocation
try will succeed.

In the same spirit, the opposite is done when inserting an
IOTLB entry in the IOTLB cache fails due to out of memory. In
this case, the IOTLB pending is flushed if the IOTLB cache is
empty to ensure the new entry can be inserted.

Fixes: d012d1f293f4 ("vhost: add IOTLB helper functions")
Fixes: f72c2ad63aeb ("vhost: add pending IOTLB miss request list and helpers")

Signed-off-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
 lib/librte_vhost/iotlb.c | 18 +++++++++++++-----
 1 file changed, 13 insertions(+), 5 deletions(-)

diff --git a/lib/librte_vhost/iotlb.c b/lib/librte_vhost/iotlb.c
index b74cc6a..72cd27d 100644
--- a/lib/librte_vhost/iotlb.c
+++ b/lib/librte_vhost/iotlb.c
@@ -51,6 +51,9 @@ struct vhost_iotlb_entry {
 #define IOTLB_CACHE_SIZE 2048
 
 static void
+vhost_user_iotlb_cache_random_evict(struct vhost_virtqueue *vq);
+
+static void
 vhost_user_iotlb_pending_remove_all(struct vhost_virtqueue *vq)
 {
 	struct vhost_iotlb_entry *node, *temp_node;
@@ -95,9 +98,11 @@ vhost_user_iotlb_pending_insert(struct vhost_virtqueue *vq,
 
 	ret = rte_mempool_get(vq->iotlb_pool, (void **)&node);
 	if (ret) {
-		RTE_LOG(INFO, VHOST_CONFIG,
-				"IOTLB pool empty, clear pending misses\n");
-		vhost_user_iotlb_pending_remove_all(vq);
+		RTE_LOG(DEBUG, VHOST_CONFIG, "IOTLB pool empty, clear entries\n");
+		if (!TAILQ_EMPTY(&vq->iotlb_pending_list))
+			vhost_user_iotlb_pending_remove_all(vq);
+		else
+			vhost_user_iotlb_cache_random_evict(vq);
 		ret = rte_mempool_get(vq->iotlb_pool, (void **)&node);
 		if (ret) {
 			RTE_LOG(ERR, VHOST_CONFIG, "IOTLB pool still empty, failure\n");
@@ -186,8 +191,11 @@ vhost_user_iotlb_cache_insert(struct vhost_virtqueue *vq, uint64_t iova,
 
 	ret = rte_mempool_get(vq->iotlb_pool, (void **)&new_node);
 	if (ret) {
-		RTE_LOG(DEBUG, VHOST_CONFIG, "IOTLB pool empty, evict one entry\n");
-		vhost_user_iotlb_cache_random_evict(vq);
+		RTE_LOG(DEBUG, VHOST_CONFIG, "IOTLB pool empty, clear entries\n");
+		if (!TAILQ_EMPTY(&vq->iotlb_list))
+			vhost_user_iotlb_cache_random_evict(vq);
+		else
+			vhost_user_iotlb_pending_remove_all(vq);
 		ret = rte_mempool_get(vq->iotlb_pool, (void **)&new_node);
 		if (ret) {
 			RTE_LOG(ERR, VHOST_CONFIG, "IOTLB pool still empty, failure\n");
-- 
2.7.4

  parent reply	other threads:[~2018-02-07  8:59 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-07  8:56 [dpdk-stable] patch 'mk: fix external build' " Yuanhan Liu
2018-02-07  8:56 ` [dpdk-stable] patch 'bus/vdev: continue probing after a device failure' " Yuanhan Liu
2018-02-07  8:56 ` [dpdk-stable] patch 'mempool: fix physical contiguous check' " Yuanhan Liu
2018-02-07  8:56 ` [dpdk-stable] patch 'usertools/devbind: fix kernel module reporting' " Yuanhan Liu
2018-02-07  8:56 ` [dpdk-stable] patch 'net/mlx4: fix drop flow resources leak' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'net/bonding: check error of MAC address setting' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'net/qede: fix few log messages' " Yuanhan Liu
2018-02-07  8:57 ` Yuanhan Liu [this message]
2018-02-07  8:57 ` [dpdk-stable] patch 'vhost: remove pending IOTLB entry if miss request failed' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'net/mlx4: fix Rx offload non-fragmented indication' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'net/mlx5: fix flow RSS configuration' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'net/mlx5: fix UAR remapping on non configured queues' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'app/testpmd: fix port index in RSS forward config' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'app/testpmd: fix port topology " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'bus/fslmc: fix build with latest glibc' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'bus/dpaa: fix default IOVA mode' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'examples/ip_pipeline: fix timer period unit' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'test/bitmap: fix memory leak' " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'test/reorder: " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'test/ring: " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'test/ring_perf: " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'test/table: " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'test/timer_perf: " Yuanhan Liu
2018-02-07  8:57 ` [dpdk-stable] patch 'net/i40e: fix multiple DDP packages conflict' " Yuanhan Liu

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=1517993838-26692-8-git-send-email-yliu@fridaylinux.org \
    --to=yliu@fridaylinux.org \
    --cc=maxime.coquelin@redhat.com \
    --cc=stable@dpdk.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).