From: Andy Moreton <[email protected]>

Code analysis reports an error for excessive stack consumption
(over 1KB). Use a heap allocated payload buffer instead.

Fixes: f2f77453cb9f ("common/sfc_efx/base: fill in software LUT for MAC 
statistics")
Cc: [email protected]

Signed-off-by: Andy Moreton <[email protected]>
Reviewed-by: Ivan Malov <[email protected]>
Reviewed-by: Viacheslav Galaktionov <[email protected]>
---
 drivers/common/sfc_efx/base/efx_np.c | 37 +++++++++++++++++++---------
 1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/drivers/common/sfc_efx/base/efx_np.c 
b/drivers/common/sfc_efx/base/efx_np.c
index 45f3cd07ed..5044eabdd3 100644
--- a/drivers/common/sfc_efx/base/efx_np.c
+++ b/drivers/common/sfc_efx/base/efx_np.c
@@ -778,22 +778,30 @@ efx_np_stats_describe(
        __out_opt                       uint32_t *nprocessedp,
        __out_opt                       uint32_t *nstats_maxp)
 {
-       EFX_MCDI_DECLARE_BUF(payload,
-           MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_LEN,
-           MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMAX_MCDI2);
+       uint8_t *payload = NULL;
        uint32_t nprocessed;
        efx_mcdi_req_t req;
        uint8_t *entries;
        uint32_t stride;
        unsigned int i;
        size_t out_sz;
+       size_t size;
        efx_rc_t rc;
 
-       req.emr_out_length = MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMAX_MCDI2;
-       req.emr_in_length = MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_LEN;
+       size = MAX(MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_LEN,
+           MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMAX_MCDI2);
+
+       EFSYS_KMEM_ALLOC(enp->en_esip, size, payload);
+       if (payload == NULL) {
+               rc = ENOMEM;
+               goto fail1;
+       }
+
        req.emr_cmd = MC_CMD_MAC_STATISTICS_DESCRIPTOR;
-       req.emr_out_buf = payload;
        req.emr_in_buf = payload;
+       req.emr_in_length = MC_CMD_MAC_STATISTICS_DESCRIPTOR_IN_LEN;
+       req.emr_out_buf = payload;
+       req.emr_out_length = MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMAX_MCDI2;
 
        MCDI_IN_SET_DWORD(req, MAC_STATISTICS_DESCRIPTOR_IN_PORT_HANDLE, nph);
        MCDI_IN_SET_DWORD(req, MAC_STATISTICS_DESCRIPTOR_IN_OFFSET, req_ofst);
@@ -802,13 +810,13 @@ efx_np_stats_describe(
 
        if (req.emr_rc != 0) {
                rc = req.emr_rc;
-               goto fail1;
+               goto fail2;
        }
 
        out_sz = req.emr_out_length_used;
        if (out_sz < MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_LENMIN) {
                rc = EMSGSIZE;
-               goto fail2;
+               goto fail3;
        }
 
        if (nstats_maxp != NULL) {
@@ -818,13 +826,13 @@ efx_np_stats_describe(
        }
 
        if (lut_nentries == 0 || lut == NULL || nprocessedp == NULL)
-               return (0);
+               goto out;
 
        stride = MCDI_OUT_DWORD(req, MAC_STATISTICS_DESCRIPTOR_OUT_ENTRY_SIZE);
        nprocessed = MC_CMD_MAC_STATISTICS_DESCRIPTOR_OUT_ENTRIES_NUM(out_sz);
        if (nprocessed == 0) {
                rc = EMSGSIZE;
-               goto fail3;
+               goto fail4;
        }
 
        entries = MCDI_OUT2(req, uint8_t,
@@ -834,14 +842,19 @@ efx_np_stats_describe(
                efx_np_stat_describe(entries + i * stride, lut_nentries, lut);
 
        *nprocessedp = nprocessed;
+
+out:
+       EFSYS_KMEM_FREE(enp->en_esip, size, payload);
+
        return (0);
 
+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);
        return (rc);
-- 
2.47.3

Reply via email to