Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_page.c
Show First 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | |||||
#include <vm/vm_radix.h> | #include <vm/vm_radix.h> | ||||
#include <vm/vm_reserv.h> | #include <vm/vm_reserv.h> | ||||
#include <vm/vm_extern.h> | #include <vm/vm_extern.h> | ||||
#include <vm/uma.h> | #include <vm/uma.h> | ||||
#include <vm/uma_int.h> | #include <vm/uma_int.h> | ||||
#include <machine/md_var.h> | #include <machine/md_var.h> | ||||
extern int uma_startup_count(int); | |||||
extern void uma_startup(void *, int); | |||||
extern int vmem_startup_count(void); | |||||
struct vm_domain vm_dom[MAXMEMDOM]; | struct vm_domain vm_dom[MAXMEMDOM]; | ||||
DPCPU_DEFINE_STATIC(struct vm_batchqueue, pqbatch[MAXMEMDOM][PQ_COUNT]); | DPCPU_DEFINE_STATIC(struct vm_batchqueue, pqbatch[MAXMEMDOM][PQ_COUNT]); | ||||
struct mtx_padalign __exclusive_cache_line pa_lock[PA_LOCK_COUNT]; | struct mtx_padalign __exclusive_cache_line pa_lock[PA_LOCK_COUNT]; | ||||
struct mtx_padalign __exclusive_cache_line vm_domainset_lock; | struct mtx_padalign __exclusive_cache_line vm_domainset_lock; | ||||
/* The following fields are protected by the domainset lock. */ | /* The following fields are protected by the domainset lock. */ | ||||
Show All 36 Lines | |||||
* or for paging into sparsely invalid regions. | * or for paging into sparsely invalid regions. | ||||
*/ | */ | ||||
vm_page_t bogus_page; | vm_page_t bogus_page; | ||||
vm_page_t vm_page_array; | vm_page_t vm_page_array; | ||||
long vm_page_array_size; | long vm_page_array_size; | ||||
long first_page; | long first_page; | ||||
static int boot_pages; | |||||
SYSCTL_INT(_vm, OID_AUTO, boot_pages, CTLFLAG_RDTUN | CTLFLAG_NOFETCH, | |||||
&boot_pages, 0, | |||||
"number of pages allocated for bootstrapping the VM system"); | |||||
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 405 Lines • ▼ Show 20 Lines | #endif | ||||
* Initialize the page and queue locks. | * Initialize the page and queue locks. | ||||
*/ | */ | ||||
mtx_init(&vm_domainset_lock, "vm domainset lock", NULL, MTX_DEF); | mtx_init(&vm_domainset_lock, "vm domainset lock", NULL, MTX_DEF); | ||||
for (i = 0; i < PA_LOCK_COUNT; i++) | for (i = 0; i < PA_LOCK_COUNT; i++) | ||||
mtx_init(&pa_lock[i], "vm page", NULL, MTX_DEF); | mtx_init(&pa_lock[i], "vm page", NULL, MTX_DEF); | ||||
for (i = 0; i < vm_ndomains; i++) | for (i = 0; i < vm_ndomains; i++) | ||||
vm_page_domain_init(i); | vm_page_domain_init(i); | ||||
/* | new_end = end; | ||||
* Allocate memory for use when boot strapping the kernel memory | |||||
* allocator. Tell UMA how many zones we are going to create | |||||
* before going fully functional. UMA will add its zones. | |||||
* | |||||
* VM startup zones: vmem, vmem_btag, VM OBJECT, RADIX NODE, MAP, | |||||
* KMAP ENTRY, MAP ENTRY, VMSPACE. | |||||
*/ | |||||
boot_pages = uma_startup_count(8); | |||||
#ifndef UMA_MD_SMALL_ALLOC | |||||
/* vmem_startup() calls uma_prealloc(). */ | |||||
boot_pages += vmem_startup_count(); | |||||
/* vm_map_startup() calls uma_prealloc(). */ | |||||
boot_pages += howmany(MAX_KMAP, | |||||
slab_ipers(sizeof(struct vm_map), UMA_ALIGN_PTR)); | |||||
/* | |||||
* Before we are fully boot strapped we need to account for the | |||||
* following allocations: | |||||
* | |||||
* "KMAP ENTRY" from kmem_init() | |||||
* "vmem btag" from vmem_startup() | |||||
* "vmem" from vmem_create() | |||||
* "KMAP" from vm_map_startup() | |||||
* | |||||
* Each needs at least one page per-domain. | |||||
*/ | |||||
boot_pages += 4 * vm_ndomains; | |||||
#endif | |||||
/* | |||||
* CTFLAG_RDTUN doesn't work during the early boot process, so we must | |||||
* manually fetch the value. | |||||
*/ | |||||
TUNABLE_INT_FETCH("vm.boot_pages", &boot_pages); | |||||
new_end = end - (boot_pages * UMA_SLAB_SIZE); | |||||
new_end = trunc_page(new_end); | |||||
mapped = pmap_map(&vaddr, new_end, end, | |||||
VM_PROT_READ | VM_PROT_WRITE); | |||||
bzero((void *)mapped, end - new_end); | |||||
uma_startup((void *)mapped, boot_pages); | |||||
#ifdef WITNESS | #ifdef WITNESS | ||||
witness_size = round_page(witness_startup_count()); | witness_size = round_page(witness_startup_count()); | ||||
new_end -= witness_size; | new_end -= witness_size; | ||||
mapped = pmap_map(&vaddr, new_end, new_end + witness_size, | mapped = pmap_map(&vaddr, new_end, new_end + witness_size, | ||||
VM_PROT_READ | VM_PROT_WRITE); | VM_PROT_READ | VM_PROT_WRITE); | ||||
bzero((void *)mapped, witness_size); | bzero((void *)mapped, witness_size); | ||||
witness_startup((void *)mapped); | witness_startup((void *)mapped); | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 4,596 Lines • Show Last 20 Lines |