> +static uint64_t > +stats_get_diff(uint64_t stats, uint64_t offset) > +{ > + if (stats >= offset) > + return stats - offset; > + /* unlikely wraparound case */ > + return UINT64_MAX + stats - offset;
The numbers are unsigned, so wrapping comes for free. Remove the comparison and always return stats - offset. Using uint8_t for easier explanation, if offset is 255 and stats is 0, then the diff should be 1. Returning stats - offset: stats - offset = 0 - 255 = 0 - 0xFF = 1. Returning UINT8_MAX + stats - offset is wrong: UINT8_MAX + stats - offset = 255 - 0 - 255 = 0. Besides that, it looks good to me. While reviewing, I came across the rx_mbuf_alloc_failed counter in the rte_eth_dev_data structure: https://elixir.bootlin.com/dpdk/v24.03/source/lib/ethdev/rte_ethdev.c#L3145 https://elixir.bootlin.com/dpdk/v24.03/source/lib/ethdev/ethdev_driver.h#L127 Doesn't it have the same problem? BTW, the af_packet PMD doesn't increase the rx_mbuf_alloc_failed counter on mbuf allocation failures. But that's a separate bug.