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:
5f0978e96220 ("net/ice/base: add OS specific implementation")
Fixes:
f5cafa961fae ("net/ice: add flow director create and destroy")
Fixes:
5ad3db8d4bdd ("net/ice: enable advanced RSS")
Cc: stable@dpdk.org
Signed-off-by: Tao Zhu <taox.zhu@intel.com>
Reviewed-by: Simei Su <simei.su@intel.com>
Reviewed-by: Yahui Cao <yahui.cao@intel.com>
Acked-by: Xiaolong Ye <xiaolong.ye@intel.com>
+#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); \
#define LIST_REPLACE_INIT(list_head, head) do { \
(head)->lh_first = (list_head)->lh_first; \
INIT_LIST_HEAD(list_head); \
#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 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)
#ifndef ICE_DBG_TRACE
#define ICE_DBG_TRACE BIT_ULL(0)
ret = ice_fdir_parse_pattern(ad, pattern, error, filter);
if (ret)
ret = ice_fdir_parse_pattern(ad, pattern, error, filter);
if (ret)
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");
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");
+ ret = -rte_errno;
+ goto error;
}
ret = ice_fdir_parse_action(ad, actions, error, filter);
if (ret)
}
ret = ice_fdir_parse_action(ad, actions, error, filter);
if (ret)
+error:
+ rte_free(item);
+ return ret;
}
static struct ice_flow_parser ice_fdir_parser_os = {
}
static struct ice_flow_parser ice_fdir_parser_os = {
void **meta,
struct rte_flow_error *error)
{
void **meta,
struct rte_flow_error *error)
{
struct ice_pattern_match_item *pattern_match_item;
struct rss_meta *rss_meta_ptr;
struct ice_pattern_match_item *pattern_match_item;
struct rss_meta *rss_meta_ptr;
pattern_match_item = ice_search_pattern_match_item(pattern,
array, array_len, error);
if (!pattern_match_item)
pattern_match_item = ice_search_pattern_match_item(pattern,
array, array_len, error);
if (!pattern_match_item)
ret = ice_hash_check_inset(pattern, error);
if (ret)
ret = ice_hash_check_inset(pattern, error);
if (ret)
/* Save protocol header to rss_meta. */
*meta = rss_meta_ptr;
/* Save protocol header to rss_meta. */
*meta = rss_meta_ptr;
/* Check rss action. */
ret = ice_hash_parse_action(pattern_match_item, actions, meta, error);
/* Check rss action. */
ret = ice_hash_parse_action(pattern_match_item, actions, meta, error);
+ rte_free(rss_meta_ptr);
rte_free(pattern_match_item);
rte_free(pattern_match_item);