By directly using test_and_clear_bit() from the "bitops.h" API, we can remove the bitmap[] variable-length array copy on the stack and the complex manual bit testing/clearing logic.
Suggested-by: Stefan Hajnoczi <stefa...@redhat.com> Signed-off-by: Philippe Mathieu-Daudé <phi...@redhat.com> --- hw/block/dataplane/virtio-blk.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/hw/block/dataplane/virtio-blk.c b/hw/block/dataplane/virtio-blk.c index e9050c8987e..25d9b10c02b 100644 --- a/hw/block/dataplane/virtio-blk.c +++ b/hw/block/dataplane/virtio-blk.c @@ -59,23 +59,12 @@ void virtio_blk_data_plane_notify(VirtIOBlockDataPlane *s, VirtQueue *vq) static void notify_guest_bh(void *opaque) { VirtIOBlockDataPlane *s = opaque; - unsigned nvqs = s->conf->num_queues; - unsigned long bitmap[BITS_TO_LONGS(nvqs)]; - unsigned j; - memcpy(bitmap, s->batch_notify_vqs, sizeof(bitmap)); - memset(s->batch_notify_vqs, 0, sizeof(bitmap)); - - for (j = 0; j < nvqs; j += BITS_PER_LONG) { - unsigned long bits = bitmap[j / BITS_PER_LONG]; - - while (bits != 0) { - unsigned i = j + ctzl(bits); + for (unsigned i = 0; i < s->conf->num_queues; i++) { + if (test_and_clear_bit(i, s->batch_notify_vqs)) { VirtQueue *vq = virtio_get_queue(s->vdev, i); virtio_notify_irqfd(s->vdev, vq); - - bits &= bits - 1; /* clear right-most bit */ } } } -- 2.26.3