[dpdk-stable] patch 'net/cxgbe: fix CLIP leak in filter error path' has been queued to LTS release 18.11.10

Kevin Traynor ktraynor at redhat.com
Fri Jul 17 18:31:54 CEST 2020


Hi,

FYI, your patch has been queued to LTS release 18.11.10

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

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable-queue

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable-queue/commit/d2cff2bc6e489fc26b7f1aca87d768d7d7fc58b3

Thanks.

Kevin.

---
>From d2cff2bc6e489fc26b7f1aca87d768d7d7fc58b3 Mon Sep 17 00:00:00 2001
From: Rahul Lakkireddy <rahul.lakkireddy at chelsio.com>
Date: Sat, 13 Jun 2020 03:37:23 +0530
Subject: [PATCH] net/cxgbe: fix CLIP leak in filter error path

[ upstream commit 844b21299f1a10ac350528365dc761e2934512ee ]

Free up Compressed Local IP (CLIP) entry properly during filter
creation failure path. Also consolidate all various tables
cleanup to a common function and invoke it from both wild-card
and exact-match filter paths.

Fixes: af44a577988b ("net/cxgbe: support to offload flows to HASH region")

Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy at chelsio.com>
---
 drivers/net/cxgbe/cxgbe_filter.c | 68 +++++++++++++++-----------------
 1 file changed, 31 insertions(+), 37 deletions(-)

diff --git a/drivers/net/cxgbe/cxgbe_filter.c b/drivers/net/cxgbe/cxgbe_filter.c
index 8cd26212f8..489c23249c 100644
--- a/drivers/net/cxgbe/cxgbe_filter.c
+++ b/drivers/net/cxgbe/cxgbe_filter.c
@@ -268,4 +268,20 @@ int cxgbe_alloc_ftid(struct adapter *adap, u8 nentries)
 }
 
