Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_page.h
Show First 20 Lines • Show All 63 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* Resident memory system definitions. | * Resident memory system definitions. | ||||
*/ | */ | ||||
#ifndef _VM_PAGE_ | #ifndef _VM_PAGE_ | ||||
#define _VM_PAGE_ | #define _VM_PAGE_ | ||||
#include <sys/_bitset.h> | |||||
#include <sys/bitset.h> | |||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
/* | /* | ||||
* Management of resident (logical) pages. | * Management of resident (logical) pages. | ||||
* | * | ||||
* A small structure is kept for each resident | * A small structure is kept for each resident | ||||
* page, indexed by page number. Each structure | * page, indexed by page number. Each structure | ||||
* is an element of several collections: | * is an element of several collections: | ||||
▲ Show 20 Lines • Show All 499 Lines • ▼ Show 20 Lines | |||||
* PS_ALL_DIRTY is true only if the entire (super)page is dirty. | * PS_ALL_DIRTY is true only if the entire (super)page is dirty. | ||||
* However, it can be spuriously false when the (super)page has become | * However, it can be spuriously false when the (super)page has become | ||||
* dirty in the pmap but that information has not been propagated to the | * dirty in the pmap but that information has not been propagated to the | ||||
* machine-independent layer. | * machine-independent layer. | ||||
*/ | */ | ||||
#define PS_ALL_DIRTY 0x1 | #define PS_ALL_DIRTY 0x1 | ||||
#define PS_ALL_VALID 0x2 | #define PS_ALL_VALID 0x2 | ||||
#define PS_NONE_BUSY 0x4 | #define PS_NONE_BUSY 0x4 | ||||
extern struct bitset *vm_page_dump; | |||||
extern long vm_page_dump_pages; | |||||
extern vm_paddr_t dump_avail[]; | |||||
static inline void | |||||
dump_add_page(vm_paddr_t pa) | |||||
{ | |||||
vm_pindex_t adj; | |||||
int i; | |||||
adj = 0; | |||||
for (i = 0; dump_avail[i + 1] != 0; i += 2) { | |||||
if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) { | |||||
BIT_SET_ATOMIC(vm_page_dump_pages, | |||||
(pa >> PAGE_SHIFT) - (dump_avail[i] >> PAGE_SHIFT) + | |||||
adj, vm_page_dump); | |||||
return; | |||||
} | |||||
adj += howmany(dump_avail[i + 1], PAGE_SIZE) - | |||||
dump_avail[i] / PAGE_SIZE; | |||||
} | |||||
} | |||||
static inline void | |||||
dump_drop_page(vm_paddr_t pa) | |||||
{ | |||||
vm_pindex_t adj; | |||||
int i; | |||||
adj = 0; | |||||
for (i = 0; dump_avail[i + 1] != 0; i += 2) { | |||||
if (pa >= dump_avail[i] && pa < dump_avail[i + 1]) { | |||||
BIT_CLR_ATOMIC(vm_page_dump_pages, | |||||
(pa >> PAGE_SHIFT) - (dump_avail[i] >> PAGE_SHIFT) + | |||||
adj, vm_page_dump); | |||||
return; | |||||
} | |||||
adj += howmany(dump_avail[i + 1], PAGE_SIZE) - | |||||
dump_avail[i] / PAGE_SIZE; | |||||
} | |||||
} | |||||
static inline vm_paddr_t | |||||
vm_page_dump_index_to_pa(int bit) | |||||
{ | |||||
int i, tot; | |||||
for (i = 0; dump_avail[i + 1] != 0; i += 2) { | |||||
tot = howmany(dump_avail[i + 1], PAGE_SIZE) - | |||||
dump_avail[i] / PAGE_SIZE; | |||||
if (bit < tot) | |||||
return ((vm_paddr_t)bit * PAGE_SIZE + | |||||
(dump_avail[i] & ~PAGE_MASK)); | |||||
bit -= tot; | |||||
} | |||||
return ((vm_paddr_t)NULL); | |||||
} | |||||
#define VM_PAGE_DUMP_FOREACH(pa) \ | |||||
for (vm_pindex_t __b = BIT_FFS(vm_page_dump_pages, vm_page_dump); \ | |||||
(pa) = vm_page_dump_index_to_pa(__b - 1), __b != 0; \ | |||||
__b = BIT_FFS_AT(vm_page_dump_pages, vm_page_dump, __b)) | |||||
bool vm_page_busy_acquire(vm_page_t m, int allocflags); | bool vm_page_busy_acquire(vm_page_t m, int allocflags); | ||||
void vm_page_busy_downgrade(vm_page_t m); | void vm_page_busy_downgrade(vm_page_t m); | ||||
int vm_page_busy_tryupgrade(vm_page_t m); | int vm_page_busy_tryupgrade(vm_page_t m); | ||||
void vm_page_busy_sleep(vm_page_t m, const char *msg, bool nonshared); | void vm_page_busy_sleep(vm_page_t m, const char *msg, bool nonshared); | ||||
void vm_page_busy_sleep_unlocked(vm_object_t obj, vm_page_t m, | void vm_page_busy_sleep_unlocked(vm_object_t obj, vm_page_t m, | ||||
vm_pindex_t pindex, const char *wmesg, bool nonshared); | vm_pindex_t pindex, const char *wmesg, bool nonshared); | ||||
void vm_page_free(vm_page_t m); | void vm_page_free(vm_page_t m); | ||||
▲ Show 20 Lines • Show All 405 Lines • Show Last 20 Lines |