net/ice: fix flow fdir/switch memory leak.

Message ID 20200116163836.15696-1-taox.zhu@intel.com (mailing list archive)
State Accepted, archived
Delegated to: xiaolong ye
Headers
Series net/ice: fix flow fdir/switch memory leak. |

Checks

Context Check Description
ci/checkpatch warning coding style issues
ci/iol-intel-Performance success Performance Testing PASS
ci/travis-robot success Travis build: passed
ci/iol-nxp-Performance success Performance Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-testing success Testing PASS
ci/Intel-compilation success Compilation OK

Commit Message

Zhu, TaoX Jan. 16, 2020, 4:38 p.m. UTC
  From: Tao Zhu <taox.zhu@intel.com>

1. Fix ice fdir and hash flow memory leak.
2. Fix the ice definition of LIST_FOR_EACH_ENTRY_SAFE not 
   save tmp which cause list deletion incompletely.

Fixes: 5f0978e9622 ("net/ice/base: add OS specific implementation")
Fixes: f5cafa961fa ("net/ice: add flow director create and destroy")
Fixes: 5ad3db8d4bd ("net/ice: enable advanced RSS")

Signed-off-by: Tao Zhu <taox.zhu@intel.com>
Reviewed-by: Su, Simei <simei.su@intel.com>
Reviewed-by: Cao, Yahui <yahui.cao@intel.com>
---
 drivers/net/ice/base/ice_osdep.h  | 17 +++++++++++++++--
 drivers/net/ice/ice_fdir_filter.c | 12 +++++++-----
 drivers/net/ice/ice_hash.c        | 12 ++++++------
 3 files changed, 28 insertions(+), 13 deletions(-)

- File drivers/net/ice/base/ice_osdep.h need someone to review.
- File drivers/net/ice/ice_fdir_filter.c reviewed by Yahui.
- File drivers/net/ice/ice_hash.c reviewed by Simei.
  

Comments

Xiaolong Ye Jan. 22, 2020, 9:07 a.m. UTC | #1
On 01/16, taox.zhu@intel.com wrote:
>From: Tao Zhu <taox.zhu@intel.com>
>
>1. Fix ice fdir and hash flow memory leak.
>2. Fix the ice definition of LIST_FOR_EACH_ENTRY_SAFE not 
>   save tmp which cause list deletion incompletely.
>
>Fixes: 5f0978e9622 ("net/ice/base: add OS specific implementation")
>Fixes: f5cafa961fa ("net/ice: add flow director create and destroy")
>Fixes: 5ad3db8d4bd ("net/ice: enable advanced RSS")
>
>Signed-off-by: Tao Zhu <taox.zhu@intel.com>
>Reviewed-by: Su, Simei <simei.su@intel.com>
>Reviewed-by: Cao, Yahui <yahui.cao@intel.com>
>---

Acked-by: Xiaolong Ye <xiaolong.ye@intel.com>

Applied to dpdk-next-net-intel, Thanks.
  

Patch

diff --git a/drivers/net/ice/base/ice_osdep.h b/drivers/net/ice/base/ice_osdep.h
index 27c1830..4b37406 100644
--- a/drivers/net/ice/base/ice_osdep.h
+++ b/drivers/net/ice/base/ice_osdep.h
@@ -343,6 +343,21 @@  static inline void list_add_tail(struct ice_list_entry *entry,
 				  member) :				       \
 		     0)
 
+#define LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, type, member)		       \
+	for ((pos) = (head)->lh_first ?					       \
+		     container_of((head)->lh_first, struct type, member) :     \
+		     0,                                                        \
+		     (tmp) = (pos) == 0 ? 0 : ((pos)->member.next.le_next ?    \
+		     container_of((pos)->member.next.le_next, struct type,     \
+				  member) :				       \
+		     0);						       \
+	     (pos);							       \
+	     (pos) = (tmp),						       \
+	     (tmp) = (pos) == 0 ? 0 : ((tmp)->member.next.le_next ?	       \
+		     container_of((pos)->member.next.le_next, struct type,     \
+				  member) :				       \
+		     0))
+
 #define LIST_REPLACE_INIT(list_head, head) do {				\
 	(head)->lh_first = (list_head)->lh_first;			\
 	INIT_LIST_HEAD(list_head);					\
@@ -356,8 +371,6 @@  static inline void list_add_tail(struct ice_list_entry *entry,
 #define HLIST_DEL(entry)                       LIST_DEL(entry)
 #define HLIST_FOR_EACH_ENTRY(pos, head, type, member) \
 	LIST_FOR_EACH_ENTRY(pos, head, type, member)
-#define LIST_FOR_EACH_ENTRY_SAFE(pos, tmp, head, type, member) \
-	LIST_FOR_EACH_ENTRY(pos, head, type, member)
 
 #ifndef ICE_DBG_TRACE
 #define ICE_DBG_TRACE		BIT_ULL(0)
diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c
index fa87074..c31a736 100644
--- a/drivers/net/ice/ice_fdir_filter.c
+++ b/drivers/net/ice/ice_fdir_filter.c
@@ -1938,23 +1938,25 @@ 
 
 	ret = ice_fdir_parse_pattern(ad, pattern, error, filter);
 	if (ret)
-		return ret;
+		goto error;
 	input_set = filter->input_set;
 	if (!input_set || input_set & ~item->input_set_mask) {
 		rte_flow_error_set(error, EINVAL,
 				   RTE_FLOW_ERROR_TYPE_ITEM_SPEC,
 				   pattern,
 				   "Invalid input set");
-		return -rte_errno;
+		ret = -rte_errno;
+		goto error;
 	}
 
 	ret = ice_fdir_parse_action(ad, actions, error, filter);
 	if (ret)
-		return ret;
+		goto error;
 
 	*meta = filter;
-
-	return 0;
+error:
+	rte_free(item);
+	return ret;
 }
 
 static struct ice_flow_parser ice_fdir_parser_os = {
diff --git a/drivers/net/ice/ice_hash.c b/drivers/net/ice/ice_hash.c
index b145a3f..d891538 100644
--- a/drivers/net/ice/ice_hash.c
+++ b/drivers/net/ice/ice_hash.c
@@ -409,7 +409,7 @@  struct ice_hash_match_type ice_hash_type_list[] = {
 			void **meta,
 			struct rte_flow_error *error)
 {
-	int ret = 0;
+	int ret = -rte_errno;
 	struct ice_pattern_match_item *pattern_match_item;
 	struct rss_meta *rss_meta_ptr;
 
@@ -425,11 +425,11 @@  struct ice_hash_match_type ice_hash_type_list[] = {
 	pattern_match_item = ice_search_pattern_match_item(pattern,
 					array, array_len, error);
 	if (!pattern_match_item)
-		return -rte_errno;
+		goto error;
 
 	ret = ice_hash_check_inset(pattern, error);
 	if (ret)
-		return -rte_errno;
+		goto error;
 
 	/* Save protocol header to rss_meta. */
 	*meta = rss_meta_ptr;
@@ -438,12 +438,12 @@  struct ice_hash_match_type ice_hash_type_list[] = {
 
 	/* Check rss action. */
 	ret = ice_hash_parse_action(pattern_match_item, actions, meta, error);
+error:
 	if (ret)
-		return -rte_errno;
-
+		rte_free(rss_meta_ptr);
 	rte_free(pattern_match_item);
 
-	return 0;
+	return ret;
 }
 
 static int