Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_kern.c
Show First 20 Lines • Show All 86 Lines • ▼ Show 20 Lines | |||||
#include <vm/vm_domainset.h> | #include <vm/vm_domainset.h> | ||||
#include <vm/vm_kern.h> | #include <vm/vm_kern.h> | ||||
#include <vm/pmap.h> | #include <vm/pmap.h> | ||||
#include <vm/vm_map.h> | #include <vm/vm_map.h> | ||||
#include <vm/vm_object.h> | #include <vm/vm_object.h> | ||||
#include <vm/vm_page.h> | #include <vm/vm_page.h> | ||||
#include <vm/vm_pageout.h> | #include <vm/vm_pageout.h> | ||||
#include <vm/vm_phys.h> | #include <vm/vm_phys.h> | ||||
#include <vm/vm_pagequeue.h> | |||||
#include <vm/vm_radix.h> | #include <vm/vm_radix.h> | ||||
#include <vm/vm_extern.h> | #include <vm/vm_extern.h> | ||||
#include <vm/uma.h> | #include <vm/uma.h> | ||||
vm_map_t kernel_map; | vm_map_t kernel_map; | ||||
vm_map_t exec_map; | vm_map_t exec_map; | ||||
vm_map_t pipe_map; | vm_map_t pipe_map; | ||||
▲ Show 20 Lines • Show All 88 Lines • ▼ Show 20 Lines | retry: | ||||
m = vm_page_alloc_contig_domain(object, atop(offset + i), | m = vm_page_alloc_contig_domain(object, atop(offset + i), | ||||
domain, pflags, 1, low, high, PAGE_SIZE, 0, memattr); | domain, pflags, 1, low, high, PAGE_SIZE, 0, memattr); | ||||
if (m == NULL) { | if (m == NULL) { | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { | if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { | ||||
if (!vm_page_reclaim_contig_domain(domain, | if (!vm_page_reclaim_contig_domain(domain, | ||||
pflags, 1, low, high, PAGE_SIZE, 0) && | pflags, 1, low, high, PAGE_SIZE, 0) && | ||||
(flags & M_WAITOK) != 0) | (flags & M_WAITOK) != 0) | ||||
VM_WAIT; | vm_wait_domain(domain); | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
tries++; | tries++; | ||||
goto retry; | goto retry; | ||||
} | } | ||||
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_phys_domidx(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_domidx(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; | m->valid = VM_PAGE_BITS_ALL; | ||||
pmap_enter(kernel_pmap, addr + i, m, VM_PROT_ALL, | pmap_enter(kernel_pmap, addr + i, m, VM_PROT_ALL, | ||||
VM_PROT_ALL | PMAP_ENTER_WIRED, 0); | VM_PROT_ALL | PMAP_ENTER_WIRED, 0); | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
return (addr); | return (addr); | ||||
▲ Show 20 Lines • Show All 56 Lines • ▼ Show 20 Lines | 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); | ||||
if (m == NULL) { | if (m == NULL) { | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { | if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) { | ||||
if (!vm_page_reclaim_contig_domain(domain, pflags, | if (!vm_page_reclaim_contig_domain(domain, pflags, | ||||
npages, low, high, alignment, boundary) && | npages, low, high, alignment, boundary) && | ||||
(flags & M_WAITOK) != 0) | (flags & M_WAITOK) != 0) | ||||
VM_WAIT; | vm_wait_domain(domain); | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
tries++; | tries++; | ||||
goto retry; | goto retry; | ||||
} | } | ||||
vmem_free(vmem, addr, size); | vmem_free(vmem, addr, size); | ||||
return (0); | return (0); | ||||
} | } | ||||
KASSERT(vm_phys_domidx(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_domidx(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; | m->valid = VM_PAGE_BITS_ALL; | ||||
pmap_enter(kernel_pmap, tmp, m, VM_PROT_ALL, | pmap_enter(kernel_pmap, tmp, m, VM_PROT_ALL, | ||||
VM_PROT_ALL | PMAP_ENTER_WIRED, 0); | VM_PROT_ALL | PMAP_ENTER_WIRED, 0); | ||||
▲ Show 20 Lines • Show All 145 Lines • ▼ Show 20 Lines | for (; i < size; i += PAGE_SIZE, mpred = m) { | ||||
*/ | */ | ||||
if (m == NULL) { | if (m == NULL) { | ||||
if ((flags & M_NOWAIT) == 0) | if ((flags & M_NOWAIT) == 0) | ||||
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_phys_domidx(m) == domain, | KASSERT(vm_phys_domain(m) == domain, | ||||
("kmem_back_domain: Domain mismatch %d != %d", | ("kmem_back_domain: Domain mismatch %d != %d", | ||||
vm_phys_domidx(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; | m->valid = VM_PAGE_BITS_ALL; | ||||
pmap_enter(kernel_pmap, addr + i, m, VM_PROT_ALL, | pmap_enter(kernel_pmap, addr + i, m, VM_PROT_ALL, | ||||
VM_PROT_ALL | PMAP_ENTER_WIRED, 0); | VM_PROT_ALL | PMAP_ENTER_WIRED, 0); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 43 Lines • ▼ Show 20 Lines | _kmem_unback(vm_object_t object, vm_offset_t addr, vm_size_t size) | ||||
if (size == 0) | if (size == 0) | ||||
return (0); | return (0); | ||||
pmap_remove(kernel_pmap, addr, addr + size); | pmap_remove(kernel_pmap, addr, addr + size); | ||||
offset = addr - VM_MIN_KERNEL_ADDRESS; | offset = addr - VM_MIN_KERNEL_ADDRESS; | ||||
end = offset + size; | end = offset + size; | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
m = vm_page_lookup(object, atop(offset)); | m = vm_page_lookup(object, atop(offset)); | ||||
domain = vm_phys_domidx(m); | domain = vm_phys_domain(m); | ||||
for (; offset < end; offset += PAGE_SIZE, m = next) { | for (; offset < end; offset += PAGE_SIZE, m = next) { | ||||
next = vm_page_next(m); | next = vm_page_next(m); | ||||
vm_page_unwire(m, PQ_NONE); | vm_page_unwire(m, PQ_NONE); | ||||
vm_page_free(m); | vm_page_free(m); | ||||
} | } | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
return (domain); | return (domain); | ||||
▲ Show 20 Lines • Show All 162 Lines • Show Last 20 Lines |