Skip to content

Commit

Permalink
ice: cleanup stack hog
Browse files Browse the repository at this point in the history
In ice_flow_add_prof_sync(), struct ice_flow_prof_params has recently
grown in size hogging stack space when allocated there.  Hogging stack
space should be avoided.  Change allocation to be on the heap when needed.

Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Tested-by: Harikumar Bokkena <harikumarx.bokkena@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
  • Loading branch information
Bruce Allan authored and Tony Nguyen committed Dec 9, 2020
1 parent afae3cc commit 88dcfdb
Showing 1 changed file with 26 additions and 18 deletions.
44 changes: 26 additions & 18 deletions drivers/net/ethernet/intel/ice/ice_flow.c
Original file line number Diff line number Diff line change
Expand Up @@ -708,57 +708,65 @@ ice_flow_add_prof_sync(struct ice_hw *hw, enum ice_block blk,
struct ice_flow_seg_info *segs, u8 segs_cnt,
struct ice_flow_prof **prof)
{
struct ice_flow_prof_params params;
struct ice_flow_prof_params *params;
enum ice_status status;
u8 i;

if (!prof)
return ICE_ERR_BAD_PTR;

memset(&params, 0, sizeof(params));
params.prof = devm_kzalloc(ice_hw_to_dev(hw), sizeof(*params.prof),
GFP_KERNEL);
if (!params.prof)
params = kzalloc(sizeof(*params), GFP_KERNEL);
if (!params)
return ICE_ERR_NO_MEMORY;

params->prof = devm_kzalloc(ice_hw_to_dev(hw), sizeof(*params->prof),
GFP_KERNEL);
if (!params->prof) {
status = ICE_ERR_NO_MEMORY;
goto free_params;
}

/* initialize extraction sequence to all invalid (0xff) */
for (i = 0; i < ICE_MAX_FV_WORDS; i++) {
params.es[i].prot_id = ICE_PROT_INVALID;
params.es[i].off = ICE_FV_OFFSET_INVAL;
params->es[i].prot_id = ICE_PROT_INVALID;
params->es[i].off = ICE_FV_OFFSET_INVAL;
}

params.blk = blk;
params.prof->id = prof_id;
params.prof->dir = dir;
params.prof->segs_cnt = segs_cnt;
params->blk = blk;
params->prof->id = prof_id;
params->prof->dir = dir;
params->prof->segs_cnt = segs_cnt;

/* Make a copy of the segments that need to be persistent in the flow
* profile instance
*/
for (i = 0; i < segs_cnt; i++)
memcpy(&params.prof->segs[i], &segs[i], sizeof(*segs));
memcpy(&params->prof->segs[i], &segs[i], sizeof(*segs));

status = ice_flow_proc_segs(hw, &params);
status = ice_flow_proc_segs(hw, params);
if (status) {
ice_debug(hw, ICE_DBG_FLOW,
"Error processing a flow's packet segments\n");
goto out;
}

/* Add a HW profile for this flow profile */
status = ice_add_prof(hw, blk, prof_id, (u8 *)params.ptypes, params.es);
status = ice_add_prof(hw, blk, prof_id, (u8 *)params->ptypes,
params->es);
if (status) {
ice_debug(hw, ICE_DBG_FLOW, "Error adding a HW flow profile\n");
goto out;
}

INIT_LIST_HEAD(&params.prof->entries);
mutex_init(&params.prof->entries_lock);
*prof = params.prof;
INIT_LIST_HEAD(&params->prof->entries);
mutex_init(&params->prof->entries_lock);
*prof = params->prof;

out:
if (status)
devm_kfree(ice_hw_to_dev(hw), params.prof);
devm_kfree(ice_hw_to_dev(hw), params->prof);
free_params:
kfree(params);

return status;
}
Expand Down

0 comments on commit 88dcfdb

Please sign in to comment.