diff options
-rw-r--r-- | src/drivers/net/gve.c | 1 | ||||
-rw-r--r-- | src/drivers/net/gve.h | 17 |
2 files changed, 13 insertions, 5 deletions
diff --git a/src/drivers/net/gve.c b/src/drivers/net/gve.c index 03edc0899..7f86dd219 100644 --- a/src/drivers/net/gve.c +++ b/src/drivers/net/gve.c @@ -722,6 +722,7 @@ static int gve_alloc_qpl ( struct gve_nic *gve, struct gve_qpl *qpl, /* Calculate number of pages required */ build_assert ( GVE_BUF_SIZE <= GVE_PAGE_SIZE ); qpl->count = ( ( buffers + GVE_BUF_PER_PAGE - 1 ) / GVE_BUF_PER_PAGE ); + assert ( qpl->count <= GVE_QPL_MAX ); /* Allocate pages (as a single block) */ len = ( qpl->count * GVE_PAGE_SIZE ); diff --git a/src/drivers/net/gve.h b/src/drivers/net/gve.h index 2845699ac..247d6e699 100644 --- a/src/drivers/net/gve.h +++ b/src/drivers/net/gve.h @@ -59,9 +59,6 @@ struct google_mac { */ #define GVE_LEN_ALIGN 64 -/** Maximum number of pages per queue (must be a power of two) */ -#define GVE_QPL_MAX 16 - /** Configuration BAR */ #define GVE_CFG_BAR PCI_BASE_ADDRESS_0 @@ -208,6 +205,14 @@ struct gve_admin_register { uint64_t size; } __attribute__ (( packed )); +/** + * Maximum number of pages per queue + * + * This is a policy decision. Must be sufficient to allow for both + * the transmit and receive queue fill levels. + */ +#define GVE_QPL_MAX 32 + /** Page list */ struct gve_pages { /** Page address */ @@ -538,9 +543,11 @@ struct gve_tx_descriptor { /** * Maximum number of receive buffers * - * This is a policy decision. + * This is a policy decision. Experiments suggest that using fewer + * than 64 receive buffers leads to excessive packet drop rates on + * some instance types. */ -#define GVE_RX_FILL 16 +#define GVE_RX_FILL 64 /** Receive queue page list ID */ #define GVE_RX_QPL 0x18ae5258 |