Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_object.h
Show First 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | struct vm_object { | ||||
struct rwlock lock; | struct rwlock lock; | ||||
TAILQ_ENTRY(vm_object) object_list; /* list of all objects */ | TAILQ_ENTRY(vm_object) object_list; /* list of all objects */ | ||||
LIST_HEAD(, vm_object) shadow_head; /* objects that this is a shadow for */ | LIST_HEAD(, vm_object) shadow_head; /* objects that this is a shadow for */ | ||||
LIST_ENTRY(vm_object) shadow_list; /* chain of shadow objects */ | LIST_ENTRY(vm_object) shadow_list; /* chain of shadow objects */ | ||||
struct pglist memq; /* list of resident pages */ | struct pglist memq; /* list of resident pages */ | ||||
struct vm_radix rtree; /* root of the resident page radix trie*/ | struct vm_radix rtree; /* root of the resident page radix trie*/ | ||||
vm_pindex_t size; /* Object size */ | vm_pindex_t size; /* Object size */ | ||||
struct domainset_ref domain; /* NUMA policy. */ | struct domainset_ref domain; /* NUMA policy. */ | ||||
int generation; /* generation ID */ | volatile int generation; /* generation ID */ | ||||
int cleangeneration; /* Generation at clean time */ | |||||
volatile u_int ref_count; /* How many refs?? */ | volatile u_int ref_count; /* How many refs?? */ | ||||
int shadow_count; /* how many objects that this is a shadow for */ | int shadow_count; /* how many objects that this is a shadow for */ | ||||
vm_memattr_t memattr; /* default memory attribute for pages */ | vm_memattr_t memattr; /* default memory attribute for pages */ | ||||
objtype_t type; /* type of pager */ | objtype_t type; /* type of pager */ | ||||
u_short flags; /* see below */ | u_short flags; /* see below */ | ||||
u_short pg_color; /* (c) color of first page in obj */ | u_short pg_color; /* (c) color of first page in obj */ | ||||
volatile u_int paging_in_progress; /* Paging (in or out) so don't collapse or destroy */ | volatile u_int paging_in_progress; /* Paging (in or out) so don't collapse or destroy */ | ||||
volatile u_int busy; /* (a) object is busy, disallow page busy. */ | volatile u_int busy; /* (a) object is busy, disallow page busy. */ | ||||
▲ Show 20 Lines • Show All 65 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
#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_NOSPLIT 0x0010 /* dont split this object */ | #define OBJ_NOSPLIT 0x0010 /* dont split this object */ | ||||
#define OBJ_UMTXDEAD 0x0020 /* umtx pshared was terminated */ | #define OBJ_UMTXDEAD 0x0020 /* umtx pshared was terminated */ | ||||
#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_MIGHTBEDIRTY 0x0100 /* object might be dirty, only for vnode */ | |||||
#define OBJ_TMPFS_NODE 0x0200 /* object belongs to tmpfs VREG node */ | #define OBJ_TMPFS_NODE 0x0200 /* object belongs to tmpfs VREG node */ | ||||
#define OBJ_TMPFS_DIRTY 0x0400 /* dirty tmpfs obj */ | |||||
#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_TMPFS 0x8000 /* has tmpfs vnode allocated */ | #define OBJ_TMPFS 0x8000 /* has tmpfs vnode allocated */ | ||||
/* | /* | ||||
* Helpers to perform conversion between vm_object page indexes and offsets. | * Helpers to perform conversion between vm_object page indexes and offsets. | ||||
* IDX_TO_OFF() converts an index into an offset. | * IDX_TO_OFF() converts an index into an offset. | ||||
* OFF_TO_IDX() converts an offset into an index. | * OFF_TO_IDX() converts an offset into an index. | ||||
▲ Show 20 Lines • Show All 100 Lines • ▼ Show 20 Lines | |||||
vm_object_reserv(vm_object_t object) | 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) | |||||
{ | |||||
return (object->type != OBJT_VNODE && | |||||
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, char *waitid); | void vm_object_pip_wait(vm_object_t object, char *waitid); | ||||
void vm_object_pip_wait_unlocked(vm_object_t object, char *waitid); | void vm_object_pip_wait_unlocked(vm_object_t object, char *waitid); | ||||
▲ Show 20 Lines • Show All 49 Lines • Show Last 20 Lines |