Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_page.c
Show First 20 Lines • Show All 162 Lines • ▼ Show 20 Lines | |||||
long __read_mostly vm_page_array_size; | long __read_mostly vm_page_array_size; | ||||
long __read_mostly first_page; | long __read_mostly first_page; | ||||
static int boot_pages; | static int boot_pages; | ||||
SYSCTL_INT(_vm, OID_AUTO, boot_pages, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, | SYSCTL_INT(_vm, OID_AUTO, boot_pages, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, | ||||
&boot_pages, 0, | &boot_pages, 0, | ||||
"number of pages allocated for bootstrapping the VM system"); | "number of pages allocated for bootstrapping the VM system"); | ||||
static int pa_tryrelock_restart; | |||||
SYSCTL_INT(_vm, OID_AUTO, tryrelock_restart, CTLFLAG_RD, | |||||
&pa_tryrelock_restart, 0, "Number of tryrelock restarts"); | |||||
static TAILQ_HEAD(, vm_page) blacklist_head; | static TAILQ_HEAD(, vm_page) blacklist_head; | ||||
static int sysctl_vm_page_blacklist(SYSCTL_HANDLER_ARGS); | static int sysctl_vm_page_blacklist(SYSCTL_HANDLER_ARGS); | ||||
SYSCTL_PROC(_vm, OID_AUTO, page_blacklist, CTLTYPE_STRING | CTLFLAG_RD | | SYSCTL_PROC(_vm, OID_AUTO, page_blacklist, CTLTYPE_STRING | CTLFLAG_RD | | ||||
CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_page_blacklist, "A", "Blacklist pages"); | CTLFLAG_MPSAFE, NULL, 0, sysctl_vm_page_blacklist, "A", "Blacklist pages"); | ||||
static uma_zone_t fakepg_zone; | static uma_zone_t fakepg_zone; | ||||
static void vm_page_alloc_check(vm_page_t m); | static void vm_page_alloc_check(vm_page_t m); | ||||
▲ Show 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | |||||
SYSINIT(vm_page2, SI_SUB_VM_CONF, SI_ORDER_ANY, vm_page_init_cache_zones, NULL); | SYSINIT(vm_page2, SI_SUB_VM_CONF, SI_ORDER_ANY, vm_page_init_cache_zones, NULL); | ||||
/* Make sure that u_long is at least 64 bits when PAGE_SIZE is 32K. */ | /* Make sure that u_long is at least 64 bits when PAGE_SIZE is 32K. */ | ||||
#if PAGE_SIZE == 32768 | #if PAGE_SIZE == 32768 | ||||
#ifdef CTASSERT | #ifdef CTASSERT | ||||
CTASSERT(sizeof(u_long) >= 8); | CTASSERT(sizeof(u_long) >= 8); | ||||
#endif | #endif | ||||
#endif | #endif | ||||
/* | |||||
* Try to acquire a physical address lock while a pmap is locked. If we | |||||
* fail to trylock we unlock and lock the pmap directly and cache the | |||||
* locked pa in *locked. The caller should then restart their loop in case | |||||
* the virtual to physical mapping has changed. | |||||
*/ | |||||
int | |||||
vm_page_pa_tryrelock(pmap_t pmap, vm_paddr_t pa, vm_paddr_t *locked) | |||||
{ | |||||
vm_paddr_t lockpa; | |||||
lockpa = *locked; | |||||
*locked = pa; | |||||
if (lockpa) { | |||||
PA_LOCK_ASSERT(lockpa, MA_OWNED); | |||||
if (PA_LOCKPTR(pa) == PA_LOCKPTR(lockpa)) | |||||
return (0); | |||||
PA_UNLOCK(lockpa); | |||||
} | |||||
if (PA_TRYLOCK(pa)) | |||||
return (0); | |||||
PMAP_UNLOCK(pmap); | |||||
atomic_add_int(&pa_tryrelock_restart, 1); | |||||
PA_LOCK(pa); | |||||
PMAP_LOCK(pmap); | |||||
return (EAGAIN); | |||||
} | |||||
/* | /* | ||||
* vm_set_page_size: | * vm_set_page_size: | ||||
* | * | ||||
* Sets the page size, perhaps based upon the memory | * Sets the page size, perhaps based upon the memory | ||||
* size. Must be called before any use of page-size | * size. Must be called before any use of page-size | ||||
* dependent functions. | * dependent functions. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 4,645 Lines • Show Last 20 Lines |