[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 11/15] ssh: support I/O from any AioContext
From: |
Fam Zheng |
Subject: |
[Qemu-devel] [PULL 11/15] ssh: support I/O from any AioContext |
Date: |
Mon, 17 Jul 2017 11:48:21 +0800 |
From: Paolo Bonzini <address@hidden>
The coroutine may run in a different AioContext, causing the
fd handler to busy wait. Fix this by resetting the handler
in restart_coroutine, before the coroutine is restarted.
Reviewed-by: Stefan Hajnoczi <address@hidden>
Reviewed-by: Fam Zheng <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Fam Zheng <address@hidden>
---
block/ssh.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
diff --git a/block/ssh.c b/block/ssh.c
index 07a57eb..e8f0404 100644
--- a/block/ssh.c
+++ b/block/ssh.c
@@ -888,13 +888,22 @@ static int ssh_has_zero_init(BlockDriverState *bs)
return has_zero_init;
}
+typedef struct BDRVSSHRestart {
+ BlockDriverState *bs;
+ Coroutine *co;
+} BDRVSSHRestart;
+
static void restart_coroutine(void *opaque)
{
- Coroutine *co = opaque;
+ BDRVSSHRestart *restart = opaque;
+ BlockDriverState *bs = restart->bs;
+ BDRVSSHState *s = bs->opaque;
+ AioContext *ctx = bdrv_get_aio_context(bs);
- DPRINTF("co=%p", co);
+ DPRINTF("co=%p", restart->co);
+ aio_set_fd_handler(ctx, s->sock, false, NULL, NULL, NULL, NULL);
- aio_co_wake(co);
+ aio_co_wake(restart->co);
}
/* A non-blocking call returned EAGAIN, so yield, ensuring the
@@ -905,7 +914,10 @@ static coroutine_fn void co_yield(BDRVSSHState *s,
BlockDriverState *bs)
{
int r;
IOHandler *rd_handler = NULL, *wr_handler = NULL;
- Coroutine *co = qemu_coroutine_self();
+ BDRVSSHRestart restart = {
+ .bs = bs,
+ .co = qemu_coroutine_self()
+ };
r = libssh2_session_block_directions(s->session);
@@ -920,11 +932,9 @@ static coroutine_fn void co_yield(BDRVSSHState *s,
BlockDriverState *bs)
rd_handler, wr_handler);
aio_set_fd_handler(bdrv_get_aio_context(bs), s->sock,
- false, rd_handler, wr_handler, NULL, co);
+ false, rd_handler, wr_handler, NULL, &restart);
qemu_coroutine_yield();
DPRINTF("s->sock=%d - back", s->sock);
- aio_set_fd_handler(bdrv_get_aio_context(bs), s->sock, false,
- NULL, NULL, NULL, NULL);
}
/* SFTP has a function `libssh2_sftp_seek64' which seeks to a position
--
2.9.4
- [Qemu-devel] [PULL 02/15] coroutine-lock: add qemu_co_rwlock_downgrade and qemu_co_rwlock_upgrade, (continued)
- [Qemu-devel] [PULL 02/15] coroutine-lock: add qemu_co_rwlock_downgrade and qemu_co_rwlock_upgrade, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 03/15] vdi: make it thread-safe, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 04/15] vpc: make it thread-safe, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 05/15] vvfat: make it thread-safe, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 06/15] qed: move tail of qed_aio_write_main to qed_aio_write_{cow, alloc}, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 08/15] qed: introduce bdrv_qed_init_state, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 07/15] block: invoke .bdrv_drain callback in coroutine context and from AioContext, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 09/15] qed: protect table cache with CoMutex, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 12/15] docker: Don't enable networking as a side-effect of DEBUG=1, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 13/15] docker.py: Drop infile parameter, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 11/15] ssh: support I/O from any AioContext,
Fam Zheng <=
- [Qemu-devel] [PULL 10/15] sheepdog: add queue_lock, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 14/15] docker.py: Improve subprocess exit code handling, Fam Zheng, 2017/07/16
- [Qemu-devel] [PULL 15/15] travis: add no-TCG build, Fam Zheng, 2017/07/16
- Re: [Qemu-devel] [PULL 00/15] Block and testing patches, Peter Maydell, 2017/07/17