Stefan Hajnoczi wrote: > Drop the assumption that we're using the main AioContext for Linux > AIO. Convert qemu_aio_set_fd_handler() to aio_set_fd_handler() and > timer_new_ms() to aio_timer_new(). > > The .bdrv_detach/attach_aio_context() interfaces also need to be > implemented to move the fd and timer from the old to the new AioContext. > > Cc: Peter Lieven <p...@kamp.de> > Cc: Ronnie Sahlberg <ronniesahlb...@gmail.com> > Signed-off-by: Stefan Hajnoczi <stefa...@redhat.com> > --- > block/iscsi.c | 79 > +++++++++++++++++++++++++++++++++++++++++------------------ > 1 file changed, 55 insertions(+), 24 deletions(-) > > diff --git a/block/iscsi.c b/block/iscsi.c > index a30202b..81e3ebd 100644 > --- a/block/iscsi.c > +++ b/block/iscsi.c > @@ -47,6 +47,7 @@ > > typedef struct IscsiLun { > struct iscsi_context *iscsi; > + AioContext *aio_context; > int lun; > enum scsi_inquiry_peripheral_device_type type; > int block_size; > @@ -69,6 +70,7 @@ typedef struct IscsiTask { > struct scsi_task *task; > Coroutine *co; > QEMUBH *bh; > + AioContext *aio_context; > } IscsiTask; > > typedef struct IscsiAIOCB { > @@ -120,7 +122,7 @@ iscsi_schedule_bh(IscsiAIOCB *acb) > if (acb->bh) { > return; > } > - acb->bh = qemu_bh_new(iscsi_bh_cb, acb); > + acb->bh = aio_bh_new(acb->iscsilun->aio_context, iscsi_bh_cb, acb); > qemu_bh_schedule(acb->bh); > } > > @@ -156,7 +158,7 @@ iscsi_co_generic_cb(struct iscsi_context *iscsi, int > status, > > out: > if (iTask->co) { > - iTask->bh = qemu_bh_new(iscsi_co_generic_bh_cb, iTask); > + iTask->bh = aio_bh_new(iTask->aio_context, > iscsi_co_generic_bh_cb, iTask); > qemu_bh_schedule(iTask->bh); > } > } > @@ -164,8 +166,9 @@ out: > static void iscsi_co_init_iscsitask(IscsiLun *iscsilun, struct IscsiTask > *iTask) > { > *iTask = (struct IscsiTask) { > - .co = qemu_coroutine_self(), > - .retries = ISCSI_CMD_RETRIES, > + .co = qemu_coroutine_self(),%