summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2020-11-29 10:30:56 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2020-11-29 10:30:56 +0000
commita9d4fe977a0be34e956c7cb6cb509596deefa7ad (patch)
tree6a504e102a3ad58ecdec00b696c4ad64555eee6f /sys/kern
parent5c2967f66fbfba57e246e683430982e08b1127aa (diff)
downloadsrc-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.c7
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);
}