On 4/26/2024 12:33 PM, Morten Brørup wrote: >> +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. >
Yes, it is wrong, and thanks for removing comparison tip. But thinking twice, taking wrapping into account for a uint64_t variable can be being too cautious anyway. I will remove it completely. > > 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? > stats reset problem? af_packet is not collecting 'rx_mbuf_alloc_failed', so nothing to do there for af_packet. > > BTW, the af_packet PMD doesn't increase the rx_mbuf_alloc_failed counter on > mbuf allocation failures. But that's a separate bug. > Yes it is missing, but I wouldn't call it a bug, just one of the stats is missing. And yes this can be handled separately if required.