Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/device_pager.c
Show First 20 Lines • Show All 53 Lines • ▼ Show 20 Lines | |||||
#include <vm/vm_pager.h> | #include <vm/vm_pager.h> | ||||
#include <vm/vm_phys.h> | #include <vm/vm_phys.h> | ||||
#include <vm/uma.h> | #include <vm/uma.h> | ||||
static void dev_pager_init(void); | static void dev_pager_init(void); | ||||
static vm_object_t dev_pager_alloc(void *, vm_ooffset_t, vm_prot_t, | static vm_object_t dev_pager_alloc(void *, vm_ooffset_t, vm_prot_t, | ||||
vm_ooffset_t, struct ucred *); | vm_ooffset_t, struct ucred *); | ||||
static void dev_pager_dealloc(vm_object_t); | 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 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 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); | static void dev_pager_free_page(vm_object_t object, vm_page_t m); | ||||
/* list of device pager objects */ | /* list of device pager objects */ | ||||
static struct pagerlst dev_pager_object_list; | static struct pagerlst dev_pager_object_list; | ||||
/* protect list manipulation */ | /* protect list manipulation */ | ||||
static struct mtx dev_pager_mtx; | static struct mtx dev_pager_mtx; | ||||
▲ Show 20 Lines • Show All 182 Lines • ▼ Show 20 Lines | while ((m = TAILQ_FIRST(&object->un_pager.devp.devp_pglist)) | ||||
dev_pager_free_page(object, m); | dev_pager_free_page(object, m); | ||||
} | } | ||||
object->handle = NULL; | object->handle = NULL; | ||||
object->type = OBJT_DEAD; | object->type = OBJT_DEAD; | ||||
} | } | ||||
static int | static int | ||||
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 prot) | ||||
{ | { | ||||
int error; | int error, ahead; | ||||
/* 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 (object->type == OBJT_DEVICE) { | if (object->type == OBJT_DEVICE) | ||||
count = 1; | count = 1; | ||||
if (rahead) | |||||
*rahead = 0; | ahead = 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, count, rahead); | IDX_TO_OFF(ma[0]->pindex), prot, ma, count, &ahead); | ||||
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 (ahead == 0) | ||||
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 = ahead; | |||||
} | } | ||||
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, int count, int *rahead) | vm_page_t *mres, int count, int *rahead) | ||||
▲ Show 20 Lines • Show All 143 Lines • Show Last 20 Lines |