[PATCH v2 02/14] common/sfc_efx/base: reduce stack in get addr regions MCDI
From: Ivan Malov <hidden>
Date: 2026-08-12 17:09:02
Subsystem:
the rest · Maintainer:
Linus Torvalds
From: Andy Moreton <redacted>
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@dpdk.org
Signed-off-by: Andy Moreton <redacted>
Reviewed-by: Ivan Malov <redacted>
Reviewed-by: Viacheslav Galaktionov <redacted>
---
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