qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] last AIO patch


From: Vladimir N. Oleynik
Subject: [Qemu-devel] last AIO patch
Date: Mon, 20 Aug 2007 15:57:43 +0400
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.7) Gecko/20060914 SeaMonkey/1.0.5

Hi.

A small last AIO patch for current qemu make async disk write
for non-dma mode.
This patch can use always, can install w2k without
disk-full-problem and without use -w2k-hack option now for system
with AIO support.


--w
vodz
diff -rbu qemu.orig/hw/ide.c qemu/hw/ide.c
--- qemu.orig/hw/ide.c  2007-07-12 02:48:58.000000000 +0400
+++ qemu/hw/ide.c       2007-08-20 15:33:44.000000000 +0400
@@ -863,10 +863,44 @@
     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);
@@ -876,7 +910,6 @@
     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 */
@@ -889,21 +922,8 @@
     }
     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 */

reply via email to

[Prev in Thread] Current Thread [Next in Thread]