patches for DPDK stable branches
 help / color / mirror / Atom feed
From: Yongseok Koh <yskoh@mellanox.com>
To: yliu@fridaylinux.org
Cc: stable@dpdk.org, shahafs@mellanox.com,
	adrien.mazarguil@6wind.com, nelio.laranjeiro@6wind.com
Subject: [dpdk-stable] [PATCH v2 51/67] net/mlx4: fix Rx resource leak in case of error
Date: Mon,  4 Jun 2018 17:40:21 -0700	[thread overview]
Message-ID: <20180605004029.14593-2-yskoh@mellanox.com> (raw)
In-Reply-To: <20180605004029.14593-1-yskoh@mellanox.com>

From: Adrien Mazarguil <adrien.mazarguil@6wind.com>

[ backported from upstream commit 84a684862f502f2d885bc5fa112da26265d5a0f4 ]

When creation of a flow rule fails during dev_start(), the usage count of
the common RSS context is not decremented, which triggers an assertion
failure in debug mode during dev_close().

This is addressed by tracking the initialization status of the common RSS
context in order to add missing cleanup code.

A similar issue exists in mlx4_rxq_attach(), where usage count is
incremented on a Rx queue but not released in case of error. This may lead
to the above issue since RSS contexts created by flow rules attach
themselves to Rx queues, incrementing their usage count.

Fixes: 5697a4142107 ("net/mlx4: relax Rx queue configuration order")
Cc: stable@dpdk.org

Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
---
 drivers/net/mlx4/mlx4.c     | 6 ++++--
 drivers/net/mlx4/mlx4.h     | 1 +
 drivers/net/mlx4/mlx4_rxq.c | 7 +++++++
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index 26a0c85ad..4d7bd5f0f 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -85,6 +85,8 @@ const char *pmd_mlx4_init_params[] = {
 	NULL,
 };
 
+static void mlx4_dev_stop(struct rte_eth_dev *dev);
+
 /**
  * DPDK callback for Ethernet device configuration.
  *
@@ -167,8 +169,7 @@ mlx4_dev_start(struct rte_eth_dev *dev)
 	dev->rx_pkt_burst = mlx4_rx_burst;
 	return 0;
 err:
-	/* Rollback. */
-	priv->started = 0;
+	mlx4_dev_stop(dev);
 	return ret;
 }
 
@@ -218,6 +219,7 @@ mlx4_dev_close(struct rte_eth_dev *dev)
 	dev->tx_pkt_burst = mlx4_tx_burst_removed;
 	rte_wmb();
 	mlx4_flow_clean(priv);
+	mlx4_rss_deinit(priv);
 	for (i = 0; i != dev->data->nb_rx_queues; ++i)
 		mlx4_rx_queue_release(dev->data->rx_queues[i]);
 	for (i = 0; i != dev->data->nb_tx_queues; ++i)
diff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h
index 82573d4ab..41d652ba8 100644
--- a/drivers/net/mlx4/mlx4.h
+++ b/drivers/net/mlx4/mlx4.h
@@ -126,6 +126,7 @@ struct priv {
 	uint32_t vf:1; /**< This is a VF device. */
 	uint32_t intr_alarm:1; /**< An interrupt alarm is scheduled. */
 	uint32_t isolated:1; /**< Toggle isolated mode. */
+	uint32_t rss_init:1; /**< Common RSS context is initialized. */
 	uint32_t hw_csum:1; /* Checksum offload is supported. */
 	uint32_t hw_csum_l2tun:1; /* Checksum support for L2 tunnels. */
 	struct rte_intr_handle intr_handle; /**< Port interrupt handle. */
diff --git a/drivers/net/mlx4/mlx4_rxq.c b/drivers/net/mlx4/mlx4_rxq.c
index 53313c56f..06030c2c5 100644
--- a/drivers/net/mlx4/mlx4_rxq.c
+++ b/drivers/net/mlx4/mlx4_rxq.c
@@ -363,6 +363,8 @@ mlx4_rss_init(struct priv *priv)
 	unsigned int i;
 	int ret;
 
+	if (priv->rss_init)
+		return 0;
 	/* Prepare range for RSS contexts before creating the first WQ. */
 	ret = mlx4dv_set_context_attr(priv->ctx,
 				      MLX4DV_SET_CTX_ATTR_LOG_WQS_RANGE_SZ,
@@ -444,6 +446,7 @@ mlx4_rss_init(struct priv *priv)
 		}
 		wq_num_prev = wq_num;
 	}
