summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2020-05-01 02:43:20 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-05-01 02:43:20 +0200
commitf802b371c8f5e0ca89bbea8f197b5bec5763f78f (patch)
treeec5692ecc2f5a3099193081e2aea0b2d7d31a642
parentded813a44263103a28e1788489ec0fef7e8d1c7e (diff)
kmem_alloc_wired: factorize with kmem_valloc
* vm/vm_kern.c (kmem_alloc_wired): Factorize with kmem_valloc.
-rw-r--r--vm/vm_kern.c52
1 files changed, 3 insertions, 49 deletions
diff --git a/vm/vm_kern.c b/vm/vm_kern.c
index a7ec0c06..2e333ee1 100644
--- a/vm/vm_kern.c
+++ b/vm/vm_kern.c
@@ -501,7 +501,7 @@ retry:
vm_map_unlock(map);
/*
- * Return the memory, not zeroed.
+ * Return the memory, not mapped.
*/
*addrp = addr;
return KERN_SUCCESS;
@@ -523,62 +523,16 @@ kmem_alloc_wired(
vm_offset_t *addrp,
vm_size_t size)
{
- vm_map_entry_t entry;
vm_offset_t offset;
vm_offset_t addr;
- unsigned int attempts;
kern_return_t kr;
- /*
- * Use the kernel object for wired-down kernel pages.
- * Assume that no region of the kernel object is
- * referenced more than once. We want vm_map_find_entry
- * to extend an existing entry if possible.
- */
-
- size = round_page(size);
- attempts = 0;
-
-retry:
- vm_map_lock(map);
- kr = vm_map_find_entry(map, &addr, size, (vm_offset_t) 0,
- kernel_object, &entry);
- if (kr != KERN_SUCCESS) {
- vm_map_unlock(map);
-
- if (attempts == 0) {
- attempts++;
- slab_collect();
- goto retry;
- }
-
- printf_once("no more room for kmem_alloc_wired in %p (%s)\n",
- map, map->name);
+ kr = kmem_valloc(map, &addr, size);
+ if (kr != KERN_SUCCESS)
return kr;
- }
-
- /*
- * Since we didn't know where the new region would
- * start, we couldn't supply the correct offset into
- * the kernel object. We only initialize the entry
- * if we aren't extending an existing entry.
- */
offset = addr - VM_MIN_KERNEL_ADDRESS;
- if (entry->object.vm_object == VM_OBJECT_NULL) {
- vm_object_reference(kernel_object);
-
- entry->object.vm_object = kernel_object;
- entry->offset = offset;
- }
-
- /*
- * Since we have not given out this address yet,
- * it is safe to unlock the map.
- */
- vm_map_unlock(map);
-
/*
* Allocate wired-down memory in the kernel_object,
* for this entry, and enter it in the kernel pmap.