[RFC] net/af_packet: make stats reset reliable
Mattias Rönnblom
hofors at lysator.liu.se
Sun Apr 28 17:42:18 CEST 2024
On 2024-04-26 13:33, 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.
>
With 64-bit counters, will they ever wrap? If you constantly run 100
Gbps it'll take > 1000 years before the byte counter wrap.
> 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.
>
More information about the dev
mailing list