[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 4/6] ide: orphan all buffered requests on DMA cancel
From: |
John Snow |
Subject: |
[Qemu-devel] [PULL 4/6] ide: orphan all buffered requests on DMA cancel |
Date: |
Tue, 17 Nov 2015 15:12:53 -0500 |
From: Peter Lieven <address@hidden>
If the guests canceles a DMA request we can prematurely
invoke all callbacks of buffered requests and flag all them
as orphaned. Ideally this avoids the need for draining all
requests. For CDROM devices this works in 100% of all cases.
Signed-off-by: Peter Lieven <address@hidden>
Reviewed-by: Fam Zheng <address@hidden>
Message-id: address@hidden
Signed-off-by: John Snow <address@hidden>
---
hw/ide/pci.c | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/hw/ide/pci.c b/hw/ide/pci.c
index 9c54b37..37dbc29 100644
--- a/hw/ide/pci.c
+++ b/hw/ide/pci.c
@@ -233,6 +233,22 @@ void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val)
/* Ignore writes to SSBM if it keeps the old value */
if ((val & BM_CMD_START) != (bm->cmd & BM_CMD_START)) {
if (!(val & BM_CMD_START)) {
+ /* First invoke the callbacks of all buffered requests
+ * and flag those requests as orphaned. Ideally there
+ * are no unbuffered (Scatter Gather DMA Requests or
+ * write requests) pending and we can avoid to drain. */
+ IDEBufferedRequest *req;
+ IDEState *s = idebus_active_if(bm->bus);
+ QLIST_FOREACH(req, &s->buffered_requests, list) {
+ if (!req->orphaned) {
+#ifdef DEBUG_IDE
+ printf("%s: invoking cb %p of buffered request %p with"
+ " -ECANCELED\n", __func__, req->original_cb, req);
+#endif
+ req->original_cb(req->original_opaque, -ECANCELED);
+ }
+ req->orphaned = true;
+ }
/*
* We can't cancel Scatter Gather DMA in the middle of the
* operation or a partial (not full) DMA transfer would reach
@@ -246,6 +262,9 @@ void bmdma_cmd_writeb(BMDMAState *bm, uint32_t val)
* aio operation with preadv/pwritev.
*/
if (bm->bus->dma->aiocb) {
+#ifdef DEBUG_IDE
+ printf("%s: draining all remaining requests", __func__);
+#endif
blk_drain_all();
assert(bm->bus->dma->aiocb == NULL);
}
--
2.4.3
- [Qemu-devel] [PULL 3/6] ahci/qtest: don't use tcp sockets for migration tests, (continued)
- [Qemu-devel] [PULL 3/6] ahci/qtest: don't use tcp sockets for migration tests, John Snow, 2015/11/13
- [Qemu-devel] [PULL 5/6] libqos: add qemu-img presence check, John Snow, 2015/11/13
- [Qemu-devel] [PULL 6/6] qtest/ahci: use raw format when qemu-img is absent, John Snow, 2015/11/13
- Re: [Qemu-devel] [PULL 0/6] Ide patches, Peter Maydell, 2015/11/16
- [Qemu-devel] [PULL 0/6] Ide patches, John Snow, 2015/11/17
- [Qemu-devel] [PULL 2/6] block: add blk_abort_aio_request, John Snow, 2015/11/17
- [Qemu-devel] [PULL 1/6] ide/atapi: make PIO read requests async, John Snow, 2015/11/17
- [Qemu-devel] [PULL 6/6] ide: enable buffered requests for PIO read requests, John Snow, 2015/11/17
- [Qemu-devel] [PULL 4/6] ide: orphan all buffered requests on DMA cancel,
John Snow <=
- [Qemu-devel] [PULL 3/6] ide: add support for IDEBufferedRequest, John Snow, 2015/11/17
- [Qemu-devel] [PULL 5/6] ide: enable buffered requests for ATAPI devices, John Snow, 2015/11/17
- Re: [Qemu-devel] [PULL 0/6] Ide patches, Peter Maydell, 2015/11/18