summaryrefslogtreecommitdiffstats
path: root/hw/ide/core.c
diff options
context:
space:
mode:
authorPavel Butsykin <pbutsykin@virtuozzo.com>2016-04-12 16:47:52 -0400
committerTimothy Pearson <tpearson@raptorengineering.com>2019-11-29 20:03:49 -0600
commitec8745c33397227d2d33c538d39f955d038a6955 (patch)
tree0c995d8369d6b6d93b84a669f22b67918a0cc019 /hw/ide/core.c
parentcde9b1973def50fa21585b39daeed1050244408d (diff)
downloadhqemu-ec8745c33397227d2d33c538d39f955d038a6955.zip
hqemu-ec8745c33397227d2d33c538d39f955d038a6955.tar.gz
ide: don't lose pending dma state
If the migration occurs after the IDE DMA has been set up but before it has been initiated, the state gets lost upon save/restore. Specifically, ->dma_cb callback gets cleared, so, when the guest eventually starts bus mastering, the DMA never completes, causing the guest to time out the operation. OTOH all the infrastructure is already in place to restart the DMA if the migration happens while the DMA is in progress. So reuse that infrastructure, by setting bus->error_status based on ->dma_cmd in pre_save if ->dma_cb callback is already set but DMAING is clear. This will indicate the need for restart and make sure ->dma_cb is restored in ide_restart_bh(); howeover since DMAING is clear the state upon restore will be exactly "ready for DMA" as before the save. Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com> Reviewed-by: Roman Kagan <rkagan@virtuozzo.com> Signed-off-by: Denis V. Lunev <den@openvz.org> Reviewed-by: John Snow <jsnow@redhat.com> Message-id: 1459924806-306-2-git-send-email-den@openvz.org Signed-off-by: John Snow <jsnow@redhat.com>
Diffstat (limited to 'hw/ide/core.c')
-rw-r--r--hw/ide/core.c9
1 files changed, 1 insertions, 8 deletions
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 90524d5..58d0687 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -804,14 +804,7 @@ static void ide_dma_cb(void *opaque, int ret)
return;
}
if (ret < 0) {
- int op = IDE_RETRY_DMA;
-
- if (s->dma_cmd == IDE_DMA_READ)
- op |= IDE_RETRY_READ;
- else if (s->dma_cmd == IDE_DMA_TRIM)
- op |= IDE_RETRY_TRIM;
-
- if (ide_handle_rw_error(s, -ret, op)) {
+ if (ide_handle_rw_error(s, -ret, ide_dma_cmd_to_retry(s->dma_cmd))) {
return;
}
}
OpenPOWER on IntegriCloud