Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_kern.c
Show First 20 Lines • Show All 238 Lines • ▼ Show 20 Lines | if (m == NULL) { | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
kmem_unback(object, addr, i); | kmem_unback(object, addr, i); | ||||
vmem_free(vmem, addr, size); | vmem_free(vmem, addr, size); | ||||
return (0); | return (0); | ||||
} | } | ||||
KASSERT(vm_page_domain(m) == domain, | KASSERT(vm_page_domain(m) == domain, | ||||
("kmem_alloc_attr_domain: Domain mismatch %d != %d", | ("kmem_alloc_attr_domain: Domain mismatch %d != %d", | ||||
vm_page_domain(m), domain)); | vm_page_domain(m), domain)); | ||||
if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0) | |||||
pmap_zero_page(m); | |||||
vm_page_valid(m); | vm_page_valid(m); | ||||
pmap_enter(kernel_pmap, addr + i, m, prot, | pmap_enter(kernel_pmap, addr + i, m, prot, | ||||
prot | PMAP_ENTER_WIRED, 0); | prot | PMAP_ENTER_WIRED, 0); | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
return (addr); | return (addr); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | if (m == NULL) { | ||||
return (0); | return (0); | ||||
} | } | ||||
KASSERT(vm_page_domain(m) == domain, | KASSERT(vm_page_domain(m) == domain, | ||||
("kmem_alloc_contig_domain: Domain mismatch %d != %d", | ("kmem_alloc_contig_domain: Domain mismatch %d != %d", | ||||
vm_page_domain(m), domain)); | vm_page_domain(m), domain)); | ||||
end_m = m + npages; | end_m = m + npages; | ||||
tmp = addr; | tmp = addr; | ||||
for (; m < end_m; m++) { | for (; m < end_m; m++) { | ||||
if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0) | |||||
pmap_zero_page(m); | |||||
vm_page_valid(m); | vm_page_valid(m); | ||||
pmap_enter(kernel_pmap, tmp, m, VM_PROT_RW, | pmap_enter(kernel_pmap, tmp, m, VM_PROT_RW, | ||||
VM_PROT_RW | PMAP_ENTER_WIRED, 0); | VM_PROT_RW | PMAP_ENTER_WIRED, 0); | ||||
tmp += PAGE_SIZE; | tmp += PAGE_SIZE; | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
return (addr); | return (addr); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 155 Lines • ▼ Show 20 Lines | if (m == NULL) { | ||||
goto retry; | goto retry; | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
kmem_unback(object, addr, i); | kmem_unback(object, addr, i); | ||||
return (KERN_NO_SPACE); | return (KERN_NO_SPACE); | ||||
} | } | ||||
KASSERT(vm_page_domain(m) == domain, | KASSERT(vm_page_domain(m) == domain, | ||||
("kmem_back_domain: Domain mismatch %d != %d", | ("kmem_back_domain: Domain mismatch %d != %d", | ||||
vm_page_domain(m), domain)); | vm_page_domain(m), domain)); | ||||
if (flags & M_ZERO && (m->flags & PG_ZERO) == 0) | |||||
pmap_zero_page(m); | |||||
KASSERT((m->oflags & VPO_UNMANAGED) != 0, | KASSERT((m->oflags & VPO_UNMANAGED) != 0, | ||||
("kmem_malloc: page %p is managed", m)); | ("kmem_malloc: page %p is managed", m)); | ||||
vm_page_valid(m); | vm_page_valid(m); | ||||
pmap_enter(kernel_pmap, addr + i, m, prot, | pmap_enter(kernel_pmap, addr + i, m, prot, | ||||
prot | PMAP_ENTER_WIRED, 0); | prot | PMAP_ENTER_WIRED, 0); | ||||
if (__predict_false((prot & VM_PROT_EXECUTE) != 0)) | if (__predict_false((prot & VM_PROT_EXECUTE) != 0)) | ||||
m->oflags |= VPO_KMEM_EXEC; | m->oflags |= VPO_KMEM_EXEC; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 177 Lines • ▼ Show 20 Lines | kmem_init_zero_region(void) | ||||
/* | /* | ||||
* Map a single physical page of zeros to a larger virtual range. | * Map a single physical page of zeros to a larger virtual range. | ||||
* This requires less looping in places that want large amounts of | * This requires less looping in places that want large amounts of | ||||
* zeros, while not using much more physical resources. | * zeros, while not using much more physical resources. | ||||
*/ | */ | ||||
addr = kva_alloc(ZERO_REGION_SIZE); | addr = kva_alloc(ZERO_REGION_SIZE); | ||||
m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | | m = vm_page_alloc(NULL, 0, VM_ALLOC_NORMAL | | ||||
VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO); | VM_ALLOC_NOOBJ | VM_ALLOC_WIRED | VM_ALLOC_ZERO); | ||||
if ((m->flags & PG_ZERO) == 0) | |||||
pmap_zero_page(m); | |||||
for (i = 0; i < ZERO_REGION_SIZE; i += PAGE_SIZE) | for (i = 0; i < ZERO_REGION_SIZE; i += PAGE_SIZE) | ||||
pmap_qenter(addr + i, &m, 1); | pmap_qenter(addr + i, &m, 1); | ||||
pmap_protect(kernel_pmap, addr, addr + ZERO_REGION_SIZE, VM_PROT_READ); | pmap_protect(kernel_pmap, addr, addr + ZERO_REGION_SIZE, VM_PROT_READ); | ||||
zero_region = (const void *)addr; | zero_region = (const void *)addr; | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 200 Lines • Show Last 20 Lines |