ice_acl_prof_init() allocates a flow segment to add the ACL profiles,
but only frees it on the error path, so it leaks on every ACL engine
init.
ice_flow_add_prof() copies the segments, so the buffer is only needed
while adding the profiles.
Allocate it on the stack instead, which removes the need to free it.
Fixes: 40d466fa9f76 ("net/ice: support ACL filter in DCF")
Cc: [email protected]
Signed-off-by: Anurag Mandal <[email protected]>
---
drivers/net/intel/ice/ice_acl_filter.c | 46 +++++++++++---------------
1 file changed, 20 insertions(+), 26 deletions(-)
diff --git a/drivers/net/intel/ice/ice_acl_filter.c
b/drivers/net/intel/ice/ice_acl_filter.c
index 21b48e1009..6cf8c83738 100644
--- a/drivers/net/intel/ice/ice_acl_filter.c
+++ b/drivers/net/intel/ice/ice_acl_filter.c
@@ -226,62 +226,57 @@ ice_acl_prof_init(struct ice_pf *pf)
struct ice_flow_prof *prof_ipv4_udp = NULL;
struct ice_flow_prof *prof_ipv4_tcp = NULL;
struct ice_flow_prof *prof_ipv4_sctp = NULL;
- struct ice_flow_seg_info *seg;
+ struct ice_flow_seg_info seg = {0};
int i;
int ret;
- seg = (struct ice_flow_seg_info *)
- ice_malloc(hw, sizeof(*seg));
- if (!seg)
- return -ENOMEM;
-
- ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV4);
- acl_add_prof_prepare(hw, seg, false, 0, 0);
+ ICE_FLOW_SET_HDRS(&seg, ICE_FLOW_SEG_HDR_IPV4);
+ acl_add_prof_prepare(hw, &seg, false, 0, 0);
ret = ice_flow_add_prof(hw, ICE_BLK_ACL, ICE_FLOW_RX,
ICE_FLTR_PTYPE_NONF_IPV4_OTHER,
- seg, 1, NULL, 0, &prof_ipv4);
+ &seg, 1, NULL, 0, &prof_ipv4);
if (ret)
goto err_add_prof;
- ice_memset(seg, 0, sizeof(*seg), ICE_NONDMA_MEM);
- ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_IPV_FRAG);
- acl_add_prof_prepare(hw, seg, false, 0, 0);
+ ice_memset(&seg, 0, sizeof(seg), ICE_NONDMA_MEM);
+ ICE_FLOW_SET_HDRS(&seg, ICE_FLOW_SEG_HDR_IPV_FRAG);
+ acl_add_prof_prepare(hw, &seg, false, 0, 0);
ret = ice_flow_add_prof(hw, ICE_BLK_ACL, ICE_FLOW_RX,
ICE_FLTR_PTYPE_FRAG_IPV4,
- seg, 1, NULL, 0, &prof_ipv4_frag);
+ &seg, 1, NULL, 0, &prof_ipv4_frag);
if (ret)
goto err_add_prof_ipv4_udp_frag;
- ice_memset(seg, 0, sizeof(*seg), ICE_NONDMA_MEM);
- ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_IPV4);
- acl_add_prof_prepare(hw, seg, true,
+ ice_memset(&seg, 0, sizeof(seg), ICE_NONDMA_MEM);
+ ICE_FLOW_SET_HDRS(&seg, ICE_FLOW_SEG_HDR_UDP | ICE_FLOW_SEG_HDR_IPV4);
+ acl_add_prof_prepare(hw, &seg, true,
ICE_FLOW_FIELD_IDX_UDP_SRC_PORT,
ICE_FLOW_FIELD_IDX_UDP_DST_PORT);
ret = ice_flow_add_prof(hw, ICE_BLK_ACL, ICE_FLOW_RX,
ICE_FLTR_PTYPE_NONF_IPV4_UDP,
- seg, 1, NULL, 0, &prof_ipv4_udp);
+ &seg, 1, NULL, 0, &prof_ipv4_udp);
if (ret)
goto err_add_prof_ipv4_udp;
- ice_memset(seg, 0, sizeof(*seg), ICE_NONDMA_MEM);
- ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV4);
- acl_add_prof_prepare(hw, seg, true,
+ ice_memset(&seg, 0, sizeof(seg), ICE_NONDMA_MEM);
+ ICE_FLOW_SET_HDRS(&seg, ICE_FLOW_SEG_HDR_TCP | ICE_FLOW_SEG_HDR_IPV4);
+ acl_add_prof_prepare(hw, &seg, true,
ICE_FLOW_FIELD_IDX_TCP_SRC_PORT,
ICE_FLOW_FIELD_IDX_TCP_DST_PORT);
ret = ice_flow_add_prof(hw, ICE_BLK_ACL, ICE_FLOW_RX,
ICE_FLTR_PTYPE_NONF_IPV4_TCP,
- seg, 1, NULL, 0, &prof_ipv4_tcp);
+ &seg, 1, NULL, 0, &prof_ipv4_tcp);
if (ret)
goto err_add_prof_ipv4_tcp;
- ice_memset(seg, 0, sizeof(*seg), ICE_NONDMA_MEM);
- ICE_FLOW_SET_HDRS(seg, ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV4);
- acl_add_prof_prepare(hw, seg, true,
+ ice_memset(&seg, 0, sizeof(seg), ICE_NONDMA_MEM);
+ ICE_FLOW_SET_HDRS(&seg, ICE_FLOW_SEG_HDR_SCTP | ICE_FLOW_SEG_HDR_IPV4);
+ acl_add_prof_prepare(hw, &seg, true,
ICE_FLOW_FIELD_IDX_SCTP_SRC_PORT,
ICE_FLOW_FIELD_IDX_SCTP_DST_PORT);
ret = ice_flow_add_prof(hw, ICE_BLK_ACL, ICE_FLOW_RX,
ICE_FLTR_PTYPE_NONF_IPV4_SCTP,
- seg, 1, NULL, 0, &prof_ipv4_sctp);
+ &seg, 1, NULL, 0, &prof_ipv4_sctp);
if (ret)
goto err_add_prof_ipv4_sctp;
@@ -321,7 +316,6 @@ ice_acl_prof_init(struct ice_pf *pf)
err_add_prof_ipv4_udp_frag:
ice_flow_rem_prof(hw, ICE_BLK_ACL, ICE_FLTR_PTYPE_NONF_IPV4_OTHER);
err_add_prof:
- ice_free(hw, seg);
return ret;
}
--
2.25.1