[PATCH v6 24/27] net/ice: avoid rte malloc in RSS RETA operations

Anatoly Burakov
2026-02-19T16:26:14Z

Currently, when updating or querying RSS redirection table (RETA), we
are using rte_zmalloc followed by an immediate rte_free. This memory does
not need to be stored in hugepage memory, so replace it with stack
allocation.

Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
drivers/net/intel/ice/ice_dcf_ethdev.c | 4 ++--
drivers/net/intel/ice/ice_ethdev.c | 29 ++++++--------------------
2 files changed, 8 insertions(+), 25 deletions(-)

diff --git a/drivers/net/intel/ice/ice_dcf_ethdev.c b/drivers/net/intel/ice/ice_dcf_ethdev.c
index 81da5a4656..037382b336 100644
--- a/drivers/net/intel/ice/ice_dcf_ethdev.c
+++ b/drivers/net/intel/ice/ice_dcf_ethdev.c
@@ -1338,7 +1338,7 @@ ice_dcf_dev_rss_reta_update(struct rte_eth_dev *dev,
return -EINVAL;
}

- lut = rte_zmalloc("rss_lut", reta_size, 0);
+ lut = calloc(1, reta_size);
if (!lut) {
PMD_DRV_LOG(ERR, "No memory can be allocated");
return -ENOMEM;
@@ -1358,7 +1358,7 @@ ice_dcf_dev_rss_reta_update(struct rte_eth_dev *dev,
ret = ice_dcf_configure_rss_lut(hw);
if (ret) /* revert back */
rte_memcpy(hw->rss_lut, lut, reta_size);
- rte_free(lut);
+ free(lut);

return ret;
}
diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c
index ade13600de..b9d8b2a3ac 100644
--- a/drivers/net/intel/ice/ice_ethdev.c
+++ b/drivers/net/intel/ice/ice_ethdev.c
@@ -5566,7 +5566,7 @@ ice_rss_reta_update(struct rte_eth_dev *dev,
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
uint16_t i, lut_size = pf->hash_lut_size;
uint16_t idx, shift;
- uint8_t *lut;
+ uint8_t lut[ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_2K] = {0};
int ret;

if (reta_size != ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_128 &&
@@ -5583,14 +5583,9 @@ ice_rss_reta_update(struct rte_eth_dev *dev,
/* It MUST use the current LUT size to get the RSS lookup table,
* otherwise if will fail with -100 error code.
*/
- lut = rte_zmalloc(NULL, RTE_MAX(reta_size, lut_size), 0);
- if (!lut) {
- PMD_DRV_LOG(ERR, "No memory can be allocated");
- return -ENOMEM;
- }
ret = ice_get_rss_lut(pf->main_vsi, lut, lut_size);
if (ret)
- goto out;
+ return ret;

for (i = 0; i < reta_size; i++) {
idx = i / RTE_ETH_RETA_GROUP_SIZE;
@@ -5606,10 +5601,7 @@ ice_rss_reta_update(struct rte_eth_dev *dev,
pf->hash_lut_size = reta_size;
}

-out:
- rte_free(lut);
-
- return ret;
+ return 0;
}

static int
@@ -5620,7 +5612,7 @@ ice_rss_reta_query(struct rte_eth_dev *dev,
struct ice_pf *pf = ICE_DEV_PRIVATE_TO_PF(dev->data->dev_private);
uint16_t i, lut_size = pf->hash_lut_size;
uint16_t idx, shift;
- uint8_t *lut;
+ uint8_t lut[ICE_AQC_GSET_RSS_LUT_TABLE_SIZE_2K] = {0};
int ret;

if (reta_size != lut_size) {
@@ -5632,15 +5624,9 @@ ice_rss_reta_query(struct rte_eth_dev *dev,
return -EINVAL;
}

- lut = rte_zmalloc(NULL, reta_size, 0);
- if (!lut) {
- PMD_DRV_LOG(ERR, "No memory can be allocated");
- return -ENOMEM;
- }
-
ret = ice_get_rss_lut(pf->main_vsi, lut, reta_size);
if (ret)
- goto out;
+ return ret;

for (i = 0; i < reta_size; i++) {
idx = i / RTE_ETH_RETA_GROUP_SIZE;
@@ -5649,10 +5635,7 @@ ice_rss_reta_query(struct rte_eth_dev *dev,
reta_conf[idx].reta[shift] = lut[i];
}

-out:
- rte_free(lut);
-
- return ret;
+ return 0;
}

static int
--
2.47.3