Module Name: src Committed By: riastradh Date: Sat Apr 22 13:53:53 UTC 2023
Modified Files: src/sys/rump/librump/rumpkern: vm.c src/sys/rump/librump/rumpvfs: vm_vfs.c Log Message: rump: Move ubc_uiomove, ubc_zerorange from rumpvfs to rumpkern. Needed by kern_ksyms.c. We could split kern_ksyms.c up into kernel- internal interfaces and the user/kernel /dev/ksyms interface, but there's nothing vfs-specific about ubc_uiomove and ubc_zerorange anyway, so let's just define them in rumpkern. To generate a diff of this commit: cvs rdiff -u -r1.195 -r1.196 src/sys/rump/librump/rumpkern/vm.c cvs rdiff -u -r1.41 -r1.42 src/sys/rump/librump/rumpvfs/vm_vfs.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/rump/librump/rumpkern/vm.c diff -u src/sys/rump/librump/rumpkern/vm.c:1.195 src/sys/rump/librump/rumpkern/vm.c:1.196 --- src/sys/rump/librump/rumpkern/vm.c:1.195 Sat Apr 22 13:53:37 2023 +++ src/sys/rump/librump/rumpkern/vm.c Sat Apr 22 13:53:53 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: vm.c,v 1.195 2023/04/22 13:53:37 riastradh Exp $ */ +/* $NetBSD: vm.c,v 1.196 2023/04/22 13:53:53 riastradh Exp $ */ /* * Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved. @@ -41,7 +41,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.195 2023/04/22 13:53:37 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.196 2023/04/22 13:53:53 riastradh Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -1339,3 +1339,131 @@ rump_hyperfree(void *what, size_t size) } rumpuser_free(what, size); } + +/* + * UBC + */ + +#define PAGERFLAGS (PGO_SYNCIO | PGO_NOBLOCKALLOC | PGO_NOTIMESTAMP) + +void +ubc_zerorange(struct uvm_object *uobj, off_t off, size_t len, int flags) +{ + struct vm_page **pgs; + int maxpages = MIN(32, round_page(len) >> PAGE_SHIFT); + int npages, i; + + if (maxpages == 0) + return; + + pgs = kmem_alloc(maxpages * sizeof(pgs), KM_SLEEP); + rw_enter(uobj->vmobjlock, RW_WRITER); + while (len) { + npages = MIN(maxpages, round_page(len) >> PAGE_SHIFT); + memset(pgs, 0, npages * sizeof(struct vm_page *)); + (void)uobj->pgops->pgo_get(uobj, trunc_page(off), + pgs, &npages, 0, VM_PROT_READ | VM_PROT_WRITE, + 0, PAGERFLAGS | PGO_PASTEOF); + KASSERT(npages > 0); + + rw_enter(uobj->vmobjlock, RW_WRITER); + for (i = 0; i < npages; i++) { + struct vm_page *pg; + uint8_t *start; + size_t chunkoff, chunklen; + + pg = pgs[i]; + if (pg == NULL) + break; + + KASSERT(pg->uobject != NULL); + KASSERT(uobj->vmobjlock == pg->uobject->vmobjlock); + + chunkoff = off & PAGE_MASK; + chunklen = MIN(PAGE_SIZE - chunkoff, len); + start = (uint8_t *)pg->uanon + chunkoff; + + memset(start, 0, chunklen); + uvm_pagemarkdirty(pg, UVM_PAGE_STATUS_DIRTY); + + off += chunklen; + len -= chunklen; + } + uvm_page_unbusy(pgs, npages); + } + rw_exit(uobj->vmobjlock); + kmem_free(pgs, maxpages * sizeof(pgs)); +} + +#define len2npages(off, len) \ + ((round_page(off+len) - trunc_page(off)) >> PAGE_SHIFT) + +int +ubc_uiomove(struct uvm_object *uobj, struct uio *uio, vsize_t todo, + int advice, int flags) +{ + struct vm_page **pgs; + int npages = len2npages(uio->uio_offset, todo); + size_t pgalloc; + int i, rv, pagerflags; + vm_prot_t prot; + + pgalloc = npages * sizeof(pgs); + pgs = kmem_alloc(pgalloc, KM_SLEEP); + + pagerflags = PAGERFLAGS; + if (flags & UBC_WRITE) + pagerflags |= PGO_PASTEOF; + if (flags & UBC_FAULTBUSY) + pagerflags |= PGO_OVERWRITE; + + prot = VM_PROT_READ; + if (flags & UBC_WRITE) + prot |= VM_PROT_WRITE; + + rw_enter(uobj->vmobjlock, RW_WRITER); + do { + npages = len2npages(uio->uio_offset, todo); + memset(pgs, 0, pgalloc); + rv = uobj->pgops->pgo_get(uobj, trunc_page(uio->uio_offset), + pgs, &npages, 0, prot, 0, pagerflags); + if (rv) + goto out; + + rw_enter(uobj->vmobjlock, RW_WRITER); + for (i = 0; i < npages; i++) { + struct vm_page *pg; + size_t xfersize; + off_t pageoff; + + pg = pgs[i]; + if (pg == NULL) + break; + + KASSERT(pg->uobject != NULL); + KASSERT(uobj->vmobjlock == pg->uobject->vmobjlock); + pageoff = uio->uio_offset & PAGE_MASK; + + xfersize = MIN(MIN(todo, PAGE_SIZE), PAGE_SIZE-pageoff); + KASSERT(xfersize > 0); + rv = uiomove((uint8_t *)pg->uanon + pageoff, + xfersize, uio); + if (rv) { + uvm_page_unbusy(pgs, npages); + rw_exit(uobj->vmobjlock); + goto out; + } + if (uio->uio_rw == UIO_WRITE) { + pg->flags &= ~PG_FAKE; + uvm_pagemarkdirty(pg, UVM_PAGE_STATUS_DIRTY); + } + todo -= xfersize; + } + uvm_page_unbusy(pgs, npages); + } while (todo); + rw_exit(uobj->vmobjlock); + + out: + kmem_free(pgs, pgalloc); + return rv; +} Index: src/sys/rump/librump/rumpvfs/vm_vfs.c diff -u src/sys/rump/librump/rumpvfs/vm_vfs.c:1.41 src/sys/rump/librump/rumpvfs/vm_vfs.c:1.42 --- src/sys/rump/librump/rumpvfs/vm_vfs.c:1.41 Wed Dec 9 00:03:32 2020 +++ src/sys/rump/librump/rumpvfs/vm_vfs.c Sat Apr 22 13:53:53 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: vm_vfs.c,v 1.41 2020/12/09 00:03:32 chs Exp $ */ +/* $NetBSD: vm_vfs.c,v 1.42 2023/04/22 13:53:53 riastradh Exp $ */ /* * Copyright (c) 2008-2011 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vm_vfs.c,v 1.41 2020/12/09 00:03:32 chs Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vm_vfs.c,v 1.42 2023/04/22 13:53:53 riastradh Exp $"); #include <sys/param.h> @@ -106,131 +106,3 @@ uvm_aio_aiodone(struct buf *bp) kmem_free(pgs, npages * sizeof(*pgs)); } - -/* - * UBC - */ - -#define PAGERFLAGS (PGO_SYNCIO | PGO_NOBLOCKALLOC | PGO_NOTIMESTAMP) - -void -ubc_zerorange(struct uvm_object *uobj, off_t off, size_t len, int flags) -{ - struct vm_page **pgs; - int maxpages = MIN(32, round_page(len) >> PAGE_SHIFT); - int npages, i; - - if (maxpages == 0) - return; - - pgs = kmem_alloc(maxpages * sizeof(pgs), KM_SLEEP); - rw_enter(uobj->vmobjlock, RW_WRITER); - while (len) { - npages = MIN(maxpages, round_page(len) >> PAGE_SHIFT); - memset(pgs, 0, npages * sizeof(struct vm_page *)); - (void)uobj->pgops->pgo_get(uobj, trunc_page(off), - pgs, &npages, 0, VM_PROT_READ | VM_PROT_WRITE, - 0, PAGERFLAGS | PGO_PASTEOF); - KASSERT(npages > 0); - - rw_enter(uobj->vmobjlock, RW_WRITER); - for (i = 0; i < npages; i++) { - struct vm_page *pg; - uint8_t *start; - size_t chunkoff, chunklen; - - pg = pgs[i]; - if (pg == NULL) - break; - - KASSERT(pg->uobject != NULL); - KASSERT(uobj->vmobjlock == pg->uobject->vmobjlock); - - chunkoff = off & PAGE_MASK; - chunklen = MIN(PAGE_SIZE - chunkoff, len); - start = (uint8_t *)pg->uanon + chunkoff; - - memset(start, 0, chunklen); - uvm_pagemarkdirty(pg, UVM_PAGE_STATUS_DIRTY); - - off += chunklen; - len -= chunklen; - } - uvm_page_unbusy(pgs, npages); - } - rw_exit(uobj->vmobjlock); - kmem_free(pgs, maxpages * sizeof(pgs)); -} - -#define len2npages(off, len) \ - ((round_page(off+len) - trunc_page(off)) >> PAGE_SHIFT) - -int -ubc_uiomove(struct uvm_object *uobj, struct uio *uio, vsize_t todo, - int advice, int flags) -{ - struct vm_page **pgs; - int npages = len2npages(uio->uio_offset, todo); - size_t pgalloc; - int i, rv, pagerflags; - vm_prot_t prot; - - pgalloc = npages * sizeof(pgs); - pgs = kmem_alloc(pgalloc, KM_SLEEP); - - pagerflags = PAGERFLAGS; - if (flags & UBC_WRITE) - pagerflags |= PGO_PASTEOF; - if (flags & UBC_FAULTBUSY) - pagerflags |= PGO_OVERWRITE; - - prot = VM_PROT_READ; - if (flags & UBC_WRITE) - prot |= VM_PROT_WRITE; - - rw_enter(uobj->vmobjlock, RW_WRITER); - do { - npages = len2npages(uio->uio_offset, todo); - memset(pgs, 0, pgalloc); - rv = uobj->pgops->pgo_get(uobj, trunc_page(uio->uio_offset), - pgs, &npages, 0, prot, 0, pagerflags); - if (rv) - goto out; - - rw_enter(uobj->vmobjlock, RW_WRITER); - for (i = 0; i < npages; i++) { - struct vm_page *pg; - size_t xfersize; - off_t pageoff; - - pg = pgs[i]; - if (pg == NULL) - break; - - KASSERT(pg->uobject != NULL); - KASSERT(uobj->vmobjlock == pg->uobject->vmobjlock); - pageoff = uio->uio_offset & PAGE_MASK; - - xfersize = MIN(MIN(todo, PAGE_SIZE), PAGE_SIZE-pageoff); - KASSERT(xfersize > 0); - rv = uiomove((uint8_t *)pg->uanon + pageoff, - xfersize, uio); - if (rv) { - uvm_page_unbusy(pgs, npages); - rw_exit(uobj->vmobjlock); - goto out; - } - if (uio->uio_rw == UIO_WRITE) { - pg->flags &= ~PG_FAKE; - uvm_pagemarkdirty(pg, UVM_PAGE_STATUS_DIRTY); - } - todo -= xfersize; - } - uvm_page_unbusy(pgs, npages); - } while (todo); - rw_exit(uobj->vmobjlock); - - out: - kmem_free(pgs, pgalloc); - return rv; -}