Index: sys/dev/drm2/i915/i915_gem.c =================================================================== --- sys/dev/drm2/i915/i915_gem.c +++ sys/dev/drm2/i915/i915_gem.c @@ -1475,7 +1475,7 @@ static int i915_gem_pager_fault(vm_object_t vm_obj, vm_ooffset_t offset, int prot, - vm_page_t *mres) + vm_page_t *mres, int count, int *rahead) { struct drm_gem_object *gem_obj = vm_obj->handle; struct drm_i915_gem_object *obj = to_intel_bo(gem_obj); Index: sys/dev/drm2/ttm/ttm_bo_vm.c =================================================================== --- sys/dev/drm2/ttm/ttm_bo_vm.c +++ sys/dev/drm2/ttm/ttm_bo_vm.c @@ -100,7 +100,7 @@ static int ttm_bo_vm_fault(vm_object_t vm_obj, vm_ooffset_t offset, - int prot, vm_page_t *mres) + int prot, vm_page_t *mres, int count, int *rahead) { struct ttm_buffer_object *bo = vm_obj->handle; Index: sys/dev/netmap/netmap_freebsd.c =================================================================== --- sys/dev/netmap/netmap_freebsd.c +++ sys/dev/netmap/netmap_freebsd.c @@ -492,7 +492,7 @@ static int netmap_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, - int prot, vm_page_t *mres) + int prot, vm_page_t *mres, int count, int *rahead) { struct netmap_vm_handle_t *vmh = object->handle; struct netmap_priv_d *priv = vmh->priv; Index: sys/dev/xen/privcmd/privcmd.c =================================================================== --- sys/dev/xen/privcmd/privcmd.c +++ sys/dev/xen/privcmd/privcmd.c @@ -90,7 +90,7 @@ vm_ooffset_t foff, struct ucred *cred, u_short *color); static void privcmd_pg_dtor(void *handle); static int privcmd_pg_fault(vm_object_t object, vm_ooffset_t offset, - int prot, vm_page_t *mres); + int prot, vm_page_t *mres, int count, int *rahead); static struct cdev_pager_ops privcmd_pg_ops = { .cdev_pg_fault = privcmd_pg_fault, @@ -151,7 +151,7 @@ static int privcmd_pg_fault(vm_object_t object, vm_ooffset_t offset, - int prot, vm_page_t *mres) + int prot, vm_page_t *mres, int count, int *rahead) { struct privcmd_map *map = object->handle; vm_pindex_t pidx; Index: sys/sys/conf.h =================================================================== --- sys/sys/conf.h +++ sys/sys/conf.h @@ -159,7 +159,8 @@ #define D_VERSION_01 0x17032005 /* Add d_uid,gid,mode & kind */ #define D_VERSION_02 0x28042009 /* Add d_mmap_single */ #define D_VERSION_03 0x17122009 /* d_mmap takes memattr,vm_ooffset_t */ -#define D_VERSION D_VERSION_03 +#define D_VERSION_04 0x20160527 /* device_pager fault takes a count and rahead */ +#define D_VERSION D_VERSION_04 /* * Flags used for internal housekeeping Index: sys/vm/device_pager.c =================================================================== --- sys/vm/device_pager.c +++ sys/vm/device_pager.c @@ -90,7 +90,7 @@ vm_ooffset_t foff, struct ucred *cred, u_short *color); static void old_dev_pager_dtor(void *handle); static int old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, - int prot, vm_page_t *mres); + int prot, vm_page_t *mres, int count, int *rahead); static struct cdev_pager_ops old_dev_pager_ops = { .cdev_pg_ctor = old_dev_pager_ctor, @@ -265,8 +265,11 @@ /* Since our haspage reports zero after/before, the count is 1. */ KASSERT(count == 1, ("%s: count %d", __func__, count)); VM_OBJECT_ASSERT_WLOCKED(object); + + if (rahead) + *rahead = 0; 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_READ, ma, count, rahead); VM_OBJECT_ASSERT_WLOCKED(object); @@ -282,8 +285,6 @@ } if (rbehind) *rbehind = 0; - if (rahead) - *rahead = 0; } return (error); @@ -291,7 +292,7 @@ static int old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, int prot, - vm_page_t *mres) + vm_page_t *mres, int count, int *rahead) { vm_paddr_t paddr; vm_page_t m_paddr, page; Index: sys/vm/vm_fault.c =================================================================== --- sys/vm/vm_fault.c +++ sys/vm/vm_fault.c @@ -1145,8 +1145,7 @@ VM_OBJECT_RUNLOCK(lobject); break; } - if (m->valid == VM_PAGE_BITS_ALL && - (m->flags & PG_FICTITIOUS) == 0) + if (m->valid == VM_PAGE_BITS_ALL) pmap_enter_quick(pmap, addr, m, entry->protection); VM_OBJECT_RUNLOCK(lobject); } Index: sys/vm/vm_pager.h =================================================================== --- sys/vm/vm_pager.h +++ sys/vm/vm_pager.h @@ -176,7 +176,7 @@ struct cdev_pager_ops { int (*cdev_pg_fault)(vm_object_t vm_obj, vm_ooffset_t offset, - int prot, vm_page_t *mres); + int prot, vm_page_t *mres, int count, int *rahead); int (*cdev_pg_ctor)(void *handle, vm_ooffset_t size, vm_prot_t prot, vm_ooffset_t foff, struct ucred *cred, u_short *color); void (*cdev_pg_dtor)(void *handle);