Currently, when committing DCF QoS bandwidth configuration for VFs and TCs,
we are using rte_zmalloc followed by copying the data to persistent storage
and then discarding the temporary buffers. This is not needed as these
temporary buffers are not being stored anywhere, so replace them with
regular calloc. However, because the original code was missing a
corresponding `rte_free()` call for these temporary allocations, this
also fixes a memory leak.
Fixes: 3a6bfc37eaf4 ("net/ice: support QoS config VF bandwidth in DCF")
Cc: [email protected]
Signed-off-by: Anatoly Burakov <[email protected]>
---
drivers/net/intel/ice/ice_dcf_sched.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/drivers/net/intel/ice/ice_dcf_sched.c
b/drivers/net/intel/ice/ice_dcf_sched.c
index 2832d223d1..645f1373f4 100644
--- a/drivers/net/intel/ice/ice_dcf_sched.c
+++ b/drivers/net/intel/ice/ice_dcf_sched.c
@@ -746,8 +746,8 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev *dev,
{
struct ice_dcf_adapter *adapter = dev->data->dev_private;
struct ice_dcf_hw *hw = &adapter->real_hw;
- struct virtchnl_dcf_bw_cfg_list *vf_bw;
- struct virtchnl_dcf_bw_cfg_list *tc_bw;
+ struct virtchnl_dcf_bw_cfg_list *vf_bw = NULL;
+ struct virtchnl_dcf_bw_cfg_list *tc_bw = NULL;
struct ice_dcf_tm_node_list *vsi_list = &hw->tm_conf.vsi_list;
struct rte_tm_shaper_params *profile;
struct ice_dcf_tm_node *tm_node;
@@ -770,12 +770,12 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev
*dev,
size = sizeof(struct virtchnl_dcf_bw_cfg_list) +
sizeof(struct virtchnl_dcf_bw_cfg) *
(hw->tm_conf.nb_tc_node - 1);
- vf_bw = rte_zmalloc("vf_bw", size, 0);
+ vf_bw = calloc(1, size);
if (!vf_bw) {
ret_val = ICE_ERR_NO_MEMORY;
goto fail_clear;
}
- tc_bw = rte_zmalloc("tc_bw", size, 0);
+ tc_bw = calloc(1, size);
if (!tc_bw) {
ret_val = ICE_ERR_NO_MEMORY;
goto fail_clear;
@@ -875,6 +875,11 @@ static int ice_dcf_hierarchy_commit(struct rte_eth_dev
*dev,
return ret_val;
fail_clear:
+ if (vf_bw != NULL)
+ free(vf_bw);
+ if (tc_bw != NULL)
+ free(tc_bw);
+
/* clear all the traffic manager configuration */
if (clear_on_fail) {
ice_dcf_tm_conf_uninit(dev);
--
2.47.3