mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-07-23 00:27:30 -04:00
net: microchip: sparx5: clean up PSFP resources on flower setup failure
sparx5_tc_flower_psfp_setup() allocates PSFP stream gate, flow meter and stream filter resources before adding VCAP actions. If a later step fails, the resources allocated earlier in the function are not unwound. Add error paths to release the stream filter, flow meter and stream gate when setup fails after they have been acquired. Also make sparx5_psfp_fm_add() return the acquired flow-meter id before the existing-flow-meter early return. When an existing flow meter is reused, sparx5_psfp_fm_get() increments its pool reference count, but the caller previously kept psfp_fmid as 0. If a later setup step failed, the error path could try to delete flow-meter id 0 instead of the reused flow meter, leaving the incremented reference behind. Signed-off-by: Haoxiang Li <lihaoxiang@isrc.iscas.ac.cn> Link: https://patch.msgid.link/20260603061716.747282-1-lihaoxiang@isrc.iscas.ac.cn Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
committed by
Jakub Kicinski
parent
ecc4aa6f41
commit
46e5036733
@@ -277,6 +277,9 @@ int sparx5_psfp_fm_add(struct sparx5 *sparx5, u32 uidx,
|
||||
ret = sparx5_psfp_fm_get(sparx5, uidx, &fm->pol.idx);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*id = fm->pol.idx;
|
||||
|
||||
/* Was already in use, no need to reconfigure */
|
||||
if (ret > 1)
|
||||
return 0;
|
||||
@@ -291,8 +294,6 @@ int sparx5_psfp_fm_add(struct sparx5 *sparx5, u32 uidx,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*id = fm->pol.idx;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -807,7 +807,7 @@ static int sparx5_tc_flower_psfp_setup(struct sparx5 *sparx5,
|
||||
/* Add new flow-meter */
|
||||
ret = sparx5_psfp_fm_add(sparx5, pol_idx, fm, &psfp_fmid);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto err_sg_del;
|
||||
}
|
||||
|
||||
/* Map stream filter to stream gate */
|
||||
@@ -816,7 +816,7 @@ static int sparx5_tc_flower_psfp_setup(struct sparx5 *sparx5,
|
||||
/* Add new stream-filter and map it to a steam gate */
|
||||
ret = sparx5_psfp_sf_add(sparx5, sf, &psfp_sfid);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto err_fm_del;
|
||||
|
||||
/* Streams are classified by ISDX - map ISDX 1:1 to sfid for now. */
|
||||
sparx5_isdx_conf_set(sparx5, psfp_sfid, psfp_sfid, psfp_fmid);
|
||||
@@ -824,13 +824,23 @@ static int sparx5_tc_flower_psfp_setup(struct sparx5 *sparx5,
|
||||
ret = vcap_rule_add_action_bit(vrule, VCAP_AF_ISDX_ADD_REPLACE_SEL,
|
||||
VCAP_BIT_1);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_sf_del;
|
||||
|
||||
ret = vcap_rule_add_action_u32(vrule, VCAP_AF_ISDX_VAL, psfp_sfid);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto err_sf_del;
|
||||
|
||||
return 0;
|
||||
|
||||
err_sf_del:
|
||||
sparx5_isdx_conf_set(sparx5, psfp_sfid, 0, 0);
|
||||
sparx5_psfp_sf_del(sparx5, psfp_sfid);
|
||||
err_fm_del:
|
||||
if (pol_idx >= 0)
|
||||
sparx5_psfp_fm_del(sparx5, psfp_fmid);
|
||||
err_sg_del:
|
||||
sparx5_psfp_sg_del(sparx5, psfp_sgid);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Handle the action trap for a VCAP rule */
|
||||
|
||||
Reference in New Issue
Block a user