Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_aio.c
Show First 20 Lines • Show All 1,261 Lines • ▼ Show 20 Lines | if (cb->aio_nbytes > MAXPHYS - poff) { | ||||
error = -1; | error = -1; | ||||
goto unref; | goto unref; | ||||
} | } | ||||
if (ki->kaio_buffer_count >= max_buf_aio) { | if (ki->kaio_buffer_count >= max_buf_aio) { | ||||
error = EAGAIN; | error = EAGAIN; | ||||
goto unref; | goto unref; | ||||
} | } | ||||
job->pbuf = pbuf = (struct buf *)getpbuf(NULL); | job->pbuf = pbuf = uma_zalloc(pbuf_zone, M_WAITOK); | ||||
BUF_KERNPROC(pbuf); | BUF_KERNPROC(pbuf); | ||||
AIO_LOCK(ki); | AIO_LOCK(ki); | ||||
ki->kaio_buffer_count++; | ki->kaio_buffer_count++; | ||||
AIO_UNLOCK(ki); | AIO_UNLOCK(ki); | ||||
} | } | ||||
job->bp = bp = g_alloc_bio(); | job->bp = bp = g_alloc_bio(); | ||||
bp->bio_length = cb->aio_nbytes; | bp->bio_length = cb->aio_nbytes; | ||||
Show All 34 Lines | aio_qphysio(struct proc *p, struct kaiocb *job) | ||||
dev_relthread(dev, ref); | dev_relthread(dev, ref); | ||||
return (0); | return (0); | ||||
doerror: | doerror: | ||||
if (pbuf != NULL) { | if (pbuf != NULL) { | ||||
AIO_LOCK(ki); | AIO_LOCK(ki); | ||||
ki->kaio_buffer_count--; | ki->kaio_buffer_count--; | ||||
AIO_UNLOCK(ki); | AIO_UNLOCK(ki); | ||||
relpbuf(pbuf, NULL); | uma_zfree(pbuf_zone, pbuf); | ||||
job->pbuf = NULL; | job->pbuf = NULL; | ||||
} | } | ||||
g_destroy_bio(bp); | g_destroy_bio(bp); | ||||
job->bp = NULL; | job->bp = NULL; | ||||
unref: | unref: | ||||
dev_relthread(dev, ref); | dev_relthread(dev, ref); | ||||
return (error); | return (error); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 1,007 Lines • ▼ Show 20 Lines | aio_physwakeup(struct bio *bp) | ||||
size_t nbytes; | size_t nbytes; | ||||
int error, nblks; | int error, nblks; | ||||
/* Release mapping into kernel space. */ | /* Release mapping into kernel space. */ | ||||
userp = job->userproc; | userp = job->userproc; | ||||
ki = userp->p_aioinfo; | ki = userp->p_aioinfo; | ||||
if (job->pbuf) { | if (job->pbuf) { | ||||
pmap_qremove((vm_offset_t)job->pbuf->b_data, job->npages); | pmap_qremove((vm_offset_t)job->pbuf->b_data, job->npages); | ||||
relpbuf(job->pbuf, NULL); | uma_zfree(pbuf_zone, job->pbuf); | ||||
job->pbuf = NULL; | job->pbuf = NULL; | ||||
atomic_subtract_int(&num_buf_aio, 1); | atomic_subtract_int(&num_buf_aio, 1); | ||||
AIO_LOCK(ki); | AIO_LOCK(ki); | ||||
ki->kaio_buffer_count--; | ki->kaio_buffer_count--; | ||||
AIO_UNLOCK(ki); | AIO_UNLOCK(ki); | ||||
} else | } else | ||||
atomic_subtract_int(&num_unmapped_aio, 1); | atomic_subtract_int(&num_unmapped_aio, 1); | ||||
vm_page_unhold_pages(job->pages, job->npages); | vm_page_unhold_pages(job->pages, job->npages); | ||||
▲ Show 20 Lines • Show All 632 Lines • Show Last 20 Lines |