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,31 +864,10 @@ static void ide_sector_write_timer_cb(void *opaque)
ide_set_irq(s);
}
static void ide_sector_write(IDEState *s)
static void ide_sector_write_aio_cb(void *opaque, int ret)
{
int64_t sector_num;
int ret, n, n1;
s->status = READY_STAT | SEEK_STAT;
sector_num = ide_get_sector(s);
#if defined(DEBUG_IDE)
printf("write sector=%Ld\n", sector_num);
#endif
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 */
ide_transfer_stop(s);
} else {
n1 = s->nsector;
if (n1 > s->req_nb_sectors)
n1 = s->req_nb_sectors;
ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
}
ide_set_sector(s, sector_num + n);
BMDMAState *bm = opaque;
IDEState *s = bm->ide_if;
#ifdef TARGET_I386
if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
@ -905,6 +884,47 @@ static void ide_sector_write(IDEState *s)
{
ide_set_irq(s);
}
bm->aiocb = NULL;
}
static void ide_sector_write(IDEState *s)
{
BMDMAState *bm;
int64_t sector_num;
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);
#if defined(DEBUG_IDE)
printf("write sector=%Ld\n", sector_num);
#endif
n = s->nsector;
if (n > s->req_nb_sectors)
n = s->req_nb_sectors;
s->nsector -= n;
if (s->nsector == 0) {
/* no more sectors to write */
ide_transfer_stop(s);
} else {
n1 = s->nsector;
if (n1 > s->req_nb_sectors)
n1 = s->req_nb_sectors;
ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
}
ide_set_sector(s, sector_num + n);
bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n,
ide_sector_write_aio_cb, bm);
}
/* XXX: handle errors */