Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_kern.c
Show First 20 Lines • Show All 187 Lines • ▼ Show 20 Lines | kmem_alloc_attr_domain(int domain, vm_size_t size, int flags, vm_paddr_t low, | ||||
int pflags, tries; | int pflags, tries; | ||||
vm_prot_t prot; | vm_prot_t prot; | ||||
size = round_page(size); | size = round_page(size); | ||||
vmem = vm_dom[domain].vmd_kernel_arena; | vmem = vm_dom[domain].vmd_kernel_arena; | ||||
if (vmem_alloc(vmem, size, M_BESTFIT | flags, &addr)) | if (vmem_alloc(vmem, size, M_BESTFIT | flags, &addr)) | ||||
return (0); | return (0); | ||||
offset = addr - VM_MIN_KERNEL_ADDRESS; | offset = addr - VM_MIN_KERNEL_ADDRESS; | ||||
pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; | pflags = malloc2vm_flags(flags) | VM_ALLOC_WIRED; | ||||
pflags &= ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL); | pflags &= ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL); | ||||
pflags |= VM_ALLOC_NOWAIT; | pflags |= VM_ALLOC_NOWAIT; | ||||
prot = (flags & M_EXEC) != 0 ? VM_PROT_ALL : VM_PROT_RW; | prot = (flags & M_EXEC) != 0 ? VM_PROT_ALL : VM_PROT_RW; | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
for (i = 0; i < size; i += PAGE_SIZE) { | for (i = 0; i < size; i += PAGE_SIZE) { | ||||
tries = 0; | tries = 0; | ||||
retry: | retry: | ||||
m = vm_page_alloc_contig_domain(object, atop(offset + i), | m = vm_page_alloc_contig_domain(object, atop(offset + i), | ||||
Show All 13 Lines | if (m == NULL) { | ||||
vmem_free(vmem, addr, size); | vmem_free(vmem, addr, size); | ||||
return (0); | return (0); | ||||
} | } | ||||
KASSERT(vm_phys_domain(m) == domain, | KASSERT(vm_phys_domain(m) == domain, | ||||
("kmem_alloc_attr_domain: Domain mismatch %d != %d", | ("kmem_alloc_attr_domain: Domain mismatch %d != %d", | ||||
vm_phys_domain(m), domain)); | vm_phys_domain(m), domain)); | ||||
if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0) | if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0) | ||||
pmap_zero_page(m); | pmap_zero_page(m); | ||||
m->valid = VM_PAGE_BITS_ALL; | vm_page_valid(m); | ||||
vm_page_xunbusy(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); | ||||
} | } | ||||
vm_offset_t | vm_offset_t | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | kmem_alloc_contig_domain(int domain, vm_size_t size, int flags, vm_paddr_t low, | ||||
u_long npages; | u_long npages; | ||||
int pflags, tries; | int pflags, tries; | ||||
size = round_page(size); | size = round_page(size); | ||||
vmem = vm_dom[domain].vmd_kernel_arena; | vmem = vm_dom[domain].vmd_kernel_arena; | ||||
if (vmem_alloc(vmem, size, flags | M_BESTFIT, &addr)) | if (vmem_alloc(vmem, size, flags | M_BESTFIT, &addr)) | ||||
return (0); | return (0); | ||||
offset = addr - VM_MIN_KERNEL_ADDRESS; | offset = addr - VM_MIN_KERNEL_ADDRESS; | ||||
pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; | pflags = malloc2vm_flags(flags) | VM_ALLOC_WIRED; | ||||
pflags &= ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL); | pflags &= ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL); | ||||
pflags |= VM_ALLOC_NOWAIT; | pflags |= VM_ALLOC_NOWAIT; | ||||
npages = atop(size); | npages = atop(size); | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
tries = 0; | tries = 0; | ||||
retry: | retry: | ||||
m = vm_page_alloc_contig_domain(object, atop(offset), domain, pflags, | m = vm_page_alloc_contig_domain(object, atop(offset), domain, pflags, | ||||
npages, low, high, alignment, boundary, memattr); | npages, low, high, alignment, boundary, memattr); | ||||
Show All 14 Lines | retry: | ||||
KASSERT(vm_phys_domain(m) == domain, | KASSERT(vm_phys_domain(m) == domain, | ||||
("kmem_alloc_contig_domain: Domain mismatch %d != %d", | ("kmem_alloc_contig_domain: Domain mismatch %d != %d", | ||||
vm_phys_domain(m), domain)); | vm_phys_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) | if ((flags & M_ZERO) && (m->flags & PG_ZERO) == 0) | ||||
pmap_zero_page(m); | pmap_zero_page(m); | ||||
m->valid = VM_PAGE_BITS_ALL; | vm_page_valid(m); | ||||
vm_page_xunbusy(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 133 Lines • ▼ Show 20 Lines | kmem_back_domain(int domain, vm_object_t object, vm_offset_t addr, | ||||
vm_page_t m, mpred; | vm_page_t m, mpred; | ||||
vm_prot_t prot; | vm_prot_t prot; | ||||
int pflags; | int pflags; | ||||
KASSERT(object == kernel_object, | KASSERT(object == kernel_object, | ||||
("kmem_back_domain: only supports kernel object.")); | ("kmem_back_domain: only supports kernel object.")); | ||||
offset = addr - VM_MIN_KERNEL_ADDRESS; | offset = addr - VM_MIN_KERNEL_ADDRESS; | ||||
pflags = malloc2vm_flags(flags) | VM_ALLOC_NOBUSY | VM_ALLOC_WIRED; | pflags = malloc2vm_flags(flags) | VM_ALLOC_WIRED; | ||||
pflags &= ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL); | pflags &= ~(VM_ALLOC_NOWAIT | VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL); | ||||
if (flags & M_WAITOK) | if (flags & M_WAITOK) | ||||
pflags |= VM_ALLOC_WAITFAIL; | pflags |= VM_ALLOC_WAITFAIL; | ||||
prot = (flags & M_EXEC) != 0 ? VM_PROT_ALL : VM_PROT_RW; | prot = (flags & M_EXEC) != 0 ? VM_PROT_ALL : VM_PROT_RW; | ||||
i = 0; | i = 0; | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
retry: | retry: | ||||
Show All 16 Lines | for (; i < size; i += PAGE_SIZE, mpred = m) { | ||||
} | } | ||||
KASSERT(vm_phys_domain(m) == domain, | KASSERT(vm_phys_domain(m) == domain, | ||||
("kmem_back_domain: Domain mismatch %d != %d", | ("kmem_back_domain: Domain mismatch %d != %d", | ||||
vm_phys_domain(m), domain)); | vm_phys_domain(m), domain)); | ||||
if (flags & M_ZERO && (m->flags & PG_ZERO) == 0) | if (flags & M_ZERO && (m->flags & PG_ZERO) == 0) | ||||
pmap_zero_page(m); | 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)); | ||||
m->valid = VM_PAGE_BITS_ALL; | vm_page_valid(m); | ||||
vm_page_xunbusy(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 VM_NRESERVLEVEL > 0 | #if VM_NRESERVLEVEL > 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; | ||||
#endif | #endif | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
▲ Show 20 Lines • Show All 384 Lines • Show Last 20 Lines |