[Top][All Lists]
[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 */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemu-devel] last AIO patch,
Vladimir N. Oleynik <=