From: Tao Zhu <taox....@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....@intel.com> Reviewed-by: Su, Simei <simei...@intel.com> Reviewed-by: Cao, Yahui <yahui....@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. 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 -- 1.8.3.1