+/**
+ * Clear a filter and release any of its resources that we own.  This also
+ * clears the filter's "pending" status.
+ */
+static void clear_filter(struct filter_entry *f)
+{
+	if (f->clipt)
+		cxgbe_clip_release(f->dev, f->clipt);
+
+	/* The zeroing of the filter rule below clears the filter valid,
+	 * pending, locked flags etc. so it's all we need for
+	 * this operation.
+	 */
+	memset(f, 0, sizeof(*f));
+}
+
 /**
  * Construct hash filter ntuple.
@@ -551,5 +567,5 @@ static int cxgbe_set_hash_filter(struct rte_eth_dev *dev,
 	f = t4_os_alloc(sizeof(*f));
 	if (!f)
-		goto out_err;
+		return -ENOMEM;
 
 	f->fs = *fs;
@@ -588,5 +604,5 @@ static int cxgbe_set_hash_filter(struct rte_eth_dev *dev,
 		if (!mbuf) {
 			ret = -ENOMEM;
-			goto free_clip;
+			goto free_atid;
 		}
 
@@ -618,31 +634,13 @@ static int cxgbe_set_hash_filter(struct rte_eth_dev *dev,
 	return 0;
 
-free_clip:
-	cxgbe_clip_release(f->dev, f->clipt);
 free_atid:
 	cxgbe_free_atid(t, atid);
 
 out_err:
+	clear_filter(f);
 	t4_os_free(f);
 	return ret;
 }
 
-/**
- * Clear a filter and release any of its resources that we own.  This also
- * clears the filter's "pending" status.
- */
-static void clear_filter(struct filter_entry *f)
-{
-	if (f->clipt)
-		cxgbe_clip_release(f->dev, f->clipt);
-
-	/*
-	 * The zeroing of the filter rule below clears the filter valid,
-	 * pending, locked flags etc. so it's all we need for
-	 * this operation.
-	 */
-	memset(f, 0, sizeof(*f));
-}
-
 /**
  * t4_mk_filtdelwr - create a delete filter WR
@@ -998,14 +996,4 @@ int cxgbe_set_filter(struct rte_eth_dev *dev, unsigned int filter_id,
 	}
 
-	/*
-	 * Allocate a clip table entry only if we have non-zero IPv6 address
-	 */
-	if (chip_ver > CHELSIO_T5 && fs->type &&
-	    memcmp(fs->val.lip, bitoff, sizeof(bitoff))) {
-		f->clipt = cxgbe_clip_alloc(dev, (u32 *)&fs->val.lip);
-		if (!f->clipt)
-			goto free_tid;
-	}
-
 	/*
 	 * Convert the filter specification into our internal format.
@@ -1018,4 +1006,14 @@ int cxgbe_set_filter(struct rte_eth_dev *dev, unsigned int filter_id,
 	f->dev = dev;
 
+	/* Allocate a clip table entry only if we have non-zero IPv6 address. */
+	if (chip_ver > CHELSIO_T5 && f->fs.type &&
+	    memcmp(f->fs.val.lip, bitoff, sizeof(bitoff))) {
+		f->clipt = cxgbe_clip_alloc(dev, (u32 *)&f->fs.val.lip);
+		if (!f->clipt) {
+			ret = -ENOMEM;
+			goto free_tid;
+		}
+	}
+
 	/*
 	 * Attempt to set the filter.  If we don't succeed, we clear
@@ -1098,4 +1096,5 @@ void cxgbe_hash_filter_rpl(struct adapter *adap,
 
 		cxgbe_free_atid(t, ftid);
+		clear_filter(f);
 		t4_os_free(f);
 	}
@@ -1273,11 +1272,6 @@ void cxgbe_hash_del_filter_rpl(struct adapter *adap,
 
 	ctx = f->ctx;
-	f->ctx = NULL;
-
-	f->valid = 0;
-
-	if (f->clipt)
-		cxgbe_clip_release(f->dev, f->clipt);
 
+	clear_filter(f);
 	cxgbe_remove_tid(t, 0, tid, 0);
 	t4_os_free(f);
-- 
2.21.3

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-07-17 17:17:00.330522875 +0100
+++ 0006-net-cxgbe-fix-CLIP-leak-in-filter-error-path.patch	2020-07-17 17:16:59.961771832 +0100
@@ -1 +1 @@
-From 844b21299f1a10ac350528365dc761e2934512ee Mon Sep 17 00:00:00 2001
+From d2cff2bc6e489fc26b7f1aca87d768d7d7fc58b3 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 844b21299f1a10ac350528365dc761e2934512ee ]
+
@@ -12 +13,0 @@
-Cc: stable at dpdk.org
@@ -20 +21 @@
-index 27e96c73e6..45602d468d 100644
+index 8cd26212f8..489c23249c 100644
@@ -23 +24 @@
-@@ -285,4 +285,20 @@ int cxgbe_alloc_ftid(struct adapter *adap, u8 nentries)
+@@ -268,4 +268,20 @@ int cxgbe_alloc_ftid(struct adapter *adap, u8 nentries)
@@ -44 +45 @@
-@@ -584,5 +600,5 @@ static int cxgbe_set_hash_filter(struct rte_eth_dev *dev,
+@@ -551,5 +567,5 @@ static int cxgbe_set_hash_filter(struct rte_eth_dev *dev,
@@ -51 +52 @@
-@@ -632,5 +648,5 @@ static int cxgbe_set_hash_filter(struct rte_eth_dev *dev,
+@@ -588,5 +604,5 @@ static int cxgbe_set_hash_filter(struct rte_eth_dev *dev,
@@ -58 +59 @@
-@@ -662,31 +678,13 @@ static int cxgbe_set_hash_filter(struct rte_eth_dev *dev,
+@@ -618,31 +634,13 @@ static int cxgbe_set_hash_filter(struct rte_eth_dev *dev,
@@ -91 +92 @@
-@@ -1071,14 +1069,4 @@ int cxgbe_set_filter(struct rte_eth_dev *dev, unsigned int filter_id,
+@@ -998,14 +996,4 @@ int cxgbe_set_filter(struct rte_eth_dev *dev, unsigned int filter_id,
@@ -106 +107 @@
-@@ -1091,4 +1079,14 @@ int cxgbe_set_filter(struct rte_eth_dev *dev, unsigned int filter_id,
+@@ -1018,4 +1006,14 @@ int cxgbe_set_filter(struct rte_eth_dev *dev, unsigned int filter_id,
@@ -119,3 +120,3 @@
- 	iconf = adapter->params.tp.ingress_config;
- 
-@@ -1193,4 +1191,5 @@ void cxgbe_hash_filter_rpl(struct adapter *adap,
+ 	/*
+ 	 * Attempt to set the filter.  If we don't succeed, we clear
+@@ -1098,4 +1096,5 @@ void cxgbe_hash_filter_rpl(struct adapter *adap,
@@ -127 +128 @@
-@@ -1417,11 +1416,6 @@ void cxgbe_hash_del_filter_rpl(struct adapter *adap,
+@@ -1273,11 +1272,6 @@ void cxgbe_hash_del_filter_rpl(struct adapter *adap,



More information about the stable mailing list