diff --git a/sys/dev/drm2/i915/i915_gem.c b/sys/dev/drm2/i915/i915_gem.c index 6e9a86c..4fda4a2 100644 --- a/sys/dev/drm2/i915/i915_gem.c +++ b/sys/dev/drm2/i915/i915_gem.c @@ -1483,11 +1483,7 @@ i915_gem_pager_fault(vm_object_t vm_obj, vm_ooffset_t offset, int prot, drm_i915_private_t *dev_priv = dev->dev_private; vm_page_t page; int ret = 0; -#ifdef FREEBSD_WIP bool write = (prot & VM_PROT_WRITE) != 0; -#else - bool write = true; -#endif /* FREEBSD_WIP */ bool pinned; vm_object_pip_add(vm_obj, 1); @@ -4770,7 +4766,8 @@ i915_gem_wire_page(vm_object_t object, vm_pindex_t pindex, bool *fresh) page = vm_page_grab(object, pindex, VM_ALLOC_NORMAL); if (page->valid != VM_PAGE_BITS_ALL) { if (vm_pager_has_page(object, pindex, NULL, NULL)) { - rv = vm_pager_get_pages(object, &page, 1, NULL, NULL); + rv = vm_pager_get_pages(object, &page, 1, VM_PROT_ALL, + NULL, NULL); if (rv != VM_PAGER_OK) { vm_page_lock(page); vm_page_free(page); diff --git a/sys/dev/drm2/ttm/ttm_tt.c b/sys/dev/drm2/ttm/ttm_tt.c index 1e2db3c..7b64043 100644 --- a/sys/dev/drm2/ttm/ttm_tt.c +++ b/sys/dev/drm2/ttm/ttm_tt.c @@ -292,7 +292,7 @@ int ttm_tt_swapin(struct ttm_tt *ttm) if (from_page->valid != VM_PAGE_BITS_ALL) { if (vm_pager_has_page(obj, i, NULL, NULL)) { rv = vm_pager_get_pages(obj, &from_page, 1, - NULL, NULL); + VM_PROT_ALL, NULL, NULL); if (rv != VM_PAGER_OK) { vm_page_lock(from_page); vm_page_free(from_page); diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c index de0a696..301d982 100644 --- a/sys/dev/md/md.c +++ b/sys/dev/md/md.c @@ -1015,7 +1015,7 @@ mdstart_swap(struct md_s *sc, struct bio *bp) rv = VM_PAGER_OK; else rv = vm_pager_get_pages(sc->object, &m, 1, - NULL, NULL); + VM_PROT_ALL, NULL, NULL); if (rv == VM_PAGER_ERROR) { vm_page_xunbusy(m); break; @@ -1043,7 +1043,7 @@ mdstart_swap(struct md_s *sc, struct bio *bp) } else if (bp->bio_cmd == BIO_WRITE) { if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL) rv = vm_pager_get_pages(sc->object, &m, 1, - NULL, NULL); + VM_PROT_ALL, NULL, NULL); else rv = VM_PAGER_OK; if (rv == VM_PAGER_ERROR) { @@ -1063,7 +1063,7 @@ mdstart_swap(struct md_s *sc, struct bio *bp) } else if (bp->bio_cmd == BIO_DELETE) { if (len != PAGE_SIZE && m->valid != VM_PAGE_BITS_ALL) rv = vm_pager_get_pages(sc->object, &m, 1, - NULL, NULL); + VM_PROT_ALL, NULL, NULL); else rv = VM_PAGER_OK; if (rv == VM_PAGER_ERROR) { diff --git a/sys/fs/tmpfs/tmpfs_subr.c b/sys/fs/tmpfs/tmpfs_subr.c index 7ce4789..0f916f5 100644 --- a/sys/fs/tmpfs/tmpfs_subr.c +++ b/sys/fs/tmpfs/tmpfs_subr.c @@ -1374,7 +1374,7 @@ retry: goto retry; } else if (m->valid != VM_PAGE_BITS_ALL) rv = vm_pager_get_pages(uobj, &m, 1, - NULL, NULL); + VM_PROT_ALL, NULL, NULL); else /* A cached page was reactivated. */ rv = VM_PAGER_OK; diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index 7d9adb0..7836079 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -1012,7 +1012,8 @@ exec_map_first_page(imgp) } } initial_pagein = i; - rv = vm_pager_get_pages(object, ma, initial_pagein, NULL, NULL); + rv = vm_pager_get_pages(object, ma, initial_pagein, VM_PROT_ALL, + NULL, NULL); if (rv != VM_PAGER_OK) { for (i = 0; i < initial_pagein; i++) { vm_page_lock(ma[i]); diff --git a/sys/kern/kern_sendfile.c b/sys/kern/kern_sendfile.c index cac4d36..d98be25 100644 --- a/sys/kern/kern_sendfile.c +++ b/sys/kern/kern_sendfile.c @@ -387,8 +387,8 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, off_t off, off_t len, count = min(a + 1, npages - i); refcount_acquire(&sfio->nios); - rv = vm_pager_get_pages_async(obj, pa + i, count, NULL, - i + count == npages ? &rhpages : NULL, + rv = vm_pager_get_pages_async(obj, pa + i, count, VM_PROT_ALL, + NULL, i + count == npages ? &rhpages : NULL, &sendfile_iodone, sfio); KASSERT(rv == VM_PAGER_OK, ("%s: pager fail obj %p page %p", __func__, obj, pa[i])); diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c index be922ed..6e42c05f 100644 --- a/sys/kern/uipc_shm.c +++ b/sys/kern/uipc_shm.c @@ -186,7 +186,8 @@ uiomove_object_page(vm_object_t obj, size_t len, struct uio *uio) if (m->valid != VM_PAGE_BITS_ALL) { vm_page_xbusy(m); if (vm_pager_has_page(obj, idx, NULL, NULL)) { - rv = vm_pager_get_pages(obj, &m, 1, NULL, NULL); + rv = vm_pager_get_pages(obj, &m, 1, VM_PROT_ALL, + NULL, NULL); if (rv != VM_PAGER_OK) { printf( "uiomove_object: vm_obj %p idx %jd valid %x pager error %d\n", @@ -457,7 +458,7 @@ retry: goto retry; } else if (m->valid != VM_PAGE_BITS_ALL) rv = vm_pager_get_pages(object, &m, 1, - NULL, NULL); + VM_PROT_ALL, NULL, NULL); else /* A cached page was reactivated. */ rv = VM_PAGER_OK; diff --git a/sys/vm/default_pager.c b/sys/vm/default_pager.c index f334cd7..770004f 100644 --- a/sys/vm/default_pager.c +++ b/sys/vm/default_pager.c @@ -56,11 +56,12 @@ __FBSDID("$FreeBSD$"); static vm_object_t default_pager_alloc(void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t, struct ucred *); static void default_pager_dealloc(vm_object_t); -static int default_pager_getpages(vm_object_t, vm_page_t *, int, int *, int *); +static int default_pager_getpages(vm_object_t, vm_page_t *, int, int, int *, + int *); static void default_pager_putpages(vm_object_t, vm_page_t *, int, - boolean_t, int *); + boolean_t, int *); static boolean_t default_pager_haspage(vm_object_t, vm_pindex_t, int *, - int *); + int *); /* * pagerops for OBJT_DEFAULT - "default pager". */ @@ -122,7 +123,7 @@ default_pager_dealloc(object) * see a vm_page with assigned swap here. */ static int -default_pager_getpages(vm_object_t object, vm_page_t *m, int count, +default_pager_getpages(vm_object_t object, vm_page_t *m, int count, int prot, int *rbehind, int *rahead) { diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index bce8b12..f8b6241 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -59,7 +59,7 @@ static void dev_pager_init(void); static vm_object_t dev_pager_alloc(void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t, struct ucred *); static void dev_pager_dealloc(vm_object_t); -static int dev_pager_getpages(vm_object_t, vm_page_t *, int, int *, int *); +static int dev_pager_getpages(vm_object_t, vm_page_t *, int, int, int *, int *); static void dev_pager_putpages(vm_object_t, vm_page_t *, int, int, int *); static boolean_t dev_pager_haspage(vm_object_t, vm_pindex_t, int *, int *); static void dev_pager_free_page(vm_object_t object, vm_page_t m); @@ -260,8 +260,8 @@ dev_pager_dealloc(vm_object_t object) } static int -dev_pager_getpages(vm_object_t object, vm_page_t *ma, int count, int *rbehind, - int *rahead) +dev_pager_getpages(vm_object_t object, vm_page_t *ma, int count, int prot, + int *rbehind, int *rahead) { int error; @@ -269,7 +269,7 @@ dev_pager_getpages(vm_object_t object, vm_page_t *ma, int count, int *rbehind, KASSERT(count == 1, ("%s: count %d", __func__, count)); VM_OBJECT_ASSERT_WLOCKED(object); error = object->un_pager.devp.ops->cdev_pg_fault(object, - IDX_TO_OFF(ma[0]->pindex), PROT_READ, &ma[0]); + IDX_TO_OFF(ma[0]->pindex), prot, &ma[0]); VM_OBJECT_ASSERT_WLOCKED(object); diff --git a/sys/vm/phys_pager.c b/sys/vm/phys_pager.c index 59d22dd..47f81ad 100644 --- a/sys/vm/phys_pager.c +++ b/sys/vm/phys_pager.c @@ -139,8 +139,8 @@ phys_pager_dealloc(vm_object_t object) * Fill as many pages as vm_fault has allocated for us. */ static int -phys_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) +phys_pager_getpages(vm_object_t object, vm_page_t *m, int count, int prot, + int *rbehind, int *rahead) { int i; diff --git a/sys/vm/sg_pager.c b/sys/vm/sg_pager.c index 2cccb7ea..8b9d0f7 100644 --- a/sys/vm/sg_pager.c +++ b/sys/vm/sg_pager.c @@ -49,11 +49,9 @@ __FBSDID("$FreeBSD$"); static vm_object_t sg_pager_alloc(void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t, struct ucred *); static void sg_pager_dealloc(vm_object_t); -static int sg_pager_getpages(vm_object_t, vm_page_t *, int, int *, int *); -static void sg_pager_putpages(vm_object_t, vm_page_t *, int, - boolean_t, int *); -static boolean_t sg_pager_haspage(vm_object_t, vm_pindex_t, int *, - int *); +static int sg_pager_getpages(vm_object_t, vm_page_t *, int, int, int *, int *); +static void sg_pager_putpages(vm_object_t, vm_page_t *, int, boolean_t, int *); +static boolean_t sg_pager_haspage(vm_object_t, vm_pindex_t, int *, int *); struct pagerops sgpagerops = { .pgo_alloc = sg_pager_alloc, @@ -135,8 +133,8 @@ sg_pager_dealloc(vm_object_t object) } static int -sg_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) +sg_pager_getpages(vm_object_t object, vm_page_t *m, int count, int prot, + int *rbehind, int *rahead) { struct sglist *sg; vm_page_t m_paddr, page; diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 04cd349..6796d3d 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -357,10 +357,10 @@ static vm_object_t swap_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, vm_ooffset_t offset, struct ucred *); static void swap_pager_dealloc(vm_object_t object); -static int swap_pager_getpages(vm_object_t, vm_page_t *, int, int *, - int *); -static int swap_pager_getpages_async(vm_object_t, vm_page_t *, int, int *, - int *, pgo_getpages_iodone_t, void *); +static int swap_pager_getpages(vm_object_t, vm_page_t *, int, int, int *, + int *); +static int swap_pager_getpages_async(vm_object_t, vm_page_t *, int, int, + int *, int *, pgo_getpages_iodone_t, void *); static void swap_pager_putpages(vm_object_t, vm_page_t *, int, boolean_t, int *); static boolean_t swap_pager_haspage(vm_object_t object, vm_pindex_t pindex, int *before, int *after); @@ -1079,8 +1079,8 @@ swap_pager_unswapped(vm_page_t m) * The pages in "m" must be busied and will remain busied upon return. */ static int -swap_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) +swap_pager_getpages(vm_object_t object, vm_page_t *m, int count, int prot, + int *rbehind, int *rahead) { struct buf *bp; vm_page_t mpred, msucc, p; @@ -1239,12 +1239,12 @@ swap_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, * swap_pager_getpages(). */ static int -swap_pager_getpages_async(vm_object_t object, vm_page_t *m, int count, +swap_pager_getpages_async(vm_object_t object, vm_page_t *m, int count, int prot, int *rbehind, int *rahead, pgo_getpages_iodone_t iodone, void *arg) { int r, error; - r = swap_pager_getpages(object, m, count, rbehind, rahead); + r = swap_pager_getpages(object, m, count, prot, rbehind, rahead); VM_OBJECT_WUNLOCK(object); switch (r) { case VM_PAGER_OK: @@ -1664,7 +1664,8 @@ swp_pager_force_pagein(vm_object_t object, vm_pindex_t pindex) return; } - if (swap_pager_getpages(object, &m, 1, NULL, NULL) != VM_PAGER_OK) + if (swap_pager_getpages(object, &m, 1, VM_PROT_ALL, NULL, NULL) != + VM_PAGER_OK) panic("swap_pager_force_pagein: read from swap failed");/*XXX*/ vm_object_pip_wakeup(object); vm_page_dirty(m); diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 67f8c75..2ade13b 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -700,7 +700,7 @@ readrest: } ahead = ulmin(ahead, atop(e_end - vaddr) - 1); } - rv = vm_pager_get_pages(fs.object, &fs.m, 1, + rv = vm_pager_get_pages(fs.object, &fs.m, 1, prot, &behind, &ahead); if (rv == VM_PAGER_OK) { faultcount = behind + 1 + ahead; diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index 60b822e..fd0fcfb 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -239,7 +239,7 @@ vm_imgact_hold_page(vm_object_t object, vm_ooffset_t offset) m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY); if (m->valid != VM_PAGE_BITS_ALL) { vm_page_xbusy(m); - rv = vm_pager_get_pages(object, &m, 1, NULL, NULL); + rv = vm_pager_get_pages(object, &m, 1, VM_PROT_ALL, NULL, NULL); if (rv != VM_PAGER_OK) { vm_page_lock(m); vm_page_free(m); @@ -592,7 +592,8 @@ vm_thread_swapin(struct thread *td) rv = vm_pager_has_page(ksobj, ma[i]->pindex, NULL, &a); KASSERT(rv == 1, ("%s: missing page %p", __func__, ma[i])); count = min(a + 1, j - i); - rv = vm_pager_get_pages(ksobj, ma + i, count, NULL, NULL); + rv = vm_pager_get_pages(ksobj, ma + i, count, VM_PROT_ALL, + NULL, NULL); KASSERT(rv == VM_PAGER_OK, ("%s: cannot get kstack for proc %d", __func__, td->td_proc->p_pid)); vm_object_pip_wakeup(ksobj); diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 7321990..403e756 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -2025,7 +2025,8 @@ vm_object_populate(vm_object_t object, vm_pindex_t start, vm_pindex_t end) for (pindex = start; pindex < end; pindex++) { m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL); if (m->valid != VM_PAGE_BITS_ALL) { - rv = vm_pager_get_pages(object, &m, 1, NULL, NULL); + rv = vm_pager_get_pages(object, &m, 1, VM_PROT_ALL, + NULL, NULL); if (rv != VM_PAGER_OK) { vm_page_lock(m); vm_page_free(m); diff --git a/sys/vm/vm_pager.c b/sys/vm/vm_pager.c index 87557ae..ecdf6c1 100644 --- a/sys/vm/vm_pager.c +++ b/sys/vm/vm_pager.c @@ -88,7 +88,8 @@ int cluster_pbuf_freecnt = -1; /* unlimited to begin with */ struct buf *swbuf; -static int dead_pager_getpages(vm_object_t, vm_page_t *, int, int *, int *); +static int dead_pager_getpages(vm_object_t, vm_page_t *, int, int, int *, + int *); static vm_object_t dead_pager_alloc(void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t, struct ucred *); static void dead_pager_putpages(vm_object_t, vm_page_t *, int, int, int *); @@ -96,8 +97,8 @@ static boolean_t dead_pager_haspage(vm_object_t, vm_pindex_t, int *, int *); static void dead_pager_dealloc(vm_object_t); static int -dead_pager_getpages(vm_object_t obj, vm_page_t *ma, int count, int *rbehind, - int *rahead) +dead_pager_getpages(vm_object_t obj, vm_page_t *ma, int count, int prot, + int *rbehind, int *rahead) { return (VM_PAGER_FAIL); @@ -278,8 +279,8 @@ vm_pager_assert_in(vm_object_t object, vm_page_t *m, int count) * The requested page must be fully valid on successful return. */ int -vm_pager_get_pages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) +vm_pager_get_pages(vm_object_t object, vm_page_t *m, int count, int prot, + int *rbehind, int *rahead) { #ifdef INVARIANTS vm_pindex_t pindex = m[0]->pindex; @@ -288,8 +289,8 @@ vm_pager_get_pages(vm_object_t object, vm_page_t *m, int count, int *rbehind, vm_pager_assert_in(object, m, count); - r = (*pagertab[object->type]->pgo_getpages)(object, m, count, rbehind, - rahead); + r = (*pagertab[object->type]->pgo_getpages)(object, m, count, prot, + rbehind, rahead); if (r != VM_PAGER_OK) return (r); @@ -311,14 +312,14 @@ vm_pager_get_pages(vm_object_t object, vm_page_t *m, int count, int *rbehind, } int -vm_pager_get_pages_async(vm_object_t object, vm_page_t *m, int count, +vm_pager_get_pages_async(vm_object_t object, vm_page_t *m, int count, int prot, int *rbehind, int *rahead, pgo_getpages_iodone_t iodone, void *arg) { vm_pager_assert_in(object, m, count); return ((*pagertab[object->type]->pgo_getpages_async)(object, m, - count, rbehind, rahead, iodone, arg)); + count, prot, rbehind, rahead, iodone, arg)); } /* diff --git a/sys/vm/vm_pager.h b/sys/vm/vm_pager.h index f73cd00..8d07e17 100644 --- a/sys/vm/vm_pager.h +++ b/sys/vm/vm_pager.h @@ -50,10 +50,10 @@ typedef void pgo_init_t(void); typedef vm_object_t pgo_alloc_t(void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t, struct ucred *); typedef void pgo_dealloc_t(vm_object_t); -typedef int pgo_getpages_t(vm_object_t, vm_page_t *, int, int *, int *); +typedef int pgo_getpages_t(vm_object_t, vm_page_t *, int, int, int *, int *); typedef void pgo_getpages_iodone_t(void *, vm_page_t *, int, int); -typedef int pgo_getpages_async_t(vm_object_t, vm_page_t *, int, int *, int *, - pgo_getpages_iodone_t, void *); +typedef int pgo_getpages_async_t(vm_object_t, vm_page_t *, int, int, int *, + int *, pgo_getpages_iodone_t, void *); typedef void pgo_putpages_t(vm_object_t, vm_page_t *, int, int, int *); typedef boolean_t pgo_haspage_t(vm_object_t, vm_pindex_t, int *, int *); typedef void pgo_pageunswapped_t(vm_page_t); @@ -106,8 +106,8 @@ vm_object_t vm_pager_allocate(objtype_t, void *, vm_ooffset_t, vm_prot_t, vm_ooffset_t, struct ucred *); void vm_pager_bufferinit(void); void vm_pager_deallocate(vm_object_t); -int vm_pager_get_pages(vm_object_t, vm_page_t *, int, int *, int *); -int vm_pager_get_pages_async(vm_object_t, vm_page_t *, int, int *, int *, +int vm_pager_get_pages(vm_object_t, vm_page_t *, int, int, int *, int *); +int vm_pager_get_pages_async(vm_object_t, vm_page_t *, int, int, int *, int *, pgo_getpages_iodone_t, void *); void vm_pager_init(void); vm_object_t vm_pager_object_lookup(struct pagerlst *, void *); diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 92c28f3..8b6e31b 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -84,8 +84,9 @@ static int vnode_pager_addr(struct vnode *vp, vm_ooffset_t address, static int vnode_pager_input_smlfs(vm_object_t object, vm_page_t m); static int vnode_pager_input_old(vm_object_t object, vm_page_t m); static void vnode_pager_dealloc(vm_object_t); -static int vnode_pager_getpages(vm_object_t, vm_page_t *, int, int *, int *); -static int vnode_pager_getpages_async(vm_object_t, vm_page_t *, int, int *, +static int vnode_pager_getpages(vm_object_t, vm_page_t *, int, int, int *, + int *); +static int vnode_pager_getpages_async(vm_object_t, vm_page_t *, int, int, int *, int *, vop_getpages_iodone_t, void *); static void vnode_pager_putpages(vm_object_t, vm_page_t *, int, int, int *); static boolean_t vnode_pager_haspage(vm_object_t, vm_pindex_t, int *, int *); @@ -683,8 +684,8 @@ vnode_pager_input_old(vm_object_t object, vm_page_t m) * backing vp's VOP_GETPAGES. */ static int -vnode_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) +vnode_pager_getpages(vm_object_t object, vm_page_t *m, int count, int prot, + int *rbehind, int *rahead) { struct vnode *vp; int rtval; @@ -700,7 +701,8 @@ vnode_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, static int vnode_pager_getpages_async(vm_object_t object, vm_page_t *m, int count, - int *rbehind, int *rahead, vop_getpages_iodone_t iodone, void *arg) + int prot, int *rbehind, int *rahead, vop_getpages_iodone_t iodone, + void *arg) { struct vnode *vp; int rtval;