util: Some corrections for timespec_diff_us

The comment for timespec_diff_us() claims it will wrap after 2^64µs.  This
is incorrect for two reasons:
  * It returns a long long, which is probably 64-bits, but might not be
  * It returns a signed value, so even if it is 64 bits it will wrap after
    2^63µs

Correct the comment and use an explicitly 64-bit type to avoid that
imprecision.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
David Gibson 2024-08-06 16:18:36 +10:00 committed by Stefano Brivio
parent fbb0c9523e
commit 95569e4aa4
2 changed files with 3 additions and 3 deletions

4
util.c
View file

@ -244,9 +244,9 @@ void sock_probe_mem(struct ctx *c)
* @a: Minuend timestamp * @a: Minuend timestamp
* @b: Subtrahend timestamp * @b: Subtrahend timestamp
* *
* Return: difference in microseconds (wraps after 2^64 / 10^6s ~= 585k years) * Return: difference in microseconds (wraps after 2^63 / 10^6s ~= 292k years)
*/ */
long long timespec_diff_us(const struct timespec *a, const struct timespec *b) int64_t timespec_diff_us(const struct timespec *a, const struct timespec *b)
{ {
if (a->tv_nsec < b->tv_nsec) { if (a->tv_nsec < b->tv_nsec) {
return (b->tv_nsec - a->tv_nsec) / 1000 + return (b->tv_nsec - a->tv_nsec) / 1000 +

2
util.h
View file

@ -168,7 +168,7 @@ int sock_l4(const struct ctx *c, sa_family_t af, enum epoll_type type,
uint32_t data); uint32_t data);
void sock_probe_mem(struct ctx *c); void sock_probe_mem(struct ctx *c);
long timespec_diff_ms(const struct timespec *a, const struct timespec *b); long timespec_diff_ms(const struct timespec *a, const struct timespec *b);
long long timespec_diff_us(const struct timespec *a, const struct timespec *b); int64_t timespec_diff_us(const struct timespec *a, const struct timespec *b);
void bitmap_set(uint8_t *map, unsigned bit); void bitmap_set(uint8_t *map, unsigned bit);
void bitmap_clear(uint8_t *map, unsigned bit); void bitmap_clear(uint8_t *map, unsigned bit);
bool bitmap_isset(const uint8_t *map, unsigned bit); bool bitmap_isset(const uint8_t *map, unsigned bit);