summaryrefslogtreecommitdiff
path: root/block.c
diff options
context:
space:
mode:
authoraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-09-10 15:45:19 +0000
committeraliguori <aliguori@c046a42c-6fe2-441c-8c8c-71466251a162>2008-09-10 15:45:19 +0000
commitbaf35cb90204d75404892aa4e52628ae7a00669b (patch)
tree44d96418e4d0e90c5841692a29743022fbc107c1 /block.c
parent279826619dfb36bac39d8549526a76eabb9d311e (diff)
downloadqemu-baf35cb90204d75404892aa4e52628ae7a00669b.tar.gz
Use signalfd() to work around signal/select race
This patch introduces signalfd() to work around the signal/select race in checking for AIO completions. For platforms that don't support signalfd(), we emulate it with threads. There was a long discussion about this approach. I don't believe there are any fundamental problems with this approach and I believe eliminating the use of signals is a good thing. I've tested Windows and Linux using Windows and Linux guests. I've also checked for disk IO performance regressions. Signed-off-by: Anthony Liguori <aliguori@us.ibm.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5187 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'block.c')
-rw-r--r--block.c14
1 files changed, 4 insertions, 10 deletions
diff --git a/block.c b/block.c
index db8244caaa..a6fd0b1c56 100644
--- a/block.c
+++ b/block.c
@@ -1280,17 +1280,15 @@ static int bdrv_read_em(BlockDriverState *bs, int64_t sector_num,
BlockDriverAIOCB *acb;
async_ret = NOT_DONE;
- qemu_aio_wait_start();
acb = bdrv_aio_read(bs, sector_num, buf, nb_sectors,
bdrv_rw_em_cb, &async_ret);
- if (acb == NULL) {
- qemu_aio_wait_end();
+ if (acb == NULL)
return -1;
- }
+
while (async_ret == NOT_DONE) {
qemu_aio_wait();
}
- qemu_aio_wait_end();
+
return async_ret;
}
@@ -1301,17 +1299,13 @@ static int bdrv_write_em(BlockDriverState *bs, int64_t sector_num,
BlockDriverAIOCB *acb;
async_ret = NOT_DONE;
- qemu_aio_wait_start();
acb = bdrv_aio_write(bs, sector_num, buf, nb_sectors,
bdrv_rw_em_cb, &async_ret);
- if (acb == NULL) {
- qemu_aio_wait_end();
+ if (acb == NULL)
return -1;
- }
while (async_ret == NOT_DONE) {
qemu_aio_wait();
}
- qemu_aio_wait_end();
return async_ret;
}