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, NULL, NULL, + VM_PROT_ALL); 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); + NULL, NULL, VM_PROT_ALL); 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); + NULL, NULL, VM_PROT_ALL); 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); + NULL, NULL, VM_PROT_ALL); 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); + NULL, NULL, VM_PROT_ALL); 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 @@ -1371,7 +1371,7 @@ goto retry; } else if (m->valid != VM_PAGE_BITS_ALL) rv = vm_pager_get_pages(uobj, &m, 1, - NULL, NULL); + NULL, NULL, VM_PROT_ALL); 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 @@ -1004,7 +1004,8 @@ } } initial_pagein = i; - rv = vm_pager_get_pages(object, ma, initial_pagein, NULL, NULL); + rv = vm_pager_get_pages(object, ma, initial_pagein, NULL, NULL, + VM_PROT_ALL); 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 @@ -389,7 +389,7 @@ refcount_acquire(&sfio->nios); rv = vm_pager_get_pages_async(obj, pa + i, count, NULL, i + count == npages ? &rhpages : NULL, - &sendfile_iodone, sfio); + &sendfile_iodone, sfio, VM_PROT_ALL); 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 @@ -185,7 +185,8 @@ m = vm_page_grab(obj, idx, VM_ALLOC_NORMAL); if (m->valid != VM_PAGE_BITS_ALL) { 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, NULL, NULL, + VM_PROT_ALL); if (rv != VM_PAGER_OK) { printf( "uiomove_object: vm_obj %p idx %jd valid %x pager error %d\n", @@ -456,7 +457,7 @@ goto retry; } else if (m->valid != VM_PAGE_BITS_ALL) rv = vm_pager_get_pages(object, &m, 1, - NULL, NULL); + NULL, NULL, VM_PROT_ALL); 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,7 +56,8 @@ 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 *, + vm_prot_t); static void default_pager_putpages(vm_object_t, vm_page_t *, int, boolean_t, int *); static boolean_t default_pager_haspage(vm_object_t, vm_pindex_t, int *, @@ -123,7 +124,7 @@ */ static int default_pager_getpages(vm_object_t object, vm_page_t *m, int count, - int *rbehind, int *rahead) + int *rbehind, int *rahead, vm_prot_t prot) { return (VM_PAGER_FAIL); Index: sys/vm/device_pager.c =================================================================== --- sys/vm/device_pager.c +++ sys/vm/device_pager.c @@ -59,7 +59,8 @@ 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 *, + vm_prot_t); 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); @@ -258,7 +259,7 @@ static int dev_pager_getpages(vm_object_t object, vm_page_t *ma, int count, int *rbehind, - int *rahead) + int *rahead, vm_prot_t prot) { int error; @@ -266,7 +267,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 @@ -140,7 +140,7 @@ */ static int phys_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) + int *rahead, vm_prot_t prot __unused) { int i; Index: sys/vm/sg_pager.c =================================================================== --- sys/vm/sg_pager.c +++ sys/vm/sg_pager.c @@ -49,7 +49,8 @@ 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 int sg_pager_getpages(vm_object_t, vm_page_t *, int, int *, int *, + vm_prot_t); 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 *, @@ -136,7 +137,7 @@ static int sg_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) + int *rahead, vm_prot_t prot __unused) { 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 @@ -359,9 +359,9 @@ 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 *); + int *, vm_prot_t); static int swap_pager_getpages_async(vm_object_t, vm_page_t *, int, int *, - int *, pgo_getpages_iodone_t, void *); + int *, pgo_getpages_iodone_t, void *, vm_prot_t); 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); @@ -611,7 +611,9 @@ * of the handle. */ sx_xlock(&sw_alloc_sx); + mtx_lock(&sw_alloc_mtx); object = vm_pager_object_lookup(NOBJLIST(handle), handle); + mtx_unlock(&sw_alloc_mtx); if (object == NULL) { if (cred != NULL) { if (!swap_reserve_by_cred(size, cred)) { @@ -1094,7 +1096,7 @@ */ static int swap_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) + int *rahead, vm_prot_t prot __unused) { struct buf *bp; daddr_t blk; @@ -1216,11 +1218,12 @@ */ static int swap_pager_getpages_async(vm_object_t object, vm_page_t *m, int count, - int *rbehind, int *rahead, pgo_getpages_iodone_t iodone, void *arg) + int *rbehind, int *rahead, pgo_getpages_iodone_t iodone, void *arg, + vm_prot_t prot) { int r, error; - r = swap_pager_getpages(object, m, count, rbehind, rahead); + r = swap_pager_getpages(object, m, count, rbehind, rahead, prot); VM_OBJECT_WUNLOCK(object); switch (r) { case VM_PAGER_OK: @@ -1636,7 +1639,8 @@ return; } - if (swap_pager_getpages(object, &m, 1, NULL, NULL) != VM_PAGER_OK) + if (swap_pager_getpages(object, &m, 1, NULL, NULL, VM_PROT_ALL) != + 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 @@ -650,7 +650,7 @@ * that it may bring up surrounding pages. */ rv = vm_pager_get_pages(fs.object, &fs.m, 1, - &behind, &ahead); + &behind, &ahead, prot); if (rv == VM_PAGER_OK) { faultcount = behind + 1 + ahead; hardfault++; Index: sys/vm/vm_glue.c =================================================================== --- sys/vm/vm_glue.c +++ sys/vm/vm_glue.c @@ -238,7 +238,7 @@ pindex = OFF_TO_IDX(offset); 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, NULL, NULL, VM_PROT_ALL); if (rv != VM_PAGER_OK) { vm_page_lock(m); vm_page_free(m); @@ -591,7 +591,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, NULL, NULL, + VM_PROT_ALL); 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 @@ -2021,7 +2021,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, NULL, NULL, + VM_PROT_ALL); 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,11 @@ 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 *, + vm_prot_t); 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 *); + pgo_getpages_iodone_t, void *, vm_prot_t); 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,9 +107,9 @@ 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(vm_object_t, vm_page_t *, int, int *, int *, vm_prot_t); int vm_pager_get_pages_async(vm_object_t, vm_page_t *, int, int *, int *, - pgo_getpages_iodone_t, void *); + pgo_getpages_iodone_t, void *, vm_prot_t); static __inline boolean_t vm_pager_has_page(vm_object_t, vm_pindex_t, int *, int *); 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 *, + vm_prot_t); 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 *); @@ -97,7 +98,7 @@ static int dead_pager_getpages(vm_object_t obj, vm_page_t *ma, int count, int *rbehind, - int *rahead) + int *rahead, vm_prot_t prot __unused) { return (VM_PAGER_FAIL); @@ -279,7 +280,7 @@ */ int vm_pager_get_pages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) + int *rahead, vm_prot_t prot) { #ifdef INVARIANTS vm_pindex_t pindex = m[0]->pindex; @@ -289,7 +290,7 @@ vm_pager_assert_in(object, m, count); r = (*pagertab[object->type]->pgo_getpages)(object, m, count, rbehind, - rahead); + rahead, prot); if (r != VM_PAGER_OK) return (r); @@ -312,13 +313,14 @@ int vm_pager_get_pages_async(vm_object_t object, vm_page_t *m, int count, - int *rbehind, int *rahead, pgo_getpages_iodone_t iodone, void *arg) + int *rbehind, int *rahead, pgo_getpages_iodone_t iodone, void *arg, + vm_prot_t prot) { vm_pager_assert_in(object, m, count); return ((*pagertab[object->type]->pgo_getpages_async)(object, m, - count, rbehind, rahead, iodone, arg)); + count, rbehind, rahead, iodone, arg, prot)); } /* Index: sys/vm/vnode_pager.c =================================================================== --- sys/vm/vnode_pager.c +++ sys/vm/vnode_pager.c @@ -84,9 +84,10 @@ 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(vm_object_t, vm_page_t *, int, int *, int *, + vm_prot_t); static int vnode_pager_getpages_async(vm_object_t, vm_page_t *, int, int *, - int *, vop_getpages_iodone_t, void *); + int *, vop_getpages_iodone_t, void *, vm_prot_t); 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 *); static vm_object_t vnode_pager_alloc(void *, vm_ooffset_t, vm_prot_t, @@ -673,7 +674,7 @@ */ static int vnode_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, - int *rahead) + int *rahead, vm_prot_t prot __unused) { struct vnode *vp; int rtval; @@ -689,7 +690,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 *rbehind, int *rahead, vop_getpages_iodone_t iodone, void *arg, + vm_prot_t prot __unused) { struct vnode *vp; int rtval;