diff --git a/sys/dev/drm2/i915/i915_gem.c b/sys/dev/drm2/i915/i915_gem.c index 2e75623..cbe833a 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, NULL, NULL, + VM_PROT_ALL); 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..8c4bfdf 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); + NULL, NULL, VM_PROT_ALL); 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..a407656 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); + NULL, NULL, VM_PROT_ALL); 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); + NULL, NULL, VM_PROT_ALL); 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); + NULL, NULL, VM_PROT_ALL); 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 72e8792..9117689 100644 --- a/sys/fs/tmpfs/tmpfs_subr.c +++ b/sys/fs/tmpfs/tmpfs_subr.c @@ -1371,7 +1371,7 @@ retry: 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; diff --git a/sys/kern/kern_exec.c b/sys/kern/kern_exec.c index d2de3c8..9632344 100644 --- a/sys/kern/kern_exec.c +++ b/sys/kern/kern_exec.c @@ -1004,7 +1004,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, NULL, NULL, + VM_PROT_ALL); 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 7ee7780..03c4730 100644 --- a/sys/kern/kern_sendfile.c +++ b/sys/kern/kern_sendfile.c @@ -389,7 +389,7 @@ sendfile_swapin(vm_object_t obj, struct sf_io *sfio, off_t off, off_t len, 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])); diff --git a/sys/kern/uipc_shm.c b/sys/kern/uipc_shm.c index 4503139..481368b 100644 --- a/sys/kern/uipc_shm.c +++ b/sys/kern/uipc_shm.c @@ -185,7 +185,8 @@ uiomove_object_page(vm_object_t obj, size_t len, struct uio *uio) 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 @@ retry: 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; diff --git a/sys/vm/default_pager.c b/sys/vm/default_pager.c index f334cd7..f6acfb3 100644 --- a/sys/vm/default_pager.c +++ b/sys/vm/default_pager.c @@ -56,7 +56,8 @@ __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 *, + 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 @@ default_pager_dealloc(object) */ 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); diff --git a/sys/vm/device_pager.c b/sys/vm/device_pager.c index 2080fdf..34b296e 100644 --- a/sys/vm/device_pager.c +++ b/sys/vm/device_pager.c @@ -59,7 +59,8 @@ 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 *, + 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 @@ 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) + int *rahead, vm_prot_t prot) { int error; @@ -266,7 +267,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..f2d6e7a 100644 --- a/sys/vm/phys_pager.c +++ b/sys/vm/phys_pager.c @@ -140,7 +140,7 @@ phys_pager_dealloc(vm_object_t object) */ 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; diff --git a/sys/vm/sg_pager.c b/sys/vm/sg_pager.c index 2cccb7ea..a1fa6ec 100644 --- a/sys/vm/sg_pager.c +++ b/sys/vm/sg_pager.c @@ -49,7 +49,8 @@ __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 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 @@ 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) + int *rahead, vm_prot_t prot __unused) { struct sglist *sg; vm_page_t m_paddr, page; diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 6ab965b..c0674b7 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -359,9 +359,9 @@ static vm_object_t 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 @@ swap_pager_alloc(void *handle, vm_ooffset_t size, vm_prot_t prot, * 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 @@ swap_pager_unswapped(vm_page_t m) */ 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 @@ swap_pager_getpages(vm_object_t object, vm_page_t *m, int count, int *rbehind, */ 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 @@ 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, 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); diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 50bf725..c6bbee4 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -650,7 +650,7 @@ vnode_locked: * 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++; diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index 83dc01a..d2bbb6b 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -238,7 +238,7 @@ vm_imgact_hold_page(vm_object_t object, vm_ooffset_t offset) 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 @@ 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, 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); diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 88bc593..ef7e2f0 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -2021,7 +2021,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, NULL, NULL, + VM_PROT_ALL); 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 fccd1c8..1cbd30a 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 *, + 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 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) + int *rahead, vm_prot_t prot __unused) { return (VM_PAGER_FAIL); @@ -279,7 +280,7 @@ vm_pager_assert_in(vm_object_t object, vm_page_t *m, int count) */ 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_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); + rahead, prot); if (r != VM_PAGER_OK) return (r); @@ -312,13 +313,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, - 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)); } /* diff --git a/sys/vm/vm_pager.h b/sys/vm/vm_pager.h index 4b7d100..b91039f 100644 --- a/sys/vm/vm_pager.h +++ b/sys/vm/vm_pager.h @@ -50,10 +50,11 @@ 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 *, + 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_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(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 *); diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index cc43976..90c093e 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -84,9 +84,10 @@ 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(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 @@ vnode_pager_input_old(vm_object_t object, vm_page_t m) */ 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 @@ 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 *rbehind, int *rahead, vop_getpages_iodone_t iodone, void *arg, + vm_prot_t prot __unused) { struct vnode *vp; int rtval;