summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorAnthony Liguori <aliguori@us.ibm.com>2013-01-20 11:01:10 -0600
committerAnthony Liguori <aliguori@us.ibm.com>2013-01-20 11:01:10 -0600
commit8b17ed4caa7e015324a4ecbe3c863e32458d840a (patch)
treee323612dffd78dd4cb75f58f731d208c0bf9ffce /hw
parentb54c2873e731dd6fc81a4591cab909633b5a9eab (diff)
parentcf139388ad5b39228793f34eea99e0ea9a2924aa (diff)
downloadqemu-8b17ed4caa7e015324a4ecbe3c863e32458d840a.tar.gz
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.c9
-rw-r--r--hw/ide/pci.c1
-rw-r--r--hw/virtio-blk.c3
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