summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-08-26 17:42:20 +0000
committerths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>2007-08-26 17:42:20 +0000
commitf0c596cb3d704a349a8ed27237363f124f001878 (patch)
treebc23002da842017c0df24d145a7a6ef035940baa
parent3ddf0b5cde7c741258487710c40f7318fdcd0f18 (diff)
downloadqemu-f0c596cb3d704a349a8ed27237363f124f001878.tar.gz
qemu-f0c596cb3d704a349a8ed27237363f124f001878.tar.bz2
qemu-f0c596cb3d704a349a8ed27237363f124f001878.zip
Last AIO patch, by Vladimir N. Oleynik.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3147 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--hw/ide.c54
1 files changed, 37 insertions, 17 deletions
diff --git a/hw/ide.c b/hw/ide.c
index e84c4d67f9..4a7fa8b6d5 100644
--- a/hw/ide.c
+++ b/hw/ide.c
@@ -864,10 +864,44 @@ static void ide_sector_write_timer_cb(void *opaque)
ide_set_irq(s);
}
+static void ide_sector_write_aio_cb(void *opaque, int ret)
+{
+ BMDMAState *bm = opaque;
+ IDEState *s = bm->ide_if;
+
+#ifdef TARGET_I386
+ if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
+ /* It seems there is a bug in the Windows 2000 installer HDD
+ IDE driver which fills the disk with empty logs when the
+ IDE write IRQ comes too early. This hack tries to correct
+ that at the expense of slower write performances. Use this
+ option _only_ to install Windows 2000. You must disable it
+ for normal use. */
+ qemu_mod_timer(s->sector_write_timer,
+ qemu_get_clock(vm_clock) + (ticks_per_sec / 1000));
+ } else
+#endif
+ {
+ ide_set_irq(s);
+ }
+ bm->aiocb = NULL;
+}
+
static void ide_sector_write(IDEState *s)
{
+ BMDMAState *bm;
int64_t sector_num;
- int ret, n, n1;
+ int n, n1;
+
+ s->io_buffer_index = 0;
+ s->io_buffer_size = 0;
+ bm = s->bmdma;
+ if(bm == NULL) {
+ bm = qemu_mallocz(sizeof(BMDMAState));
+ s->bmdma = bm;
+ }
+ bm->ide_if = s;
+ bm->dma_cb = ide_sector_write_aio_cb;
s->status = READY_STAT | SEEK_STAT;
sector_num = ide_get_sector(s);
@@ -877,7 +911,6 @@ static void ide_sector_write(IDEState *s)
n = s->nsector;
if (n > s->req_nb_sectors)
n = s->req_nb_sectors;
- ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
s->nsector -= n;
if (s->nsector == 0) {
/* no more sectors to write */
@@ -890,21 +923,8 @@ static void ide_sector_write(IDEState *s)
}
ide_set_sector(s, sector_num + n);
-#ifdef TARGET_I386
- if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
- /* It seems there is a bug in the Windows 2000 installer HDD
- IDE driver which fills the disk with empty logs when the
- IDE write IRQ comes too early. This hack tries to correct
- that at the expense of slower write performances. Use this
- option _only_ to install Windows 2000. You must disable it
- for normal use. */
- qemu_mod_timer(s->sector_write_timer,
- qemu_get_clock(vm_clock) + (ticks_per_sec / 1000));
- } else
-#endif
- {
- ide_set_irq(s);
- }
+ bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n,
+ ide_sector_write_aio_cb, bm);
}
/* XXX: handle errors */