mirror of https://github.com/xemu-project/xemu.git
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:
parent
3ddf0b5cde
commit
f0c596cb3d
54
hw/ide.c
54
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 */
|
||||
|
|
Loading…
Reference in New Issue