[PATCH] staging: octeon: fix FPA output buffer pool leak on teardown
From: Oscar Alejandro Sánchez Lucero via B4 Relay
Date: Sun Nov 08 2026 - 07:24:21 EST
From: Oscar Alejandro Sánchez Lucero <aleszlucero@xxxxxxxxx>
cvm_oct_configure_common_hw() allocates 1024 buffers for
CVMX_FPA_OUTPUT_BUFFER_POOL, but both the probe error path and
cvm_oct_remove() only free 128 buffers when calling
cvm_oct_mem_empty_fpa(), leaking 896 buffers on driver teardown.
Define OCTEON_NUM_OUTPUT_BUFFERS as 1024 and use it consistently when
filling and emptying CVMX_FPA_OUTPUT_BUFFER_POOL.
Signed-off-by: Oscar Alejandro Sánchez Lucero <aleszlucero@xxxxxxxxx>
---
This patch resolves a resource management bug causing physical hardware buffer
leaks upon driver failure rollbacks and module extraction.
1. Introduce OCTEON_NUM_OUTPUT_BUFFERS to consistently fill and empty 1024
buffers within CVMX_FPA_OUTPUT_BUFFER_POOL, avoiding an 896 buffer leak.
Oscar Alejandro Sánchez Lucero (1):
staging: octeon: fix FPA output buffer pool leak on teardown
---
drivers/staging/octeon/ethernet.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
diff --git a/drivers/staging/octeon/ethernet.c b/drivers/staging/octeon/ethernet.c
index 42ec4b8324a8..a74d122d9bb1 100644
--- a/drivers/staging/octeon/ethernet.c
+++ b/drivers/staging/octeon/ethernet.c
@@ -29,6 +29,7 @@
#include "ethernet-util.h"
#define OCTEON_MAX_MTU 65392
+#define OCTEON_NUM_OUTPUT_BUFFERS 1024
static int num_packet_buffers = 1024;
module_param(num_packet_buffers, int, 0444);
@@ -162,7 +163,8 @@ static void cvm_oct_configure_common_hw(struct platform_device *pdev)
num_packet_buffers);
if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL)
cvm_oct_mem_fill_fpa(pdev, CVMX_FPA_OUTPUT_BUFFER_POOL,
- CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, 1024);
+ CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE,
+ OCTEON_NUM_OUTPUT_BUFFERS);
#ifdef __LITTLE_ENDIAN
{
@@ -974,7 +976,8 @@ static int cvm_oct_probe(struct platform_device *pdev)
num_packet_buffers);
if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL)
cvm_oct_mem_empty_fpa(pdev, CVMX_FPA_OUTPUT_BUFFER_POOL,
- CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, 128);
+ CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE,
+ OCTEON_NUM_OUTPUT_BUFFERS);
return ret;
}
@@ -1009,7 +1012,8 @@ static void cvm_oct_remove(struct platform_device *pdev)
num_packet_buffers);
if (CVMX_FPA_OUTPUT_BUFFER_POOL != CVMX_FPA_PACKET_POOL)
cvm_oct_mem_empty_fpa(pdev, CVMX_FPA_OUTPUT_BUFFER_POOL,
- CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE, 128);
+ CVMX_FPA_OUTPUT_BUFFER_POOL_SIZE,
+ OCTEON_NUM_OUTPUT_BUFFERS);
}
static const struct of_device_id cvm_oct_match[] = {
---
base-commit: ddfe51b0a0f5dc9e415cc2c8ad8db17532dd426b
change-id: 20261108-octeon-fpa-leak-fix-v1-a1d31e978c82
Best regards,
--
Oscar Alejandro Sánchez Lucero <aleszlucero@xxxxxxxxx>