Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_pager.c
Show First 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | |||||
static void pbuf_dtor(void *, int, void *); | static void pbuf_dtor(void *, int, void *); | ||||
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 *); | ||||
static vm_object_t dead_pager_alloc(void *, vm_ooffset_t, vm_prot_t, | static vm_object_t dead_pager_alloc(void *, vm_ooffset_t, vm_prot_t, | ||||
vm_ooffset_t, struct ucred *); | vm_ooffset_t, struct ucred *); | ||||
static void dead_pager_putpages(vm_object_t, vm_page_t *, int, int, int *); | static void dead_pager_putpages(vm_object_t, vm_page_t *, int, int, int *); | ||||
static boolean_t dead_pager_haspage(vm_object_t, vm_pindex_t, int *, int *); | static boolean_t dead_pager_haspage(vm_object_t, vm_pindex_t, int *, int *); | ||||
static void dead_pager_dealloc(vm_object_t); | static void dead_pager_dealloc(vm_object_t); | ||||
static void dead_pager_getvp(vm_object_t, struct vnode **, bool *); | |||||
static int | static int | ||||
dead_pager_getpages(vm_object_t obj, vm_page_t *ma, int count, int *rbehind, | dead_pager_getpages(vm_object_t obj, vm_page_t *ma, int count, int *rbehind, | ||||
int *rahead) | int *rahead) | ||||
{ | { | ||||
return (VM_PAGER_FAIL); | return (VM_PAGER_FAIL); | ||||
} | } | ||||
Show All 28 Lines | |||||
} | } | ||||
static void | static void | ||||
dead_pager_dealloc(vm_object_t object) | dead_pager_dealloc(vm_object_t object) | ||||
{ | { | ||||
} | } | ||||
static struct pagerops deadpagerops = { | static void | ||||
dead_pager_getvp(vm_object_t object, struct vnode **vpp, bool *vp_heldp) | |||||
{ | |||||
/* | |||||
* For OBJT_DEAD objects, v_writecount was handled in | |||||
* vnode_pager_dealloc(). | |||||
*/ | |||||
} | |||||
static const struct pagerops deadpagerops = { | |||||
.pgo_alloc = dead_pager_alloc, | .pgo_alloc = dead_pager_alloc, | ||||
.pgo_dealloc = dead_pager_dealloc, | .pgo_dealloc = dead_pager_dealloc, | ||||
.pgo_getpages = dead_pager_getpages, | .pgo_getpages = dead_pager_getpages, | ||||
.pgo_putpages = dead_pager_putpages, | .pgo_putpages = dead_pager_putpages, | ||||
.pgo_haspage = dead_pager_haspage, | .pgo_haspage = dead_pager_haspage, | ||||
.pgo_getvp = dead_pager_getvp, | |||||
}; | }; | ||||
struct pagerops *pagertab[] = { | const struct pagerops *pagertab[] __read_mostly = { | ||||
&defaultpagerops, /* OBJT_DEFAULT */ | [OBJT_DEFAULT] = &defaultpagerops, | ||||
&swappagerops, /* OBJT_SWAP */ | [OBJT_SWAP] = &swappagerops, | ||||
&vnodepagerops, /* OBJT_VNODE */ | [OBJT_VNODE] = &vnodepagerops, | ||||
&devicepagerops, /* OBJT_DEVICE */ | [OBJT_DEVICE] = &devicepagerops, | ||||
&physpagerops, /* OBJT_PHYS */ | [OBJT_PHYS] = &physpagerops, | ||||
&deadpagerops, /* OBJT_DEAD */ | [OBJT_DEAD] = &deadpagerops, | ||||
&sgpagerops, /* OBJT_SG */ | [OBJT_SG] = &sgpagerops, | ||||
&mgtdevicepagerops, /* OBJT_MGTDEVICE */ | [OBJT_MGTDEVICE] = &mgtdevicepagerops, | ||||
[OBJT_SWAP_TMPFS] = &swaptmpfspagerops, | |||||
}; | }; | ||||
void | void | ||||
vm_pager_init(void) | vm_pager_init(void) | ||||
{ | { | ||||
struct pagerops **pgops; | const struct pagerops **pgops; | ||||
/* | /* | ||||
* Initialize known pagers | * Initialize known pagers | ||||
*/ | */ | ||||
for (pgops = pagertab; pgops < &pagertab[nitems(pagertab)]; pgops++) | for (pgops = pagertab; pgops < &pagertab[nitems(pagertab)]; pgops++) | ||||
if ((*pgops)->pgo_init != NULL) | if ((*pgops)->pgo_init != NULL) | ||||
(*(*pgops)->pgo_init)(); | (*(*pgops)->pgo_init)(); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 49 Lines • ▼ Show 20 Lines | |||||
* Size, protection and offset parameters are passed in for pagers that | * Size, protection and offset parameters are passed in for pagers that | ||||
* need to perform page-level validation (e.g. the device pager). | * need to perform page-level validation (e.g. the device pager). | ||||
*/ | */ | ||||
vm_object_t | vm_object_t | ||||
vm_pager_allocate(objtype_t type, void *handle, vm_ooffset_t size, | vm_pager_allocate(objtype_t type, void *handle, vm_ooffset_t size, | ||||
vm_prot_t prot, vm_ooffset_t off, struct ucred *cred) | vm_prot_t prot, vm_ooffset_t off, struct ucred *cred) | ||||
{ | { | ||||
vm_object_t ret; | vm_object_t ret; | ||||
struct pagerops *ops; | const struct pagerops *ops; | ||||
ops = pagertab[type]; | ops = pagertab[type]; | ||||
if (ops) | if (ops) | ||||
ret = (*ops->pgo_alloc)(handle, size, prot, off, cred); | ret = (*ops->pgo_alloc)(handle, size, prot, off, cred); | ||||
else | else | ||||
ret = NULL; | ret = NULL; | ||||
return (ret); | return (ret); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 247 Lines • ▼ Show 20 Lines | pbrelbo(struct buf *bp) | ||||
KASSERT(bp->b_vp == NULL, ("pbrelbo: vnode")); | KASSERT(bp->b_vp == NULL, ("pbrelbo: vnode")); | ||||
KASSERT(bp->b_bufobj != NULL, ("pbrelbo: NULL bufobj")); | KASSERT(bp->b_bufobj != NULL, ("pbrelbo: NULL bufobj")); | ||||
KASSERT((bp->b_xflags & (BX_VNDIRTY | BX_VNCLEAN)) == 0, | KASSERT((bp->b_xflags & (BX_VNDIRTY | BX_VNCLEAN)) == 0, | ||||
("pbrelbo: pager buf on vnode list.")); | ("pbrelbo: pager buf on vnode list.")); | ||||
bp->b_bufobj = NULL; | bp->b_bufobj = NULL; | ||||
bp->b_flags &= ~B_PAGING; | bp->b_flags &= ~B_PAGING; | ||||
} | |||||
void | |||||
vm_object_set_writeable_dirty(vm_object_t object) | |||||
{ | |||||
pgo_set_writeable_dirty_t *method; | |||||
method = pagertab[object->type]->pgo_set_writeable_dirty; | |||||
if (method != NULL) | |||||
method(object); | |||||
} | |||||
bool | |||||
vm_object_mightbedirty(vm_object_t object) | |||||
{ | |||||
pgo_mightbedirty_t *method; | |||||
method = pagertab[object->type]->pgo_mightbedirty; | |||||
if (method == NULL) | |||||
return (false); | |||||
return (method(object)); | |||||
} | } |