diff options
author | Anthony Liguori <aliguori@us.ibm.com> | 2013-01-20 11:01:10 -0600 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2013-01-20 11:01:10 -0600 |
commit | 8b17ed4caa7e015324a4ecbe3c863e32458d840a (patch) | |
tree | e323612dffd78dd4cb75f58f731d208c0bf9ffce /hw | |
parent | b54c2873e731dd6fc81a4591cab909633b5a9eab (diff) | |
parent | cf139388ad5b39228793f34eea99e0ea9a2924aa (diff) | |
download | qemu-8b17ed4caa7e015324a4ecbe3c863e32458d840a.tar.gz qemu-8b17ed4caa7e015324a4ecbe3c863e32458d840a.tar.bz2 qemu-8b17ed4caa7e015324a4ecbe3c863e32458d840a.zip |
Merge remote-tracking branch 'stefanha/block' into staging
# By Kevin Wolf (4) and others
# Via Stefan Hajnoczi
* stefanha/block:
dataplane: support viostor virtio-pci status bit setting
dataplane: avoid reentrancy during virtio_blk_data_plane_stop()
win32-aio: use iov utility functions instead of open-coding them
win32-aio: Fix memory leak
win32-aio: Fix vectored reads
aio: Fix return value of aio_poll()
ide: Remove wrong assertion
block: fix null-pointer bug on error case in block commit
Diffstat (limited to 'hw')
-rw-r--r-- | hw/dataplane/virtio-blk.c | 9 | ||||
-rw-r--r-- | hw/ide/pci.c | 1 | ||||
-rw-r--r-- | hw/virtio-blk.c | 3 |
3 files changed, 8 insertions, 5 deletions
diff --git a/hw/dataplane/virtio-blk.c b/hw/dataplane/virtio-blk.c index 4b26faa6c2..3f2da22669 100644 --- a/hw/dataplane/virtio-blk.c +++ b/hw/dataplane/virtio-blk.c @@ -40,6 +40,7 @@ typedef struct { struct VirtIOBlockDataPlane { bool started; + bool stopping; QEMUBH *start_bh; QemuThread thread; @@ -357,7 +358,7 @@ static void *data_plane_thread(void *opaque) do { event_poll(&s->event_poll); - } while (s->started || s->num_reqs > 0); + } while (!s->stopping || s->num_reqs > 0); return NULL; } @@ -486,10 +487,10 @@ void virtio_blk_data_plane_start(VirtIOBlockDataPlane *s) void virtio_blk_data_plane_stop(VirtIOBlockDataPlane *s) { - if (!s->started) { + if (!s->started || s->stopping) { return; } - s->started = false; + s->stopping = true; trace_virtio_blk_data_plane_stop(s); /* Stop thread or cancel pending thread creation BH */ @@ -511,4 +512,6 @@ void virtio_blk_data_plane_stop(VirtIOBlockDataPlane *s) s->vdev->binding->set_guest_notifiers(s->vdev->binding_opaque, 1, false); vring_teardown(&s->vring); + s->started = false; + s->stopping = false; } diff --git a/hw/ide/pci.c b/hw/ide/pci.c index e6226e3197..59fd53992a 100644 --- a/hw/ide/pci.c +++ b/hw/ide/pci.c @@ -311,7 +311,6 @@ void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val) if (bm->bus->dma->aiocb) { bdrv_drain_all(); assert(bm->bus->dma->aiocb == NULL); - assert((bm->status & BM_STATUS_DMAING) == 0); } } else { bm->cur_addr = bm->addr; diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index df57b35f1b..34913ee40e 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -571,7 +571,8 @@ static void virtio_blk_set_status(VirtIODevice *vdev, uint8_t status) uint32_t features; #ifdef CONFIG_VIRTIO_BLK_DATA_PLANE - if (s->dataplane && !(status & VIRTIO_CONFIG_S_DRIVER)) { + if (s->dataplane && !(status & (VIRTIO_CONFIG_S_DRIVER | + VIRTIO_CONFIG_S_DRIVER_OK))) { virtio_blk_data_plane_stop(s->dataplane); } #endif |