From owner-dev-commits-src-all@freebsd.org Wed Dec 23 16:07:34 2020 Return-Path: Delivered-To: dev-commits-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 191BF4C3839; Wed, 23 Dec 2020 16:07:34 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4D1J520976z3Lmc; Wed, 23 Dec 2020 16:07:34 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id EC95020EA0; Wed, 23 Dec 2020 16:07:33 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 0BNG7XCg043746; Wed, 23 Dec 2020 16:07:33 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 0BNG7XsV043745; Wed, 23 Dec 2020 16:07:33 GMT (envelope-from git) Date: Wed, 23 Dec 2020 16:07:33 GMT Message-Id: <202012231607.0BNG7XsV043745@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Alan Somers Subject: git: 0120603891ec - AIO: remove the kaiocb->bio linkage MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: asomers X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 0120603891ec0d082c41e1f8d2b83e71429aea8c Auto-Submitted: auto-generated X-BeenThere: dev-commits-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: "Commit messages for all branches of the src repository." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 23 Dec 2020 16:07:34 -0000 The branch main has been updated by asomers: URL: https://cgit.FreeBSD.org/src/commit/?id=0120603891ec0d082c41e1f8d2b83e71429aea8c commit 0120603891ec0d082c41e1f8d2b83e71429aea8c Author: Alan Somers AuthorDate: 2020-12-21 21:48:29 +0000 Commit: Alan Somers CommitDate: 2020-12-23 16:06:15 +0000 AIO: remove the kaiocb->bio linkage Vectored aio will require each aiocb to be associated with multiple bios, so we can't store a link to the latter from the former. But we don't really need to. aio_biowakeup already knows the bio it's using, and the other fields can be stored within the bio and/or buf itself. Also, remove the unused kaiocb.backend2 field. Reviewed By: kib Differential Revision: https://reviews.freebsd.org/D27682 --- sys/kern/vfs_aio.c | 50 +++++++++++++++++++++++++------------------------- sys/sys/aio.h | 9 +-------- 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/sys/kern/vfs_aio.c b/sys/kern/vfs_aio.c index 6c70714d5421..37e19557d807 100644 --- a/sys/kern/vfs_aio.c +++ b/sys/kern/vfs_aio.c @@ -1216,7 +1216,8 @@ aio_qbio(struct proc *p, struct kaiocb *job) struct cdevsw *csw; struct cdev *dev; struct kaioinfo *ki; - int error, ref, poff; + struct vm_page **pages; + int error, npages, poff, ref; vm_prot_t prot; cb = &job->uaiocb; @@ -1259,7 +1260,7 @@ aio_qbio(struct proc *p, struct kaiocb *job) } pbuf = NULL; - job->pages = malloc(sizeof(vm_page_t) * (atop(round_page( + pages = malloc(sizeof(vm_page_t) * (atop(round_page( cb->aio_nbytes)) + 1), M_TEMP, M_WAITOK | M_ZERO); } else { if (cb->aio_nbytes > maxphys) { @@ -1271,14 +1272,14 @@ aio_qbio(struct proc *p, struct kaiocb *job) goto unref; } - job->pbuf = pbuf = uma_zalloc(pbuf_zone, M_WAITOK); + pbuf = uma_zalloc(pbuf_zone, M_WAITOK); BUF_KERNPROC(pbuf); AIO_LOCK(ki); ki->kaio_buffer_count++; AIO_UNLOCK(ki); - job->pages = pbuf->b_pages; + pages = pbuf->b_pages; } - job->bp = bp = g_alloc_bio(); + bp = g_alloc_bio(); bp->bio_length = cb->aio_nbytes; bp->bio_bcount = cb->aio_nbytes; @@ -1286,26 +1287,27 @@ aio_qbio(struct proc *p, struct kaiocb *job) bp->bio_offset = cb->aio_offset; bp->bio_cmd = cb->aio_lio_opcode == LIO_WRITE ? BIO_WRITE : BIO_READ; bp->bio_dev = dev; - bp->bio_caller1 = (void *)job; + bp->bio_caller1 = job; + bp->bio_caller2 = pbuf; prot = VM_PROT_READ; if (cb->aio_lio_opcode == LIO_READ) prot |= VM_PROT_WRITE; /* Less backwards than it looks */ - job->npages = vm_fault_quick_hold_pages(&curproc->p_vmspace->vm_map, - (vm_offset_t)cb->aio_buf, bp->bio_length, prot, job->pages, + npages = vm_fault_quick_hold_pages(&curproc->p_vmspace->vm_map, + (vm_offset_t)cb->aio_buf, bp->bio_length, prot, pages, atop(maxphys) + 1); - if (job->npages < 0) { + if (npages < 0) { error = EFAULT; goto doerror; } if (pbuf != NULL) { - pmap_qenter((vm_offset_t)pbuf->b_data, - job->pages, job->npages); + pmap_qenter((vm_offset_t)pbuf->b_data, pages, npages); bp->bio_data = pbuf->b_data + poff; atomic_add_int(&num_buf_aio, 1); + pbuf->b_npages = npages; } else { - bp->bio_ma = job->pages; - bp->bio_ma_n = job->npages; + bp->bio_ma = pages; + bp->bio_ma_n = npages; bp->bio_ma_offset = poff; bp->bio_data = unmapped_buf; bp->bio_flags |= BIO_UNMAPPED; @@ -1323,12 +1325,10 @@ doerror: ki->kaio_buffer_count--; AIO_UNLOCK(ki); uma_zfree(pbuf_zone, pbuf); - job->pbuf = NULL; } else { - free(job->pages, M_TEMP); + free(pages, M_TEMP); } g_destroy_bio(bp); - job->bp = NULL; unref: dev_relthread(dev, ref); return (error); @@ -2341,28 +2341,28 @@ aio_biowakeup(struct bio *bp) { struct kaiocb *job = (struct kaiocb *)bp->bio_caller1; struct kaioinfo *ki; + struct buf *pbuf = (struct buf*)bp->bio_caller2; size_t nbytes; int error, nblks; /* Release mapping into kernel space. */ - 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; + if (pbuf != NULL) { + MPASS(pbuf->b_npages <= atop(maxphys) + 1); + pmap_qremove((vm_offset_t)pbuf->b_data, pbuf->b_npages); + vm_page_unhold_pages(pbuf->b_pages, pbuf->b_npages); + uma_zfree(pbuf_zone, pbuf); 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); + MPASS(bp->bio_ma_n <= atop(maxphys) + 1); + vm_page_unhold_pages(bp->bio_ma, bp->bio_ma_n); + free(bp->bio_ma, M_TEMP); atomic_subtract_int(&num_unmapped_aio, 1); } - bp = job->bp; - job->bp = NULL; nbytes = job->uaiocb.aio_nbytes - bp->bio_resid; error = 0; if (bp->bio_flags & BIO_ERROR) diff --git a/sys/sys/aio.h b/sys/sys/aio.h index 380c5bcf7cf9..71afdbf31b35 100644 --- a/sys/sys/aio.h +++ b/sys/sys/aio.h @@ -137,18 +137,11 @@ struct kaiocb { aio_cancel_fn_t *cancel_fn; /* (a) backend cancel function */ aio_handle_fn_t *handle_fn; /* (c) backend handle function */ union { /* Backend-specific data fields */ - struct { /* BIO backend */ - struct bio *bp; /* (*) BIO pointer */ - struct buf *pbuf; /* (*) buffer pointer */ - int npages; /* (*) number of pages */ - struct vm_page **pages; /* (*) */ - }; struct { /* fsync() requests */ int pending; /* (a) number of pending I/O */ }; - struct { + struct { /* socket backend */ void *backend1; - void *backend2; long backend3; int backend4; };