Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_phys.c
Show First 20 Lines • Show All 723 Lines • ▼ Show 20 Lines | while (oind > order) { | ||||
KASSERT(m_buddy->order == VM_NFREEORDER, | KASSERT(m_buddy->order == VM_NFREEORDER, | ||||
("vm_phys_split_pages: page %p has unexpected order %d", | ("vm_phys_split_pages: page %p has unexpected order %d", | ||||
m_buddy, m_buddy->order)); | m_buddy, m_buddy->order)); | ||||
vm_freelist_add(fl, m_buddy, oind, 0); | vm_freelist_add(fl, m_buddy, oind, 0); | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* Initialize a physical page and add it to the free lists. | * Initialize a physical page in preparation for adding it to the free | ||||
* lists. | |||||
*/ | */ | ||||
void | void | ||||
vm_phys_add_page(vm_paddr_t pa) | vm_phys_init_page(vm_paddr_t pa) | ||||
{ | { | ||||
vm_page_t m; | vm_page_t m; | ||||
struct vm_domain *vmd; | |||||
vm_cnt.v_page_count++; | |||||
m = vm_phys_paddr_to_vm_page(pa); | m = vm_phys_paddr_to_vm_page(pa); | ||||
m->object = NULL; | |||||
m->wire_count = 0; | |||||
m->busy_lock = VPB_UNBUSIED; | m->busy_lock = VPB_UNBUSIED; | ||||
m->hold_count = 0; | |||||
m->flags = m->aflags = m->oflags = 0; | |||||
m->phys_addr = pa; | m->phys_addr = pa; | ||||
m->queue = PQ_NONE; | m->queue = PQ_NONE; | ||||
m->psind = 0; | |||||
m->segind = vm_phys_paddr_to_segind(pa); | m->segind = vm_phys_paddr_to_segind(pa); | ||||
vmd = vm_phys_domain(m); | m->order = VM_NFREEORDER; | ||||
vmd->vmd_page_count++; | |||||
vmd->vmd_segs |= 1UL << m->segind; | |||||
KASSERT(m->order == VM_NFREEORDER, | |||||
("vm_phys_add_page: page %p has unexpected order %d", | |||||
m, m->order)); | |||||
m->pool = VM_FREEPOOL_DEFAULT; | m->pool = VM_FREEPOOL_DEFAULT; | ||||
m->valid = m->dirty = 0; | |||||
pmap_page_init(m); | pmap_page_init(m); | ||||
mtx_lock(&vm_page_queue_free_mtx); | |||||
vm_phys_freecnt_adj(m, 1); | |||||
vm_phys_free_pages(m, 0); | |||||
mtx_unlock(&vm_page_queue_free_mtx); | |||||
} | } | ||||
/* | /* | ||||
* Allocate a contiguous, power of two-sized set of physical pages | * Allocate a contiguous, power of two-sized set of physical pages | ||||
* from the free lists. | * from the free lists. | ||||
* | * | ||||
* The free page queues must be locked. | * The free page queues must be locked. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 139 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
static inline void | static inline void | ||||
vm_phys_fictitious_init_range(vm_page_t range, vm_paddr_t start, | vm_phys_fictitious_init_range(vm_page_t range, vm_paddr_t start, | ||||
long page_count, vm_memattr_t memattr) | long page_count, vm_memattr_t memattr) | ||||
{ | { | ||||
long i; | long i; | ||||
bzero(range, page_count * sizeof(*range)); | |||||
for (i = 0; i < page_count; i++) { | for (i = 0; i < page_count; i++) { | ||||
vm_page_initfake(&range[i], start + PAGE_SIZE * i, memattr); | vm_page_initfake(&range[i], start + PAGE_SIZE * i, memattr); | ||||
range[i].oflags &= ~VPO_UNMANAGED; | range[i].oflags &= ~VPO_UNMANAGED; | ||||
range[i].busy_lock = VPB_UNBUSIED; | range[i].busy_lock = VPB_UNBUSIED; | ||||
} | } | ||||
} | } | ||||
int | int | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | if (pi >= first_page && (pi - first_page) < vm_page_array_size) { | ||||
* Trying to register a fictitious range that expands before | * Trying to register a fictitious range that expands before | ||||
* and after vm_page_array. | * and after vm_page_array. | ||||
*/ | */ | ||||
return (EINVAL); | return (EINVAL); | ||||
} else { | } else { | ||||
alloc: | alloc: | ||||
#endif | #endif | ||||
fp = malloc(page_count * sizeof(struct vm_page), M_FICT_PAGES, | fp = malloc(page_count * sizeof(struct vm_page), M_FICT_PAGES, | ||||
M_WAITOK | M_ZERO); | M_WAITOK); | ||||
#ifdef VM_PHYSSEG_DENSE | #ifdef VM_PHYSSEG_DENSE | ||||
} | } | ||||
#endif | #endif | ||||
vm_phys_fictitious_init_range(fp, start, page_count, memattr); | vm_phys_fictitious_init_range(fp, start, page_count, memattr); | ||||
seg = malloc(sizeof(*seg), M_FICT_PAGES, M_WAITOK | M_ZERO); | seg = malloc(sizeof(*seg), M_FICT_PAGES, M_WAITOK | M_ZERO); | ||||
seg->start = start; | seg->start = start; | ||||
seg->end = end; | seg->end = end; | ||||
▲ Show 20 Lines • Show All 486 Lines • Show Last 20 Lines |