Message ID | 20250105213036.288356-2-atomlin@atomlin.com (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | vmxnet3: Adjust maximum Rx ring buffer size | expand |
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
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(+)