Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_page.c
Show First 20 Lines • Show All 320 Lines • ▼ Show 20 Lines | |||||
bool | bool | ||||
vm_page_blacklist_add(vm_paddr_t pa, bool verbose) | vm_page_blacklist_add(vm_paddr_t pa, bool verbose) | ||||
{ | { | ||||
struct vm_domain *vmd; | struct vm_domain *vmd; | ||||
vm_page_t m; | vm_page_t m; | ||||
int ret; | int ret; | ||||
m = vm_phys_paddr_to_vm_page(pa); | m = vm_phys_paddr_to_vm_page(pa, NULL); | ||||
if (m == NULL) | if (m == NULL) | ||||
return (true); /* page does not exist, no failure */ | return (true); /* page does not exist, no failure */ | ||||
vmd = vm_pagequeue_domain(m); | vmd = vm_pagequeue_domain(m); | ||||
vm_domain_free_lock(vmd); | vm_domain_free_lock(vmd); | ||||
ret = vm_phys_unfree_page(m); | ret = vm_phys_unfree_page(m); | ||||
vm_domain_free_unlock(vmd); | vm_domain_free_unlock(vmd); | ||||
if (ret != 0) { | if (ret != 0) { | ||||
▲ Show 20 Lines • Show All 216 Lines • ▼ Show 20 Lines | vm_page_startup(vm_offset_t vaddr) | ||||
vm_paddr_t page_range __unused; | vm_paddr_t page_range __unused; | ||||
vm_paddr_t last_pa, pa; | vm_paddr_t last_pa, pa; | ||||
u_long pagecount; | u_long pagecount; | ||||
int biggestone, i, segind; | int biggestone, i, segind; | ||||
#ifdef WITNESS | #ifdef WITNESS | ||||
vm_offset_t mapped; | vm_offset_t mapped; | ||||
int witness_size; | int witness_size; | ||||
#endif | #endif | ||||
#if defined(__i386__) && defined(VM_PHYSSEG_DENSE) | #if (defined(__i386__) || defined(__amd64__)) && defined(VM_PHYSSEG_DENSE) | ||||
long ii; | long ii; | ||||
#endif | #endif | ||||
vaddr = round_page(vaddr); | vaddr = round_page(vaddr); | ||||
vm_phys_early_startup(); | vm_phys_early_startup(); | ||||
biggestone = vm_phys_avail_largest(); | biggestone = vm_phys_avail_largest(); | ||||
end = phys_avail[biggestone+1]; | end = phys_avail[biggestone+1]; | ||||
▲ Show 20 Lines • Show All 171 Lines • ▼ Show 20 Lines | #endif | ||||
* Initialize the physical memory allocator. | * Initialize the physical memory allocator. | ||||
*/ | */ | ||||
vm_phys_init(); | vm_phys_init(); | ||||
/* | /* | ||||
* Initialize the page structures and add every available page to the | * Initialize the page structures and add every available page to the | ||||
* physical memory allocator's free lists. | * physical memory allocator's free lists. | ||||
*/ | */ | ||||
#if defined(__i386__) && defined(VM_PHYSSEG_DENSE) | #if (defined(__i386__) || defined(__amd64__)) && defined(VM_PHYSSEG_DENSE) | ||||
/* | |||||
* i386 needs this for copyout(9) calling vm_fault_quick_hold_pages(). | |||||
* amd64 requires that for DMAR busdma and bhyve IOMMU. | |||||
*/ | |||||
for (ii = 0; ii < vm_page_array_size; ii++) { | for (ii = 0; ii < vm_page_array_size; ii++) { | ||||
m = &vm_page_array[ii]; | m = &vm_page_array[ii]; | ||||
vm_page_init_page(m, (first_page + ii) << PAGE_SHIFT, 0); | vm_page_init_page(m, (first_page + ii) << PAGE_SHIFT, 0); | ||||
m->flags = PG_FICTITIOUS; | m->flags = PG_FICTITIOUS; | ||||
} | } | ||||
#endif | #endif | ||||
vm_cnt.v_page_count = 0; | vm_cnt.v_page_count = 0; | ||||
for (segind = 0; segind < vm_phys_nsegs; segind++) { | for (segind = 0; segind < vm_phys_nsegs; segind++) { | ||||
▲ Show 20 Lines • Show All 450 Lines • ▼ Show 20 Lines | for (; count != 0; count--) { | ||||
vm_page_unwire(*ma, PQ_ACTIVE); | vm_page_unwire(*ma, PQ_ACTIVE); | ||||
ma++; | ma++; | ||||
} | } | ||||
} | } | ||||
vm_page_t | vm_page_t | ||||
PHYS_TO_VM_PAGE(vm_paddr_t pa) | PHYS_TO_VM_PAGE(vm_paddr_t pa) | ||||
{ | { | ||||
return (vm_page_phys_to_vm_page(pa, NULL)); | |||||
} | |||||
vm_page_t | |||||
vm_page_phys_to_vm_page(vm_paddr_t pa, u_long *cnt_after) | |||||
{ | |||||
vm_page_t m; | vm_page_t m; | ||||
#ifdef VM_PHYSSEG_SPARSE | #ifdef VM_PHYSSEG_SPARSE | ||||
m = vm_phys_paddr_to_vm_page(pa); | m = vm_phys_paddr_to_vm_page(pa, cnt_after); | ||||
if (m == NULL) | if (m == NULL) | ||||
m = vm_phys_fictitious_to_vm_page(pa); | m = vm_phys_fictitious_to_vm_page(pa, cnt_after); | ||||
return (m); | return (m); | ||||
#elif defined(VM_PHYSSEG_DENSE) | #elif defined(VM_PHYSSEG_DENSE) | ||||
long pi; | long pi; | ||||
pi = atop(pa); | pi = atop(pa); | ||||
if (pi >= first_page && (pi - first_page) < vm_page_array_size) { | if (pi >= first_page && (pi - first_page) < vm_page_array_size) { | ||||
m = &vm_page_array[pi - first_page]; | m = &vm_page_array[pi - first_page]; | ||||
if (cnt_after != NULL) | |||||
*cnt_after = vm_page_array_size - pi - first_page; | |||||
return (m); | return (m); | ||||
} | } | ||||
return (vm_phys_fictitious_to_vm_page(pa)); | return (vm_phys_fictitious_to_vm_page(pa, cnt_after)); | ||||
#else | #else | ||||
#error "Either VM_PHYSSEG_DENSE or VM_PHYSSEG_SPARSE must be defined." | #error "Either VM_PHYSSEG_DENSE or VM_PHYSSEG_SPARSE must be defined." | ||||
#endif | #endif | ||||
} | } | ||||
/* | /* | ||||
* vm_page_getfake: | * vm_page_getfake: | ||||
* | * | ||||
▲ Show 20 Lines • Show All 4,249 Lines • Show Last 20 Lines |