Last AIO patch, by Vladimir N. Oleynik.

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3147 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
ths 2007-08-26 17:42:20 +00:00
parent 3ddf0b5cde
commit f0c596cb3d
1 changed files with 37 additions and 17 deletions

View File

@ -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 */