Currently when the kernel completes a batch of AIO requests and signals it via eventfd, we retrieve at most AIO_MAX events (256), and ignore the rest. Call io_getevents() again in case more events are pending. Reviewed-by: Andre Przywara <andre.przywara@xxxxxxx> Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@xxxxxxx> --- disk/aio.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/disk/aio.c b/disk/aio.c index 007415c69..1fcf36857 100644 --- a/disk/aio.c +++ b/disk/aio.c @@ -66,20 +66,31 @@ ssize_t raw_image__write_async(struct disk_image *disk, u64 sector, offset, disk->evt, param); } -static void *disk_aio_thread(void *param) +static int disk_aio_get_events(struct disk_image *disk) { - struct disk_image *disk = param; struct io_event event[AIO_MAX]; struct timespec notime = {0}; int nr, i; + + do { + nr = io_getevents(disk->ctx, 1, ARRAY_SIZE(event), event, ¬ime); + for (i = 0; i < nr; i++) + disk->disk_req_cb(event[i].data, event[i].res); + } while (nr > 0); + + return 0; +} + +static void *disk_aio_thread(void *param) +{ + struct disk_image *disk = param; u64 dummy; kvm__set_thread_name("disk-image-io"); while (read(disk->evt, &dummy, sizeof(dummy)) > 0) { - nr = io_getevents(disk->ctx, 1, ARRAY_SIZE(event), event, ¬ime); - for (i = 0; i < nr; i++) - disk->disk_req_cb(event[i].data, event[i].res); + if (disk_aio_get_events(disk)) + break; } return NULL; -- 2.21.0