Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_object.h
Show First 20 Lines • Show All 134 Lines • ▼ Show 20 Lines | union { | ||||
/* | /* | ||||
* Device pager | * Device pager | ||||
* | * | ||||
* devp_pglist - list of allocated pages | * devp_pglist - list of allocated pages | ||||
*/ | */ | ||||
struct { | struct { | ||||
TAILQ_HEAD(, vm_page) devp_pglist; | TAILQ_HEAD(, vm_page) devp_pglist; | ||||
struct cdev_pager_ops *ops; | const struct cdev_pager_ops *ops; | ||||
struct cdev *dev; | struct cdev *dev; | ||||
} devp; | } devp; | ||||
/* | /* | ||||
* SG pager | * SG pager | ||||
* | * | ||||
* sgp_pglist - list of allocated pages | * sgp_pglist - list of allocated pages | ||||
*/ | */ | ||||
Show All 21 Lines | struct { | ||||
struct pctrie swp_blks; | struct pctrie swp_blks; | ||||
vm_ooffset_t writemappings; | vm_ooffset_t writemappings; | ||||
} swp; | } swp; | ||||
/* | /* | ||||
* Phys pager | * Phys pager | ||||
*/ | */ | ||||
struct { | struct { | ||||
struct phys_pager_ops *ops; | const struct phys_pager_ops *ops; | ||||
union { | union { | ||||
void *data_ptr; | void *data_ptr; | ||||
uintptr_t data_val; | uintptr_t data_val; | ||||
}; | }; | ||||
} phys; | } phys; | ||||
} un_pager; | } un_pager; | ||||
struct ucred *cred; | struct ucred *cred; | ||||
vm_ooffset_t charge; | vm_ooffset_t charge; | ||||
void *umtx_data; | void *umtx_data; | ||||
}; | }; | ||||
/* | /* | ||||
* Flags | * Flags | ||||
*/ | */ | ||||
#define OBJ_FICTITIOUS 0x0001 /* (c) contains fictitious pages */ | #define OBJ_FICTITIOUS 0x0001 /* (c) contains fictitious pages */ | ||||
#define OBJ_UNMANAGED 0x0002 /* (c) contains unmanaged pages */ | #define OBJ_UNMANAGED 0x0002 /* (c) contains unmanaged pages */ | ||||
#define OBJ_POPULATE 0x0004 /* pager implements populate() */ | #define OBJ_POPULATE 0x0004 /* pager implements populate() */ | ||||
#define OBJ_DEAD 0x0008 /* dead objects (during rundown) */ | #define OBJ_DEAD 0x0008 /* dead objects (during rundown) */ | ||||
#define OBJ_ANON 0x0010 /* (c) contains anonymous memory */ | #define OBJ_ANON 0x0010 /* (c) contains anonymous memory */ | ||||
#define OBJ_UMTXDEAD 0x0020 /* umtx pshared was terminated */ | #define OBJ_UMTXDEAD 0x0020 /* umtx pshared was terminated */ | ||||
#define OBJ_SIZEVNLOCK 0x0040 /* lock vnode to check obj size */ | #define OBJ_SIZEVNLOCK 0x0040 /* lock vnode to check obj size */ | ||||
#define OBJ_PG_DTOR 0x0080 /* dont reset object, leave that for dtor */ | #define OBJ_PG_DTOR 0x0080 /* dont reset object, leave that for dtor */ | ||||
#define OBJ_TMPFS_NODE 0x0200 /* object belongs to tmpfs VREG node */ | #define OBJ_SWAP 0x0200 /* object swaps */ | ||||
markj: "swapping" sounds transient, like `(flags & OBJ_SWAPPING) != 0` implies `paging_in_progress >… | |||||
#define OBJ_SPLIT 0x0400 /* object is being split */ | #define OBJ_SPLIT 0x0400 /* object is being split */ | ||||
#define OBJ_COLLAPSING 0x0800 /* Parent of collapse. */ | #define OBJ_COLLAPSING 0x0800 /* Parent of collapse. */ | ||||
#define OBJ_COLORED 0x1000 /* pg_color is defined */ | #define OBJ_COLORED 0x1000 /* pg_color is defined */ | ||||
#define OBJ_ONEMAPPING 0x2000 /* One USE (a single, non-forked) mapping flag */ | #define OBJ_ONEMAPPING 0x2000 /* One USE (a single, non-forked) mapping flag */ | ||||
#define OBJ_SHADOWLIST 0x4000 /* Object is on the shadow list. */ | #define OBJ_SHADOWLIST 0x4000 /* Object is on the shadow list. */ | ||||
#define OBJ_TMPFS 0x8000 /* has tmpfs vnode allocated */ | #define OBJ_TMPFS 0x8000 /* has tmpfs vnode allocated */ | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 112 Lines • ▼ Show 20 Lines | vm_object_reserv(vm_object_t object) | ||||
if (object != NULL && | if (object != NULL && | ||||
(object->flags & (OBJ_COLORED | OBJ_FICTITIOUS)) == OBJ_COLORED) { | (object->flags & (OBJ_COLORED | OBJ_FICTITIOUS)) == OBJ_COLORED) { | ||||
return (true); | return (true); | ||||
} | } | ||||
return (false); | return (false); | ||||
} | } | ||||
static __inline bool | |||||
vm_object_mightbedirty(vm_object_t object) | |||||
{ | |||||
if (object->type != OBJT_VNODE) { | |||||
if ((object->flags & OBJ_TMPFS_NODE) == 0) | |||||
return (false); | |||||
#ifdef KASSERT | |||||
KASSERT(object->type == OBJT_SWAP, | |||||
("TMPFS_NODE obj %p is not swap", object)); | |||||
#endif | |||||
} | |||||
return (object->generation != object->cleangeneration); | |||||
} | |||||
void vm_object_clear_flag(vm_object_t object, u_short bits); | void vm_object_clear_flag(vm_object_t object, u_short bits); | ||||
void vm_object_pip_add(vm_object_t object, short i); | void vm_object_pip_add(vm_object_t object, short i); | ||||
void vm_object_pip_wakeup(vm_object_t object); | void vm_object_pip_wakeup(vm_object_t object); | ||||
void vm_object_pip_wakeupn(vm_object_t object, short i); | void vm_object_pip_wakeupn(vm_object_t object, short i); | ||||
void vm_object_pip_wait(vm_object_t object, const char *waitid); | void vm_object_pip_wait(vm_object_t object, const char *waitid); | ||||
void vm_object_pip_wait_unlocked(vm_object_t object, const char *waitid); | void vm_object_pip_wait_unlocked(vm_object_t object, const char *waitid); | ||||
void vm_object_busy(vm_object_t object); | void vm_object_busy(vm_object_t object); | ||||
Show All 17 Lines | vm_object_t vm_object_allocate_anon(vm_pindex_t, vm_object_t, struct ucred *, | ||||
vm_size_t); | vm_size_t); | ||||
boolean_t vm_object_coalesce(vm_object_t, vm_ooffset_t, vm_size_t, vm_size_t, | boolean_t vm_object_coalesce(vm_object_t, vm_ooffset_t, vm_size_t, vm_size_t, | ||||
boolean_t); | boolean_t); | ||||
void vm_object_collapse (vm_object_t); | void vm_object_collapse (vm_object_t); | ||||
void vm_object_deallocate (vm_object_t); | void vm_object_deallocate (vm_object_t); | ||||
void vm_object_destroy (vm_object_t); | void vm_object_destroy (vm_object_t); | ||||
void vm_object_terminate (vm_object_t); | void vm_object_terminate (vm_object_t); | ||||
void vm_object_set_writeable_dirty (vm_object_t); | void vm_object_set_writeable_dirty (vm_object_t); | ||||
void vm_object_set_writeable_dirty_(vm_object_t object); | |||||
bool vm_object_mightbedirty(vm_object_t object); | |||||
bool vm_object_mightbedirty_(vm_object_t object); | |||||
void vm_object_init (void); | void vm_object_init (void); | ||||
int vm_object_kvme_type(vm_object_t object, struct vnode **vpp); | int vm_object_kvme_type(vm_object_t object, struct vnode **vpp); | ||||
void vm_object_madvise(vm_object_t, vm_pindex_t, vm_pindex_t, int); | void vm_object_madvise(vm_object_t, vm_pindex_t, vm_pindex_t, int); | ||||
boolean_t vm_object_page_clean(vm_object_t object, vm_ooffset_t start, | boolean_t vm_object_page_clean(vm_object_t object, vm_ooffset_t start, | ||||
vm_ooffset_t end, int flags); | vm_ooffset_t end, int flags); | ||||
void vm_object_page_noreuse(vm_object_t object, vm_pindex_t start, | void vm_object_page_noreuse(vm_object_t object, vm_pindex_t start, | ||||
vm_pindex_t end); | vm_pindex_t end); | ||||
void vm_object_page_remove(vm_object_t object, vm_pindex_t start, | void vm_object_page_remove(vm_object_t object, vm_pindex_t start, | ||||
Show All 17 Lines |
"swapping" sounds transient, like (flags & OBJ_SWAPPING) != 0 implies paging_in_progress > 0. I think OBJ_SWAP would be better.