Index: sys/dev/drm2/i915/i915_gem.c =================================================================== --- sys/dev/drm2/i915/i915_gem.c +++ sys/dev/drm2/i915/i915_gem.c @@ -1483,11 +1483,7 @@ 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 @@ 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); Index: sys/dev/drm2/ttm/ttm_tt.c =================================================================== --- sys/dev/drm2/ttm/ttm_tt.c +++ sys/dev/drm2/ttm/ttm_tt.c @@ -292,7 +292,7 @@ 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); Index: sys/dev/md/md.c =================================================================== --- sys/dev/md/md.c +++ sys/dev/md/md.c @@ -1015,7 +1015,7 @@ 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 @@ } 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 @@ } 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) { Index: sys/fs/tmpfs/tmpfs_subr.c =================================================================== --- sys/fs/tmpfs/tmpfs_subr.c +++ sys/fs/tmpfs/tmpfs_subr.c @@ -1374,7 +1374,7 @@ 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; Index: sys/kern/kern_exec.c =================================================================== --- sys/kern/kern_exec.c +++ sys/kern/kern_exec.c @@ -1012,7 +1012,8 @@ } } 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]); Index: sys/kern/kern_sendfile.c =================================================================== --- sys/kern/kern_sendfile.c +++ sys/kern/kern_sendfile.c @@ -387,8 +387,8 @@ 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])); Index: sys/kern/uipc_shm.c =================================================================== --- sys/kern/uipc_shm.c +++ sys/kern/uipc_shm.c @@ -186,7 +186,8 @@ 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 @@ 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; Index: sys/vm/default_pager.c =================================================================== --- sys/vm/default_pager.c +++ sys/vm/default_pager.c @@ -56,11 +56,12 @@ 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 @@ * 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) { Index: sys/vm/device_pager.c =================================================================== --- sys/vm/device_pager.c +++ sys/vm/device_pager.c @@ -59,7 +59,7 @@ 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 @@ } 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 @@ 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); Index: sys/vm/phys_pager.c =================================================================== --- sys/vm/phys_pager.c +++ sys/vm/phys_pager.c @@ -139,8 +139,8 @@ * 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; Index: sys/vm/sg_pager.c =================================================================== --- sys/vm/sg_pager.c +++ sys/vm/sg_pager.c @@ -49,11 +49,9 @@ 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 @@ } 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; Index: sys/vm/swap_pager.c =================================================================== --- sys/vm/swap_pager.c +++ sys/vm/swap_pager.c @@ -357,10 +357,10 @@ 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 @@ * 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(). */ 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 @@ 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); Index: sys/vm/vm_fault.c =================================================================== --- sys/vm/vm_fault.c +++ sys/vm/vm_fault.c @@ -700,7 +700,7 @@ } 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; Index: sys/vm/vm_glue.c =================================================================== --- sys/vm/vm_glue.c +++ sys/vm/vm_glue.c @@ -239,7 +239,7 @@ 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 @@ 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); Index: sys/vm/vm_object.c =================================================================== --- sys/vm/vm_object.c +++ sys/vm/vm_object.c @@ -2025,7 +2025,8 @@ 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); Index: sys/vm/vm_pager.h =================================================================== --- sys/vm/vm_pager.h +++ sys/vm/vm_pager.h @@ -50,10 +50,10 @@ 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_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 *); Index: sys/vm/vm_pager.c =================================================================== --- sys/vm/vm_pager.c +++ sys/vm/vm_pager.c @@ -88,7 +88,8 @@ 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 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 @@ * 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_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 @@ } 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)); } /* Index: sys/vm/vnode_pager.c =================================================================== --- sys/vm/vnode_pager.c +++ sys/vm/vnode_pager.c @@ -84,8 +84,9 @@ 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 @@ * 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 @@ 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;