diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2020-11-29 10:30:56 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2020-11-29 10:30:56 +0000 |
commit | a9d4fe977a0be34e956c7cb6cb509596deefa7ad (patch) | |
tree | 6a504e102a3ad58ecdec00b696c4ad64555eee6f /sys/kern | |
parent | 5c2967f66fbfba57e246e683430982e08b1127aa (diff) | |
download | src-test2-a9d4fe977a0be34e956c7cb6cb509596deefa7ad.tar.gz src-test2-a9d4fe977a0be34e956c7cb6cb509596deefa7ad.zip |
bio aio: Destroy ephemeral mapping before unwiring page.
Apparently some architectures, like ppc in its hashed page tables
variants, account mappings by pmap_qenter() in the response from
pmap_is_page_mapped().
While there, eliminate useless userp variable.
Noted and reviewed by: alc (previous version)
Sponsored by: The FreeBSD Foundation
Differential revision: https://reviews.freebsd.org/D27409
Notes
Notes:
svn path=/head/; revision=368142
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/vfs_aio.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index c91f17794599..df9ad352ca03 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -2339,24 +2339,23 @@ static void aio_biowakeup(struct bio *bp) { struct kaiocb *job = (struct kaiocb *)bp->bio_caller1; - struct proc *userp; struct kaioinfo *ki; size_t nbytes; int error, nblks; /* Release mapping into kernel space. */ - userp = job->userproc; - ki = userp->p_aioinfo; - vm_page_unhold_pages(job->pages, job->npages); if (job->pbuf != NULL) { pmap_qremove((vm_offset_t)job->pbuf->b_data, job->npages); + vm_page_unhold_pages(job->pages, job->npages); uma_zfree(pbuf_zone, job->pbuf); job->pbuf = NULL; atomic_subtract_int(&num_buf_aio, 1); + ki = job->userproc->p_aioinfo; AIO_LOCK(ki); ki->kaio_buffer_count--; AIO_UNLOCK(ki); } else { + vm_page_unhold_pages(job->pages, job->npages); free(job->pages, M_TEMP); atomic_subtract_int(&num_unmapped_aio, 1); } |