Looking at the i40e driver source code, I think it doesn't conform to the API when requesting small bursts.
Let's say the hardware has received 31 packets. rte_eth_rx_burst(...,16) will return 16 packets and leave 15 in the driver's staging buffer (which has capacity for 32 packets). Time passes, and more packets are received. Now, rte_eth_rx_burst(...,16) will only return the 15 packets from the staging buffer, and not proceed to check for more [1]. It thereby (according to my interpretation of the API description) informs the application that no more packets are ready to be received, which is incorrect. [1]: https://elixir.bootlin.com/dpdk/v25.07-rc2/source/drivers/net/intel/i40e/i40e_rxtx.c#L640 PS: I stumbled across this while reviewing how the very old 32 packet limit bugs (where it truncated large rx/tx requests to 32 packets) had been fixed.