From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MW3Zr-0007bn-2N for qemu-devel@nongnu.org; Wed, 29 Jul 2009 03:27:55 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MW3Zm-0007TN-7Y for qemu-devel@nongnu.org; Wed, 29 Jul 2009 03:27:54 -0400 Received: from [199.232.76.173] (port=59621 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MW3Zl-0007T7-TO for qemu-devel@nongnu.org; Wed, 29 Jul 2009 03:27:49 -0400 Received: from mx20.gnu.org ([199.232.41.8]:39327) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1MW3Zl-0005hk-94 for qemu-devel@nongnu.org; Wed, 29 Jul 2009 03:27:49 -0400 Received: from mx2.redhat.com ([66.187.237.31]) by mx20.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MW3Zk-0001By-2B for qemu-devel@nongnu.org; Wed, 29 Jul 2009 03:27:48 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n6T7Rk1K018556 for ; Wed, 29 Jul 2009 03:27:46 -0400 Date: Wed, 29 Jul 2009 10:27:43 +0300 From: Gleb Natapov Message-ID: <20090729072743.GH30449@redhat.com> References: <87zlavax3m.fsf@pike.pond.sub.org> <871vo26jsh.fsf@pike.pond.sub.org> <87y6q8ws5t.fsf_-_@pike.pond.sub.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <87y6q8ws5t.fsf_-_@pike.pond.sub.org> Subject: [Qemu-devel] Re: [PATCH] Fix VM state change handlers running out of order List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Markus Armbruster Cc: qemu-devel@nongnu.org On Tue, Jul 28, 2009 at 02:33:41PM -0400, Markus Armbruster wrote: > Fix this by moving the actual write from each VM state change handler > into a new bottom half (suggested by Gleb Natapov). > This is exactly what I meant. Thanks. > Signed-off-by: Markus Armbruster Acked-by: Gleb Natapov > --- > hw/ide.c | 22 +++++++++++++++++++--- > hw/scsi-disk.c | 21 ++++++++++++++++++--- > hw/virtio-blk.c | 20 +++++++++++++++++--- > 3 files changed, 54 insertions(+), 9 deletions(-) > > diff --git a/hw/ide.c b/hw/ide.c > index 1e56786..2eea438 100644 > --- a/hw/ide.c > +++ b/hw/ide.c > @@ -501,6 +501,7 @@ typedef struct BMDMAState { > QEMUIOVector qiov; > int64_t sector_num; > uint32_t nsector; > + QEMUBH *bh; > } BMDMAState; > > typedef struct PCIIDEState { > @@ -1109,11 +1110,13 @@ static void ide_sector_write(IDEState *s) > } > } > > -static void ide_dma_restart_cb(void *opaque, int running, int reason) > +static void ide_dma_restart_bh(void *opaque) > { > BMDMAState *bm = opaque; > - if (!running) > - return; > + > + qemu_bh_delete(bm->bh); > + bm->bh = NULL; > + > if (bm->status & BM_STATUS_DMA_RETRY) { > bm->status &= ~BM_STATUS_DMA_RETRY; > ide_dma_restart(bm->ide_if); > @@ -1123,6 +1126,19 @@ static void ide_dma_restart_cb(void *opaque, int running, int reason) > } > } > > +static void ide_dma_restart_cb(void *opaque, int running, int reason) > +{ > + BMDMAState *bm = opaque; > + > + if (!running) > + return; > + > + if (!bm->bh) { > + bm->bh = qemu_bh_new(ide_dma_restart_bh, bm); > + qemu_bh_schedule(bm->bh); > + } > +} > + > static void ide_write_dma_cb(void *opaque, int ret) > { > BMDMAState *bm = opaque; > diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c > index 8b6426f..5b825c9 100644 > --- a/hw/scsi-disk.c > +++ b/hw/scsi-disk.c > @@ -74,6 +74,7 @@ struct SCSIDeviceState > scsi_completionfn completion; > void *opaque; > char drive_serial_str[21]; > + QEMUBH *bh; > }; > > /* Global pool of SCSIRequest structures. */ > @@ -308,12 +309,13 @@ static int scsi_write_data(SCSIDevice *d, uint32_t tag) > return 0; > } > > -static void scsi_dma_restart_cb(void *opaque, int running, int reason) > +static void scsi_dma_restart_bh(void *opaque) > { > SCSIDeviceState *s = opaque; > SCSIRequest *r = s->requests; > - if (!running) > - return; > + > + qemu_bh_delete(s->bh); > + s->bh = NULL; > > while (r) { > if (r->status & SCSI_REQ_STATUS_RETRY) { > @@ -324,6 +326,19 @@ static void scsi_dma_restart_cb(void *opaque, int running, int reason) > } > } > > +static void scsi_dma_restart_cb(void *opaque, int running, int reason) > +{ > + SCSIDeviceState *s = opaque; > + > + if (!running) > + return; > + > + if (!s->bh) { > + s->bh = qemu_bh_new(scsi_dma_restart_bh, s); > + qemu_bh_schedule(s->bh); > + } > +} > + > /* Return a pointer to the data buffer. */ > static uint8_t *scsi_get_buf(SCSIDevice *d, uint32_t tag) > { > diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c > index 2beff52..5036b5b 100644 > --- a/hw/virtio-blk.c > +++ b/hw/virtio-blk.c > @@ -26,6 +26,7 @@ typedef struct VirtIOBlock > VirtQueue *vq; > void *rq; > char serial_str[BLOCK_SERIAL_STRLEN + 1]; > + QEMUBH *bh; > } VirtIOBlock; > > static VirtIOBlock *to_virtio_blk(VirtIODevice *vdev) > @@ -302,13 +303,13 @@ static void virtio_blk_handle_output(VirtIODevice *vdev, VirtQueue *vq) > */ > } > > -static void virtio_blk_dma_restart_cb(void *opaque, int running, int reason) > +static void virtio_blk_dma_restart_bh(void *opaque) > { > VirtIOBlock *s = opaque; > VirtIOBlockReq *req = s->rq; > > - if (!running) > - return; > + qemu_bh_delete(s->bh); > + s->bh = NULL; > > s->rq = NULL; > > @@ -318,6 +319,19 @@ static void virtio_blk_dma_restart_cb(void *opaque, int running, int reason) > } > } > > +static void virtio_blk_dma_restart_cb(void *opaque, int running, int reason) > +{ > + VirtIOBlock *s = opaque; > + > + if (!running) > + return; > + > + if (!s->bh) { > + s->bh = qemu_bh_new(virtio_blk_dma_restart_bh, s); > + qemu_bh_schedule(s->bh); > + } > +} > + > static void virtio_blk_reset(VirtIODevice *vdev) > { > /* > -- > 1.6.2.5 -- Gleb.