From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KTs19-0000a6-DD for qemu-devel@nongnu.org; Fri, 15 Aug 2008 01:38:31 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KTs18-0000Zg-0e for qemu-devel@nongnu.org; Fri, 15 Aug 2008 01:38:30 -0400 Received: from [199.232.76.173] (port=39200 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KTs17-0000ZY-KU for qemu-devel@nongnu.org; Fri, 15 Aug 2008 01:38:29 -0400 Received: from il.qumranet.com ([212.179.150.194]:13118) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KTs17-0005xu-0I for qemu-devel@nongnu.org; Fri, 15 Aug 2008 01:38:29 -0400 Received: from gleb-debian.qumranet.com (gleb-debian.qumranet.com.qumranet.com [172.16.15.143]) by il.qumranet.com (Postfix) with ESMTP id C7E71250A40 for ; Fri, 15 Aug 2008 08:38:25 +0300 (IDT) Date: Fri, 15 Aug 2008 08:38:25 +0300 From: Gleb Natapov Subject: Re: [Qemu-devel] [PATCH] Cancel IDE outstanding IO on device reset. Message-ID: <20080815053825.GA15722@minantech.com> References: <20080814122437.5260.42952.stgit@gleb-debian.qumranet.com.qumranet.com> <48A496A8.7060103@codemonkey.ws> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <48A496A8.7060103@codemonkey.ws> Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org On Thu, Aug 14, 2008 at 03:33:44PM -0500, Anthony Liguori wrote: >> + for (i = 0; i < 2; i++) >> + ide_dma_cancel(d->bmdma); >> > > I think you intended: > > ide_dma_cancel(&d->bmdma[i]); > Oops. Here is the new one: --- Cancel IDE outstanding IO on device reset. Cancel AIO in IDE layer on device rest in order to be in deterministic state during next boot. Signed-off-by: Gleb Natapov diff --git a/hw/ide.c b/hw/ide.c index f4243c4..6b14e8f 100644 --- a/hw/ide.c +++ b/hw/ide.c @@ -2844,6 +2844,23 @@ static void ide_dma_start(IDEState *s, BlockDriverCompletionFunc *dma_cb) } } +static void ide_dma_cancel(BMDMAState *bm) +{ + if (bm->status & BM_STATUS_DMAING) { + bm->status &= ~BM_STATUS_DMAING; + /* cancel DMA request */ + bm->ide_if = NULL; + bm->dma_cb = NULL; + if (bm->aiocb) { +#ifdef DEBUG_AIO + printf("aio_cancel\n"); +#endif + bdrv_aio_cancel(bm->aiocb); + bm->aiocb = NULL; + } + } +} + static void bmdma_cmd_writeb(void *opaque, uint32_t addr, uint32_t val) { BMDMAState *bm = opaque; @@ -2852,19 +2869,7 @@ static void bmdma_cmd_writeb(void *opaque, uint32_t addr, uint32_t val) #endif if (!(val & BM_CMD_START)) { /* XXX: do it better */ - if (bm->status & BM_STATUS_DMAING) { - bm->status &= ~BM_STATUS_DMAING; - /* cancel DMA request */ - bm->ide_if = NULL; - bm->dma_cb = NULL; - if (bm->aiocb) { -#ifdef DEBUG_AIO - printf("aio_cancel\n"); -#endif - bdrv_aio_cancel(bm->aiocb); - bm->aiocb = NULL; - } - } + ide_dma_cancel(bm); bm->cmd = val & 0x09; } else { if (!(bm->status & BM_STATUS_DMAING)) { @@ -3188,9 +3193,14 @@ static int pci_ide_load(QEMUFile* f, void *opaque, int version_id) return 0; } -static void piix3_reset(PCIIDEState *d) +static void piix3_reset(void *opaque) { + PCIIDEState *d = opaque; uint8_t *pci_conf = d->dev.config; + int i; + + for (i = 0; i < 2; i++) + ide_dma_cancel(&d->bmdma[i]); pci_conf[0x04] = 0x00; pci_conf[0x05] = 0x00; @@ -3224,6 +3234,7 @@ void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn, pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage pci_conf[0x0e] = 0x00; // header_type + qemu_register_reset(piix3_reset, d); piix3_reset(d); pci_register_io_region((PCIDevice *)d, 4, 0x10, @@ -3262,6 +3273,7 @@ void pci_piix4_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn, pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage pci_conf[0x0e] = 0x00; // header_type + qemu_register_reset(piix3_reset, d); piix3_reset(d); pci_register_io_region((PCIDevice *)d, 4, 0x10, -- Gleb.