Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_page.h
Context not available. | |||||
* The algorithm is taken mostly by rwlock(9) and sx(9) locks implementation, | * The algorithm is taken mostly by rwlock(9) and sx(9) locks implementation, | ||||
* even if the support for owner identity is removed because of size | * even if the support for owner identity is removed because of size | ||||
* constraints. Checks on lock recursion are then not possible, while the | * constraints. Checks on lock recursion are then not possible, while the | ||||
* lock assertions effectiveness is someway reduced. | * lock assertions effectiveness is somewhat reduced. | ||||
*/ | */ | ||||
#define VPB_BIT_SHARED 0x01 | #define VPB_BIT_SHARED 0x01 | ||||
#define VPB_BIT_EXCLUSIVE 0x02 | #define VPB_BIT_EXCLUSIVE 0x02 | ||||
Context not available. | |||||
#define PQ_ACTIVE 1 | #define PQ_ACTIVE 1 | ||||
#define PQ_COUNT 2 | #define PQ_COUNT 2 | ||||
#include <vm/vm_param.h> /* PA_LOCK_COUNT */ | |||||
#define VM_ASSERT(exp) KASSERT(exp, (#exp)) | |||||
TAILQ_HEAD(pglist, vm_page); | TAILQ_HEAD(pglist, vm_page); | ||||
SLIST_HEAD(spglist, vm_page); | SLIST_HEAD(spglist, vm_page); | ||||
Context not available. | |||||
struct vm_domain { | struct vm_domain { | ||||
struct vm_pagequeue vmd_pagequeues[PQ_COUNT]; | struct vm_pagequeue vmd_pagequeues[PQ_COUNT + PA_LOCK_COUNT]; | ||||
u_int vmd_page_count; | u_int vmd_page_count; | ||||
u_int vmd_free_count; | u_int vmd_free_count; | ||||
long vmd_segs; /* bitmask of the segments */ | long vmd_segs; /* bitmask of the segments */ | ||||
Context not available. | |||||
int vmd_pass; /* local pagedaemon pass */ | int vmd_pass; /* local pagedaemon pass */ | ||||
struct vm_page vmd_marker; /* marker for pagedaemon private use */ | struct vm_page vmd_marker; /* marker for pagedaemon private use */ | ||||
}; | }; | ||||
#define vm_page_queue_idx(m) (PQ_COUNT + (pa_index(VM_PAGE_TO_PHYS((m))) % PA_LOCK_COUNT)) | |||||
extern struct vm_domain vm_dom[MAXMEMDOM]; | extern struct vm_domain vm_dom[MAXMEMDOM]; | ||||
Context not available. | |||||
vm_pagequeue_cnt_add(struct vm_pagequeue *pq, int addend) | vm_pagequeue_cnt_add(struct vm_pagequeue *pq, int addend) | ||||
{ | { | ||||
#ifdef notyet | |||||
vm_pagequeue_assert_locked(pq); | |||||
#endif | |||||
pq->pq_cnt += addend; | pq->pq_cnt += addend; | ||||
atomic_add_int(pq->pq_vcnt, addend); | atomic_add_int(pq->pq_vcnt, addend); | ||||
} | } | ||||
Context not available. | |||||
* Page flags. If changed at any other time than page allocation or | * Page flags. If changed at any other time than page allocation or | ||||
* freeing, the modification must be protected by the vm_page lock. | * freeing, the modification must be protected by the vm_page lock. | ||||
*/ | */ | ||||
#define PG_UNUSED1 0x0001 /* unused - was PG_CACHED */ | #define PG_PAQUEUE 0x0001 /* page has inactivation pending */ | ||||
#define PG_FICTITIOUS 0x0004 /* physical page doesn't exist */ | #define PG_FICTITIOUS 0x0004 /* physical page doesn't exist */ | ||||
#define PG_ZERO 0x0008 /* page is zeroed */ | #define PG_ZERO 0x0008 /* page is zeroed */ | ||||
#define PG_MARKER 0x0010 /* special queue marker page */ | #define PG_MARKER 0x0010 /* special queue marker page */ | ||||
Context not available. | |||||
vm_page_t vm_page_next(vm_page_t m); | vm_page_t vm_page_next(vm_page_t m); | ||||
int vm_page_pa_tryrelock(pmap_t, vm_paddr_t, vm_paddr_t *); | int vm_page_pa_tryrelock(pmap_t, vm_paddr_t, vm_paddr_t *); | ||||
struct vm_pagequeue *vm_page_pagequeue(vm_page_t m); | struct vm_pagequeue *vm_page_pagequeue(vm_page_t m); | ||||
struct vm_pagequeue *vm_page_pagequeue_deferred(vm_page_t m); | |||||
vm_page_t vm_page_prev(vm_page_t m); | vm_page_t vm_page_prev(vm_page_t m); | ||||
boolean_t vm_page_ps_is_valid(vm_page_t m); | boolean_t vm_page_ps_is_valid(vm_page_t m); | ||||
void vm_page_putfake(vm_page_t m); | void vm_page_putfake(vm_page_t m); | ||||
Context not available. | |||||
void vm_page_free_toq(vm_page_t m); | void vm_page_free_toq(vm_page_t m); | ||||
void vm_page_zero_idle_wakeup(void); | void vm_page_zero_idle_wakeup(void); | ||||
int vm_page_queue_fixup(struct vm_domain *vmd); | |||||
void vm_page_dirty_KBI(vm_page_t m); | void vm_page_dirty_KBI(vm_page_t m); | ||||
void vm_page_lock_KBI(vm_page_t m, const char *file, int line); | void vm_page_lock_KBI(vm_page_t m, const char *file, int line); | ||||
void vm_page_unlock_KBI(vm_page_t m, const char *file, int line); | void vm_page_unlock_KBI(vm_page_t m, const char *file, int line); | ||||
Context not available. |