[RFC PATCH 1/1] vmxnet3: Adjust maximum Rx ring buffer size

Aaron Tomlin
2025-01-05T21:30:43Z

In the context of vmxnet3_rq_create(), the Rx Data ring's size is
calculated by multiplying the size of Ring 0 by the size of the Rx ring
buffer. See __dma_direct_alloc_pages(). Now if CMA (Contiguous Memory
Allocator) is not available or the allocation attempt failed, the zone
buddy allocator is used to try to allocate physically contiguous memory.

The problem is, when the maximum supported Ring 0 and Rx ring buffer size
is selected, the page-order required to accommodate the new size of the
Rx Data ring is greater than the default MAX_PAGE_ORDER (10)
i.e. __get_order(4096 * 2048) == 11. Consequently, this request can
trigger the following warning condition in __alloc_pages_noprof():

if (WARN_ON_ONCE_GFP(order > MAX_PAGE_ORDER, gfp))
return NULL;

This patch ensures that the maximum Rx ring buffer size is reduced under
a Linux kernel without CMA (Contiguous Memory Allocator) support.
There is no point attempting a large memory allocation request that
could exceed the maximum page-order supported by the system.

Signed-off-by: Aaron Tomlin <atomlin@atomlin.com>
---
drivers/net/vmxnet3/vmxnet3_defs.h | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/drivers/net/vmxnet3/vmxnet3_defs.h b/drivers/net/vmxnet3/vmxnet3_defs.h
index 5c5148768039..cc71e697a5f3 100644
--- a/drivers/net/vmxnet3/vmxnet3_defs.h
+++ b/drivers/net/vmxnet3/vmxnet3_defs.h
@@ -466,7 +466,11 @@ union Vmxnet3_GenericDesc {
#define VMXNET3_TXDATA_DESC_MIN_SIZE 128
#define VMXNET3_TXDATA_DESC_MAX_SIZE 2048

+#if defined(CONFIG_DMA_CMA)
#define VMXNET3_RXDATA_DESC_MAX_SIZE 2048
+#else
+#define VMXNET3_RXDATA_DESC_MAX_SIZE 1024
+#endif

#define VMXNET3_TXTS_DESC_MAX_SIZE 256
#define VMXNET3_RXTS_DESC_MAX_SIZE 256
--
2.47.1