Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/device_pager.c
Show First 20 Lines • Show All 84 Lines • ▼ Show 20 Lines | struct pagerops mgtdevicepagerops = { | ||||
.pgo_putpages = dev_pager_putpages, | .pgo_putpages = dev_pager_putpages, | ||||
.pgo_haspage = dev_pager_haspage, | .pgo_haspage = dev_pager_haspage, | ||||
}; | }; | ||||
static int old_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, | static int old_dev_pager_ctor(void *handle, vm_ooffset_t size, vm_prot_t prot, | ||||
vm_ooffset_t foff, struct ucred *cred, u_short *color); | vm_ooffset_t foff, struct ucred *cred, u_short *color); | ||||
static void old_dev_pager_dtor(void *handle); | static void old_dev_pager_dtor(void *handle); | ||||
static int old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, | 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 = { | static struct cdev_pager_ops old_dev_pager_ops = { | ||||
.cdev_pg_ctor = old_dev_pager_ctor, | .cdev_pg_ctor = old_dev_pager_ctor, | ||||
.cdev_pg_dtor = old_dev_pager_dtor, | .cdev_pg_dtor = old_dev_pager_dtor, | ||||
.cdev_pg_fault = old_dev_pager_fault | .cdev_pg_fault = old_dev_pager_fault | ||||
}; | }; | ||||
static void | static void | ||||
▲ Show 20 Lines • Show All 158 Lines • ▼ Show 20 Lines | |||||
dev_pager_getpages(vm_object_t object, vm_page_t *ma, int count, int *rbehind, | dev_pager_getpages(vm_object_t object, vm_page_t *ma, int count, int *rbehind, | ||||
int *rahead) | int *rahead) | ||||
{ | { | ||||
int error; | int error; | ||||
/* Since our haspage reports zero after/before, the count is 1. */ | /* Since our haspage reports zero after/before, the count is 1. */ | ||||
KASSERT(count == 1, ("%s: count %d", __func__, count)); | KASSERT(count == 1, ("%s: count %d", __func__, count)); | ||||
VM_OBJECT_ASSERT_WLOCKED(object); | VM_OBJECT_ASSERT_WLOCKED(object); | ||||
if (rahead) | |||||
*rahead = 0; | |||||
error = object->un_pager.devp.ops->cdev_pg_fault(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_READ, ma, count, rahead); | ||||
VM_OBJECT_ASSERT_WLOCKED(object); | VM_OBJECT_ASSERT_WLOCKED(object); | ||||
if (error == VM_PAGER_OK) { | if (error == VM_PAGER_OK) { | ||||
KASSERT((object->type == OBJT_DEVICE && | KASSERT((object->type == OBJT_DEVICE && | ||||
(ma[0]->oflags & VPO_UNMANAGED) != 0) || | (ma[0]->oflags & VPO_UNMANAGED) != 0) || | ||||
(object->type == OBJT_MGTDEVICE && | (object->type == OBJT_MGTDEVICE && | ||||
(ma[0]->oflags & VPO_UNMANAGED) == 0), | (ma[0]->oflags & VPO_UNMANAGED) == 0), | ||||
("Wrong page type %p %p", ma[0], object)); | ("Wrong page type %p %p", ma[0], object)); | ||||
if (object->type == OBJT_DEVICE) { | if (object->type == OBJT_DEVICE) { | ||||
TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, | TAILQ_INSERT_TAIL(&object->un_pager.devp.devp_pglist, | ||||
ma[0], plinks.q); | ma[0], plinks.q); | ||||
} | } | ||||
if (rbehind) | if (rbehind) | ||||
*rbehind = 0; | *rbehind = 0; | ||||
if (rahead) | |||||
*rahead = 0; | |||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static int | static int | ||||
old_dev_pager_fault(vm_object_t object, vm_ooffset_t offset, int prot, | 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_paddr_t paddr; | ||||
vm_page_t m_paddr, page; | vm_page_t m_paddr, page; | ||||
struct cdev *dev; | struct cdev *dev; | ||||
struct cdevsw *csw; | struct cdevsw *csw; | ||||
struct file *fpop; | struct file *fpop; | ||||
struct thread *td; | struct thread *td; | ||||
vm_memattr_t memattr, memattr1; | vm_memattr_t memattr, memattr1; | ||||
▲ Show 20 Lines • Show All 132 Lines • Show Last 20 Lines |