Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_page.h
Show First 20 Lines • Show All 301 Lines • ▼ Show 20 Lines | #define VPB_BIT_FLAGMASK \ | ||||
(VPB_BIT_SHARED | VPB_BIT_EXCLUSIVE | VPB_BIT_WAITERS) | (VPB_BIT_SHARED | VPB_BIT_EXCLUSIVE | VPB_BIT_WAITERS) | ||||
#define VPB_SHARERS_SHIFT 3 | #define VPB_SHARERS_SHIFT 3 | ||||
#define VPB_SHARERS(x) \ | #define VPB_SHARERS(x) \ | ||||
(((x) & ~VPB_BIT_FLAGMASK) >> VPB_SHARERS_SHIFT) | (((x) & ~VPB_BIT_FLAGMASK) >> VPB_SHARERS_SHIFT) | ||||
#define VPB_SHARERS_WORD(x) ((x) << VPB_SHARERS_SHIFT | VPB_BIT_SHARED) | #define VPB_SHARERS_WORD(x) ((x) << VPB_SHARERS_SHIFT | VPB_BIT_SHARED) | ||||
#define VPB_ONE_SHARER (1 << VPB_SHARERS_SHIFT) | #define VPB_ONE_SHARER (1 << VPB_SHARERS_SHIFT) | ||||
#define VPB_SINGLE_EXCLUSIVER VPB_BIT_EXCLUSIVE | #define VPB_SINGLE_EXCLUSIVE VPB_BIT_EXCLUSIVE | ||||
#ifdef INVARIANTS | |||||
#define VPB_CURTHREAD_EXCLUSIVE \ | |||||
(VPB_BIT_EXCLUSIVE | ((u_int)(uintptr_t)curthread & ~VPB_BIT_FLAGMASK)) | |||||
#else | |||||
#define VPB_CURTHREAD_EXCLUSIVE VPB_SINGLE_EXCLUSIVE | |||||
#endif | |||||
#define VPB_UNBUSIED VPB_SHARERS_WORD(0) | #define VPB_UNBUSIED VPB_SHARERS_WORD(0) | ||||
#define PQ_NONE 255 | #define PQ_NONE 255 | ||||
#define PQ_INACTIVE 0 | #define PQ_INACTIVE 0 | ||||
#define PQ_ACTIVE 1 | #define PQ_ACTIVE 1 | ||||
#define PQ_LAUNDRY 2 | #define PQ_LAUNDRY 2 | ||||
#define PQ_UNSWAPPABLE 3 | #define PQ_UNSWAPPABLE 3 | ||||
▲ Show 20 Lines • Show All 325 Lines • ▼ Show 20 Lines | |||||
void vm_page_unhold_pages(vm_page_t *ma, int count); | void vm_page_unhold_pages(vm_page_t *ma, int count); | ||||
void vm_page_unswappable(vm_page_t m); | void vm_page_unswappable(vm_page_t m); | ||||
void vm_page_unwire(vm_page_t m, uint8_t queue); | void vm_page_unwire(vm_page_t m, uint8_t queue); | ||||
bool vm_page_unwire_noq(vm_page_t m); | bool vm_page_unwire_noq(vm_page_t m); | ||||
void vm_page_updatefake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr); | void vm_page_updatefake(vm_page_t m, vm_paddr_t paddr, vm_memattr_t memattr); | ||||
void vm_page_wire(vm_page_t); | void vm_page_wire(vm_page_t); | ||||
bool vm_page_wire_mapped(vm_page_t m); | bool vm_page_wire_mapped(vm_page_t m); | ||||
void vm_page_xunbusy_hard(vm_page_t m); | void vm_page_xunbusy_hard(vm_page_t m); | ||||
void vm_page_xunbusy_hard_unchecked(vm_page_t m); | |||||
void vm_page_set_validclean (vm_page_t, int, int); | void vm_page_set_validclean (vm_page_t, int, int); | ||||
void vm_page_clear_dirty(vm_page_t, int, int); | void vm_page_clear_dirty(vm_page_t, int, int); | ||||
void vm_page_set_invalid(vm_page_t, int, int); | void vm_page_set_invalid(vm_page_t, int, int); | ||||
void vm_page_valid(vm_page_t m); | void vm_page_valid(vm_page_t m); | ||||
int vm_page_is_valid(vm_page_t, int, int); | int vm_page_is_valid(vm_page_t, int, int); | ||||
void vm_page_test_dirty(vm_page_t); | void vm_page_test_dirty(vm_page_t); | ||||
vm_page_bits_t vm_page_bits(int base, int size); | vm_page_bits_t vm_page_bits(int base, int size); | ||||
void vm_page_zero_invalid(vm_page_t m, boolean_t setvalid); | void vm_page_zero_invalid(vm_page_t m, boolean_t setvalid); | ||||
Show All 19 Lines | KASSERT(vm_page_sbusied(m), \ | ||||
("vm_page_assert_sbusied: page %p not shared busy @ %s:%d", \ | ("vm_page_assert_sbusied: page %p not shared busy @ %s:%d", \ | ||||
(m), __FILE__, __LINE__)) | (m), __FILE__, __LINE__)) | ||||
#define vm_page_assert_unbusied(m) \ | #define vm_page_assert_unbusied(m) \ | ||||
KASSERT(!vm_page_busied(m), \ | KASSERT(!vm_page_busied(m), \ | ||||
("vm_page_assert_unbusied: page %p busy @ %s:%d", \ | ("vm_page_assert_unbusied: page %p busy @ %s:%d", \ | ||||
(m), __FILE__, __LINE__)) | (m), __FILE__, __LINE__)) | ||||
#define vm_page_assert_xbusied(m) \ | #define vm_page_assert_xbusied_unchecked(m) do { \ | ||||
KASSERT(vm_page_xbusied(m), \ | KASSERT(vm_page_xbusied(m), \ | ||||
("vm_page_assert_xbusied: page %p not exclusive busy @ %s:%d", \ | ("vm_page_assert_xbusied: page %p not exclusive busy @ %s:%d", \ | ||||
(m), __FILE__, __LINE__)) | (m), __FILE__, __LINE__)); \ | ||||
} while (0) | |||||
#define vm_page_assert_xbusied(m) do { \ | |||||
vm_page_assert_xbusied_unchecked(m); \ | |||||
KASSERT((m->busy_lock & ~VPB_BIT_WAITERS) == \ | |||||
VPB_CURTHREAD_EXCLUSIVE, \ | |||||
("vm_page_assert_xbusied: page %p busy_lock %#x not owned" \ | |||||
" by me @ %s:%d", \ | |||||
(m), (m)->busy_lock, __FILE__, __LINE__)); \ | |||||
} while (0) | |||||
#define vm_page_busied(m) \ | #define vm_page_busied(m) \ | ||||
((m)->busy_lock != VPB_UNBUSIED) | ((m)->busy_lock != VPB_UNBUSIED) | ||||
#define vm_page_sbusy(m) do { \ | #define vm_page_sbusy(m) do { \ | ||||
if (!vm_page_trysbusy(m)) \ | if (!vm_page_trysbusy(m)) \ | ||||
panic("%s: page %p failed shared busying", __func__, \ | panic("%s: page %p failed shared busying", __func__, \ | ||||
(m)); \ | (m)); \ | ||||
} while (0) | } while (0) | ||||
#define vm_page_xbusied(m) \ | #define vm_page_xbusied(m) \ | ||||
(((m)->busy_lock & VPB_SINGLE_EXCLUSIVER) != 0) | (((m)->busy_lock & VPB_SINGLE_EXCLUSIVE) != 0) | ||||
#define vm_page_xbusy(m) do { \ | #define vm_page_xbusy(m) do { \ | ||||
if (!vm_page_tryxbusy(m)) \ | if (!vm_page_tryxbusy(m)) \ | ||||
panic("%s: page %p failed exclusive busying", __func__, \ | panic("%s: page %p failed exclusive busying", __func__, \ | ||||
(m)); \ | (m)); \ | ||||
} while (0) | } while (0) | ||||
/* Note: page m's lock must not be owned by the caller. */ | /* Note: page m's lock must not be owned by the caller. */ | ||||
#define vm_page_xunbusy(m) do { \ | #define vm_page_xunbusy(m) do { \ | ||||
if (!atomic_cmpset_rel_int(&(m)->busy_lock, \ | if (!atomic_cmpset_rel_int(&(m)->busy_lock, \ | ||||
VPB_SINGLE_EXCLUSIVER, VPB_UNBUSIED)) \ | VPB_CURTHREAD_EXCLUSIVE, VPB_UNBUSIED)) \ | ||||
vm_page_xunbusy_hard(m); \ | vm_page_xunbusy_hard(m); \ | ||||
} while (0) | |||||
#define vm_page_xunbusy_unchecked(m) do { \ | |||||
if (!atomic_cmpset_rel_int(&(m)->busy_lock, \ | |||||
VPB_CURTHREAD_EXCLUSIVE, VPB_UNBUSIED)) \ | |||||
vm_page_xunbusy_hard_unchecked(m); \ | |||||
} while (0) | } while (0) | ||||
#ifdef INVARIANTS | #ifdef INVARIANTS | ||||
void vm_page_object_busy_assert(vm_page_t m); | void vm_page_object_busy_assert(vm_page_t m); | ||||
#define VM_PAGE_OBJECT_BUSY_ASSERT(m) vm_page_object_busy_assert(m) | #define VM_PAGE_OBJECT_BUSY_ASSERT(m) vm_page_object_busy_assert(m) | ||||
void vm_page_assert_pga_writeable(vm_page_t m, uint16_t bits); | void vm_page_assert_pga_writeable(vm_page_t m, uint16_t bits); | ||||
#define VM_PAGE_ASSERT_PGA_WRITEABLE(m, bits) \ | #define VM_PAGE_ASSERT_PGA_WRITEABLE(m, bits) \ | ||||
vm_page_assert_pga_writeable(m, bits) | vm_page_assert_pga_writeable(m, bits) | ||||
▲ Show 20 Lines • Show All 255 Lines • Show Last 20 Lines |