[PATCH 02/14] common/sfc_efx/base: reduce stack in get addr regions MCDI
Ivan Malov
ivan.malov at arknetworks.am
Tue Aug 11 19:48:09 CEST 2026
From: Andy Moreton <andy.moreton at amd.com>
Code analysis reports an error for excessive stack consumption
(over 1KB). Use a heap allocated payload buffer instead.
Fixes: 60fb370c7bc9 ("common/sfc_efx/base: support NIC DMA memory regions API")
Cc: stable at dpdk.org
Signed-off-by: Andy Moreton <andy.moreton at amd.com>
Reviewed-by: Ivan Malov <ivan.malov at arknetworks.am>
Reviewed-by: Viacheslav Galaktionov <viacheslav.galaktionov at arknetworks.am>
---
drivers/common/sfc_efx/base/efx_mcdi.c | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/drivers/common/sfc_efx/base/efx_mcdi.c b/drivers/common/sfc_efx/base/efx_mcdi.c
index 670b0d5cda..7dc58992be 100644
--- a/drivers/common/sfc_efx/base/efx_mcdi.c
+++ b/drivers/common/sfc_efx/base/efx_mcdi.c
@@ -3439,15 +3439,24 @@ efx_mcdi_get_nic_addr_regions(
__in efx_nic_t *enp,
__out efx_nic_dma_region_info_t *endrip)
{
- EFX_MCDI_DECLARE_BUF(payload, MC_CMD_GET_DESC_ADDR_REGIONS_IN_LEN,
- MC_CMD_GET_DESC_ADDR_REGIONS_OUT_LENMAX_MCDI2);
+ uint8_t *payload = NULL;
efx_xword_t *regions;
efx_mcdi_req_t req;
+ size_t size;
efx_rc_t rc;
size_t alloc_size;
unsigned int nregions;
unsigned int i;
+ size = MAX(MC_CMD_GET_DESC_ADDR_REGIONS_IN_LEN,
+ MC_CMD_GET_DESC_ADDR_REGIONS_OUT_LENMAX_MCDI2);
+
+ EFSYS_KMEM_ALLOC(enp->en_esip, size, payload);
+ if (payload == NULL) {
+ rc = ENOMEM;
+ goto fail1;
+ }
+
req.emr_cmd = MC_CMD_GET_DESC_ADDR_REGIONS;
req.emr_in_buf = payload;
req.emr_in_length = MC_CMD_GET_DESC_ADDR_REGIONS_IN_LEN;
@@ -3458,13 +3467,13 @@ efx_mcdi_get_nic_addr_regions(
if (req.emr_rc != 0) {
rc = req.emr_rc;
- goto fail1;
+ goto fail2;
}
if (req.emr_out_length_used <
MC_CMD_GET_DESC_ADDR_REGIONS_OUT_LENMIN) {
rc = EMSGSIZE;
- goto fail2;
+ goto fail3;
}
nregions = MC_CMD_GET_DESC_ADDR_REGIONS_OUT_REGIONS_NUM(
@@ -3477,7 +3486,7 @@ efx_mcdi_get_nic_addr_regions(
alloc_size = nregions * sizeof(endrip->endri_regions[0]);
if (alloc_size / sizeof (endrip->endri_regions[0]) != nregions) {
rc = ENOMEM;
- goto fail3;
+ goto fail4;
}
EFSYS_KMEM_ALLOC(enp->en_esip,
@@ -3485,7 +3494,7 @@ efx_mcdi_get_nic_addr_regions(
endrip->endri_regions);
if (endrip->endri_regions == NULL) {
rc = ENOMEM;
- goto fail4;
+ goto fail5;
}
endrip->endri_count = nregions;
@@ -3517,14 +3526,19 @@ efx_mcdi_get_nic_addr_regions(
DESC_ADDR_REGION_TRGT_ADDR_ALIGN_LOG2);
}
+ EFSYS_KMEM_FREE(enp->en_esip, size, payload);
+
return (0);
+fail5:
+ EFSYS_PROBE(fail5);
fail4:
EFSYS_PROBE(fail4);
fail3:
EFSYS_PROBE(fail3);
fail2:
EFSYS_PROBE(fail2);
+ EFSYS_KMEM_FREE(enp->en_esip, size, payload);
fail1:
EFSYS_PROBE1(fail1, efx_rc_t, rc);
--
2.47.3
More information about the dev
mailing list