+	priv->rss_init = 1;
 	return 0;
 error:
 	ERROR("cannot initialize common RSS resources (queue %u): %s: %s",
@@ -472,6 +475,8 @@ mlx4_rss_deinit(struct priv *priv)
 {
 	unsigned int i;
 
+	if (!priv->rss_init)
+		return;
 	for (i = 0; i != priv->dev->data->nb_rx_queues; ++i) {
 		struct rxq *rxq = priv->dev->data->rx_queues[i];
 
@@ -480,6 +485,7 @@ mlx4_rss_deinit(struct priv *priv)
 			mlx4_rxq_detach(rxq);
 		}
 	}
+	priv->rss_init = 0;
 }
 
 /**
@@ -622,6 +628,7 @@ mlx4_rxq_attach(struct rxq *rxq)
 		claim_zero(ibv_destroy_wq(wq));
 	if (cq)
 		claim_zero(ibv_destroy_cq(cq));
+	--rxq->usecnt;
 	rte_errno = ret;
 	ERROR("error while attaching Rx queue %p: %s: %s",
 	      (void *)rxq, msg, strerror(ret));
-- 
2.11.0

  reply	other threads:[~2018-06-05  0:41 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-05  0:27 [dpdk-stable] [PATCH v2 00/67] net/mlx5: backport patches for v17.11.3 LTS Yongseok Koh
2018-06-05  0:27 ` [dpdk-stable] [PATCH v2 01/67] net/mlx5: remove get priv internal function Yongseok Koh
2018-06-05  0:27 ` [dpdk-stable] [PATCH v2 02/67] net/mlx4: store RSS hash result in mbufs Yongseok Koh
2018-06-05  0:27 ` [dpdk-stable] [PATCH v2 03/67] net/mlx5: fix synchronization on polling Rx completions Yongseok Koh
2018-06-05  0:27 ` [dpdk-stable] [PATCH v2 04/67] net/mlx5: fix allocation when no memory on device NUMA node Yongseok Koh
2018-06-05  0:27 ` [dpdk-stable] [PATCH v2 05/67] net/mlx5: fix flow director conversion Yongseok Koh
2018-06-05  0:27 ` [dpdk-stable] [PATCH v2 06/67] net/mlx5: fix reception of multiple MAC addresses Yongseok Koh
2018-06-05  0:27 ` [dpdk-stable] [PATCH v2 07/67] net/mlx5: fix secondary process mempool registration Yongseok Koh
2018-06-05  0:27 ` [dpdk-stable] [PATCH v2 08/67] net/mlx5: remove assert un-accessible from secondary process Yongseok Koh
2018-06-05  0:27 ` [dpdk-stable] [PATCH v2 09/67] net/mlx5: warn for unsuccessful memory registration Yongseok Koh
2018-06-05  0:35 ` [dpdk-stable] [PATCH v2 10/67] net/mlx5: map UAR address around huge pages Yongseok Koh
2018-06-05  0:35   ` [dpdk-stable] [PATCH v2 11/67] net/mlx4: fix single port configuration Yongseok Koh
2018-06-05  0:35   ` [dpdk-stable] [PATCH v2 12/67] net/mlx4: fix broadcast Rx Yongseok Koh
2018-06-05  0:35   ` [dpdk-stable] [PATCH v2 13/67] net/mlx4: fix removal detection of stopped port Yongseok Koh
2018-06-05  0:35   ` [dpdk-stable] [PATCH v2 14/67] net/mlx5: fix CRC strip capability query Yongseok Koh
2018-06-05  0:35   ` [dpdk-stable] [PATCH v2 15/67] net/mlx5: fix close after start failure Yongseok Koh
2018-06-05  0:35   ` [dpdk-stable] [PATCH v2 16/67] net/mlx: control netdevices through ioctl only Yongseok Koh
2018-06-05  0:35   ` [dpdk-stable] [PATCH v2 17/67] net/mlx5: fix disabling Tx packet inlining Yongseok Koh
2018-06-05  0:35   ` [dpdk-stable] [PATCH v2 18/67] net/mlx5: fix sriov flag Yongseok Koh
2018-06-05  0:35   ` [dpdk-stable] [PATCH v2 19/67] net/mlx5: name parameters in function prototypes Yongseok Koh
2018-06-05  0:37 ` [dpdk-stable] [PATCH v2 20/67] net/mlx5: mark parameters with unused attribute Yongseok Koh
2018-06-05  0:37   ` [dpdk-stable] [PATCH v2 21/67] net/mlx5: normalize function prototypes Yongseok Koh
2018-06-05  0:37   ` [dpdk-stable] [PATCH v2 22/67] net/mlx5: add missing function documentation Yongseok Koh
2018-06-05  0:37   ` [dpdk-stable] [PATCH v2 23/67] net/mlx5: remove useless empty lines Yongseok Koh
2018-06-05  0:37   ` [dpdk-stable] [PATCH v2 24/67] net/mlx5: remove control path locks Yongseok Koh
2018-06-05  0:37   ` [dpdk-stable] [PATCH v2 25/67] net/mlx5: prefix all functions with mlx5 Yongseok Koh
2018-06-05  0:37   ` [dpdk-stable] [PATCH v2 26/67] net/mlx5: change non failing function return values Yongseok Koh
2018-06-05  0:37   ` [dpdk-stable] [PATCH v2 27/67] net/mlx5: standardize on negative errno values Yongseok Koh
2018-06-05  0:37   ` [dpdk-stable] [PATCH v2 28/67] net/mlx5: use port id in PMD log Yongseok Koh
2018-06-05  0:37   ` [dpdk-stable] [PATCH v2 29/67] net/mlx5: use dynamic logging Yongseok Koh
2018-06-05  0:38 ` [dpdk-stable] [PATCH v2 30/67] net/mlx5: remove kernel version check Yongseok Koh
2018-06-05  0:38   ` [dpdk-stable] [PATCH v2 31/67] net/mlx5: change pkt burst select function prototype Yongseok Koh
2018-06-05  0:38   ` [dpdk-stable] [PATCH v2 32/67] net/mlx5: fix link status behavior Yongseok Koh
2018-06-05  0:38   ` [dpdk-stable] [PATCH v2 33/67] net/mlx5: fix link status to use wait to complete Yongseok Koh
2018-06-05  0:38   ` [dpdk-stable] [PATCH v2 34/67] net/mlx5: change tunnel flow priority Yongseok Koh
2018-06-05  0:38   ` [dpdk-stable] [PATCH v2 35/67] net/mlx5: improve flow error explanation Yongseok Koh
2018-06-05  0:38   ` [dpdk-stable] [PATCH v2 36/67] net/mlx5: refuse empty VLAN flow specification Yongseok Koh
2018-06-05  0:38   ` [dpdk-stable] [PATCH v2 37/67] net/mlx5: fix icc build Yongseok Koh
2018-06-05  0:38   ` [dpdk-stable] [PATCH v2 38/67] net/mlx5: setup RSS regardless of queue count Yongseok Koh
2018-06-05  0:38   ` [dpdk-stable] [PATCH v2 39/67] net/mlx5: enforce RSS key length limitation Yongseok Koh
2018-06-05  0:39 ` [dpdk-stable] [PATCH v2 40/67] net/mlx5: fix RSS key length query Yongseok Koh
2018-06-05  0:39   ` [dpdk-stable] [PATCH v2 41/67] net/mlx4: fix a typo in header file Yongseok Koh
2018-06-05  0:39   ` [dpdk-stable] [PATCH v2 42/67] net/mlx5: remove 32-bit support Yongseok Koh
2018-06-05  0:39   ` [dpdk-stable] [PATCH v2 43/67] net/mlx5: remove excessive data prefetch Yongseok Koh
2018-06-05  0:39   ` [dpdk-stable] [PATCH v2 44/67] net/mlx5: fix link status initialization Yongseok Koh
2018-06-05  0:39   ` [dpdk-stable] [PATCH v2 45/67] net/mlx4: fix RSS resource leak in case of error Yongseok Koh
2018-06-05  0:39   ` [dpdk-stable] [PATCH v2 46/67] net/mlx5: fix RSS flow action bounds check Yongseok Koh
2018-06-05  0:39   ` [dpdk-stable] [PATCH v2 47/67] net/mlx5: fix invalid flow item check Yongseok Koh
2018-06-05  0:39   ` [dpdk-stable] [PATCH v2 48/67] net/mlx5: split L3/L4 in flow director Yongseok Koh
2018-06-05  0:39   ` [dpdk-stable] [PATCH v2 49/67] net/mlx5: fix flow director mask Yongseok Koh
2018-06-05  0:40 ` [dpdk-stable] [PATCH v2 50/67] net/mlx5: fix flow director rule deletion crash Yongseok Koh
2018-06-05  0:40   ` Yongseok Koh [this message]
2018-06-05  0:40   ` [dpdk-stable] [PATCH v2 52/67] net/mlx5: fix ethtool link setting call order Yongseok Koh
2018-06-05  0:40   ` [dpdk-stable] [PATCH v2 53/67] net/mlx5: fix socket connection return value Yongseok Koh
2018-06-05  0:40   ` [dpdk-stable] [PATCH v2 54/67] net/mlx5: add data-plane debug message macro Yongseok Koh
2018-06-05  0:40   ` [dpdk-stable] [PATCH v2 55/67] net/mlx5: fix probe return value polarity Yongseok Koh
2018-06-05  0:40   ` [dpdk-stable] [PATCH v2 56/67] net/mlx5: fix flow validation Yongseok Koh
2018-06-05  0:40   ` [dpdk-stable] [PATCH v2 57/67] net/mlx4: fix UDP flow rule limitation enforcement Yongseok Koh
2018-06-05  0:40   ` [dpdk-stable] [PATCH v2 58/67] net/mlx5: fix double free on error handling Yongseok Koh
2018-06-05  0:40   ` [dpdk-stable] [PATCH v2 59/67] net/mlx5: fix resource leak in case of error Yongseok Koh
2018-06-05  0:41 ` [dpdk-stable] [PATCH v2 60/67] net/mlx5: fix calculation of Tx TSO inline room size Yongseok Koh
2018-06-05  0:41   ` [dpdk-stable] [PATCH v2 61/67] net/mlx5: change device reference for secondary process Yongseok Koh
2018-06-05  0:41   ` [dpdk-stable] [PATCH v2 62/67] net/mlx4: avoid constant recreations in function Yongseok Koh
2018-06-05  0:41   ` [dpdk-stable] [PATCH v2 63/67] net/mlx5: fix flow director drop rule deletion crash Yongseok Koh
2018-06-05  0:41   ` [dpdk-stable] [PATCH v2 64/67] net/mlx5: fix build with clang on ARM Yongseok Koh
2018-06-05  0:41   ` [dpdk-stable] [PATCH v2 65/67] net/mlx5: fix count in xstats Yongseok Koh
2018-06-05  0:41   ` [dpdk-stable] [PATCH v2 66/67] net: add IPv6 header fields macros Yongseok Koh
2018-06-05  0:41   ` [dpdk-stable] [PATCH v2 67/67] net/mlx5: fix IPv6 header fields Yongseok Koh
2018-06-08 15:25 ` [dpdk-stable] [PATCH v2 00/67] net/mlx5: backport patches for v17.11.3 LTS 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=20180605004029.14593-2-yskoh@mellanox.com \
    --to=yskoh@mellanox.com \
    --cc=adrien.mazarguil@6wind.com \
    --cc=nelio.laranjeiro@6wind.com \
    --cc=shahafs@mellanox.com \
    --cc=stable@dpdk.org \
    --cc=yliu@fridaylinux.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).