disk/aio: Fix AIO thread
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@arm.com>
Signed-off-by: Jean-Philippe Brucker <jean-philippe.brucker@arm.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
diff --git a/disk/aio.c b/disk/aio.c
index 007415c..1fcf368 100644
--- a/disk/aio.c
+++ b/disk/aio.c
@@ -66,20 +66,31 @@
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;