From 149aa845b11bd13fca41dcf65b51283f83ac5520 Mon Sep 17 00:00:00 2001 From: William Henderson Date: Wed, 23 Aug 2023 09:38:30 +0100 Subject: fix: incorrect number of dirty pages printed (#766) The `log_dirty_bitmap` function in `dma.c` would output the wrong number of dirty pages due to the `char` of the bitmap being sign-extended when implicitly being converted to `unsigned int` for `__builtin_popcount`. By adding an intermediate cast to `uint8_t` we avoid this incorrect behaviour. See https://github.com/nutanix/libvfio-user/pull/746#discussion_r1297173318. Signed-off-by: William Henderson --- lib/dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/dma.c b/lib/dma.c index af1495f..9ca34d0 100644 --- a/lib/dma.c +++ b/lib/dma.c @@ -535,7 +535,7 @@ log_dirty_bitmap(vfu_ctx_t *vfu_ctx, dma_memory_region_t *region, size_t i; size_t count; for (i = 0, count = 0; i < size; i++) { - count += __builtin_popcount(bitmap[i]); + count += __builtin_popcount((uint8_t)bitmap[i]); } vfu_log(vfu_ctx, LOG_DEBUG, "dirty pages: get [%p, %p), %zu dirty pages", region->info.iova.iov_base, iov_end(®ion->info.iova), -- cgit v1.1