Changeset View
Changeset View
Standalone View
Standalone View
sys/vm/vm_kern.c
Show First 20 Lines • Show All 169 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* Allocates a region from the kernel address map and physical pages | * Allocates a region from the kernel address map and physical pages | ||||
* within the specified address range to the kernel object. Creates a | * within the specified address range to the kernel object. Creates a | ||||
* wired mapping from this region to these pages, and returns the | * wired mapping from this region to these pages, and returns the | ||||
* region's starting virtual address. The allocated pages are not | * region's starting virtual address. The allocated pages are not | ||||
* necessarily physically contiguous. If M_ZERO is specified through the | * necessarily physically contiguous. If M_ZERO is specified through the | ||||
* given flags, then the pages are zeroed before they are mapped. | * given flags, then the pages are zeroed before they are mapped. | ||||
*/ | */ | ||||
vm_offset_t | static vm_offset_t | ||||
kmem_alloc_attr_domain(int domain, vm_size_t size, int flags, vm_paddr_t low, | kmem_alloc_attr_domain(int domain, vm_size_t size, int flags, vm_paddr_t low, | ||||
vm_paddr_t high, vm_memattr_t memattr) | vm_paddr_t high, vm_memattr_t memattr) | ||||
{ | { | ||||
vmem_t *vmem; | vmem_t *vmem; | ||||
vm_object_t object = kernel_object; | vm_object_t object = kernel_object; | ||||
vm_offset_t addr, i, offset; | vm_offset_t addr, i, offset; | ||||
vm_page_t m; | vm_page_t m; | ||||
int pflags, tries; | int pflags, tries; | ||||
Show All 39 Lines | retry: | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
return (addr); | return (addr); | ||||
} | } | ||||
vm_offset_t | vm_offset_t | ||||
kmem_alloc_attr(vm_size_t size, int flags, vm_paddr_t low, vm_paddr_t high, | kmem_alloc_attr(vm_size_t size, int flags, vm_paddr_t low, vm_paddr_t high, | ||||
vm_memattr_t memattr) | vm_memattr_t memattr) | ||||
{ | { | ||||
return (kmem_alloc_attr_domainset(DOMAINSET_RR(), size, flags, low, | |||||
high, memattr)); | |||||
} | |||||
vm_offset_t | |||||
kmem_alloc_attr_domainset(struct domainset *ds, vm_size_t size, int flags, | |||||
vm_paddr_t low, vm_paddr_t high, vm_memattr_t memattr) | |||||
{ | |||||
struct vm_domainset_iter di; | struct vm_domainset_iter di; | ||||
vm_offset_t addr; | vm_offset_t addr; | ||||
int domain; | int domain; | ||||
vm_domainset_iter_policy_init(&di, DOMAINSET_RR(), &domain, &flags); | vm_domainset_iter_policy_init(&di, ds, &domain, &flags); | ||||
do { | do { | ||||
addr = kmem_alloc_attr_domain(domain, size, flags, low, high, | addr = kmem_alloc_attr_domain(domain, size, flags, low, high, | ||||
memattr); | memattr); | ||||
if (addr != 0) | if (addr != 0) | ||||
break; | break; | ||||
} while (vm_domainset_iter_policy(&di, &domain) == 0); | } while (vm_domainset_iter_policy(&di, &domain) == 0); | ||||
return (addr); | return (addr); | ||||
} | } | ||||
/* | /* | ||||
* Allocates a region from the kernel address map and physically | * Allocates a region from the kernel address map and physically | ||||
* contiguous pages within the specified address range to the kernel | * contiguous pages within the specified address range to the kernel | ||||
* object. Creates a wired mapping from this region to these pages, and | * object. Creates a wired mapping from this region to these pages, and | ||||
* returns the region's starting virtual address. If M_ZERO is specified | * returns the region's starting virtual address. If M_ZERO is specified | ||||
* through the given flags, then the pages are zeroed before they are | * through the given flags, then the pages are zeroed before they are | ||||
* mapped. | * mapped. | ||||
*/ | */ | ||||
vm_offset_t | static vm_offset_t | ||||
kmem_alloc_contig_domain(int domain, vm_size_t size, int flags, vm_paddr_t low, | kmem_alloc_contig_domain(int domain, vm_size_t size, int flags, vm_paddr_t low, | ||||
vm_paddr_t high, u_long alignment, vm_paddr_t boundary, | vm_paddr_t high, u_long alignment, vm_paddr_t boundary, | ||||
vm_memattr_t memattr) | vm_memattr_t memattr) | ||||
{ | { | ||||
vmem_t *vmem; | vmem_t *vmem; | ||||
vm_object_t object = kernel_object; | vm_object_t object = kernel_object; | ||||
vm_offset_t addr, offset, tmp; | vm_offset_t addr, offset, tmp; | ||||
vm_page_t end_m, m; | vm_page_t end_m, m; | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | retry: | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
return (addr); | return (addr); | ||||
} | } | ||||
vm_offset_t | vm_offset_t | ||||
kmem_alloc_contig(vm_size_t size, int flags, vm_paddr_t low, vm_paddr_t high, | kmem_alloc_contig(vm_size_t size, int flags, vm_paddr_t low, vm_paddr_t high, | ||||
u_long alignment, vm_paddr_t boundary, vm_memattr_t memattr) | u_long alignment, vm_paddr_t boundary, vm_memattr_t memattr) | ||||
{ | { | ||||
return (kmem_alloc_contig_domainset(DOMAINSET_RR(), size, flags, low, | |||||
high, alignment, boundary, memattr)); | |||||
} | |||||
vm_offset_t | |||||
kmem_alloc_contig_domainset(struct domainset *ds, vm_size_t size, int flags, | |||||
vm_paddr_t low, vm_paddr_t high, u_long alignment, vm_paddr_t boundary, | |||||
vm_memattr_t memattr) | |||||
{ | |||||
struct vm_domainset_iter di; | struct vm_domainset_iter di; | ||||
vm_offset_t addr; | vm_offset_t addr; | ||||
int domain; | int domain; | ||||
vm_domainset_iter_policy_init(&di, DOMAINSET_RR(), &domain, &flags); | vm_domainset_iter_policy_init(&di, ds, &domain, &flags); | ||||
do { | do { | ||||
addr = kmem_alloc_contig_domain(domain, size, flags, low, high, | addr = kmem_alloc_contig_domain(domain, size, flags, low, high, | ||||
alignment, boundary, memattr); | alignment, boundary, memattr); | ||||
if (addr != 0) | if (addr != 0) | ||||
break; | break; | ||||
} while (vm_domainset_iter_policy(&di, &domain) == 0); | } while (vm_domainset_iter_policy(&di, &domain) == 0); | ||||
return (addr); | return (addr); | ||||
Show All 32 Lines | kmem_suballoc(vm_map_t parent, vm_offset_t *min, vm_offset_t *max, | ||||
if (result == NULL) | if (result == NULL) | ||||
panic("kmem_suballoc: cannot create submap"); | panic("kmem_suballoc: cannot create submap"); | ||||
if (vm_map_submap(parent, *min, *max, result) != KERN_SUCCESS) | if (vm_map_submap(parent, *min, *max, result) != KERN_SUCCESS) | ||||
panic("kmem_suballoc: unable to change range to submap"); | panic("kmem_suballoc: unable to change range to submap"); | ||||
return (result); | return (result); | ||||
} | } | ||||
/* | /* | ||||
* kmem_malloc: | * kmem_malloc_domain: | ||||
* | * | ||||
* Allocate wired-down pages in the kernel's address space. | * Allocate wired-down pages in the kernel's address space. | ||||
*/ | */ | ||||
vm_offset_t | static vm_offset_t | ||||
kmem_malloc_domain(int domain, vm_size_t size, int flags) | kmem_malloc_domain(int domain, vm_size_t size, int flags) | ||||
{ | { | ||||
vmem_t *arena; | vmem_t *arena; | ||||
vm_offset_t addr; | vm_offset_t addr; | ||||
int rv; | int rv; | ||||
#if VM_NRESERVLEVEL > 0 | #if VM_NRESERVLEVEL > 0 | ||||
if (__predict_true((flags & M_EXEC) == 0)) | if (__predict_true((flags & M_EXEC) == 0)) | ||||
Show All 13 Lines | if (rv != KERN_SUCCESS) { | ||||
return (0); | return (0); | ||||
} | } | ||||
return (addr); | return (addr); | ||||
} | } | ||||
vm_offset_t | vm_offset_t | ||||
kmem_malloc(vm_size_t size, int flags) | kmem_malloc(vm_size_t size, int flags) | ||||
{ | { | ||||
return (kmem_malloc_domainset(DOMAINSET_RR(), size, flags)); | |||||
} | |||||
vm_offset_t | |||||
kmem_malloc_domainset(struct domainset *ds, vm_size_t size, int flags) | |||||
{ | |||||
struct vm_domainset_iter di; | struct vm_domainset_iter di; | ||||
vm_offset_t addr; | vm_offset_t addr; | ||||
int domain; | int domain; | ||||
vm_domainset_iter_policy_init(&di, DOMAINSET_RR(), &domain, &flags); | vm_domainset_iter_policy_init(&di, ds, &domain, &flags); | ||||
do { | do { | ||||
addr = kmem_malloc_domain(domain, size, flags); | addr = kmem_malloc_domain(domain, size, flags); | ||||
if (addr != 0) | if (addr != 0) | ||||
break; | break; | ||||
} while (vm_domainset_iter_policy(&di, &domain) == 0); | } while (vm_domainset_iter_policy(&di, &domain) == 0); | ||||
return (addr); | return (addr); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 419 Lines • Show Last 20 Lines |