diff options
author | Konstantin Belousov <kib@FreeBSD.org> | 2017-03-06 14:09:54 +0000 |
---|---|---|
committer | Konstantin Belousov <kib@FreeBSD.org> | 2017-03-06 14:09:54 +0000 |
commit | aaadc41f6c0cd75b55730bf55c4c94496307d4f1 (patch) | |
tree | 04cd58904f054e99639489eca688a573d17f98da | |
parent | 19bf8ef5625c79d19fb7b4687440dbfe8ae67564 (diff) | |
download | src-aaadc41f6c0cd75b55730bf55c4c94496307d4f1.tar.gz src-aaadc41f6c0cd75b55730bf55c4c94496307d4f1.zip |
Instead of direct use of vm_map_insert(), call vm_map_fixed(MAP_CHECK_EXCL).
This KPI explicitely indicates the intent of creating the mapping at
the fixed address, and incorporates the map locking into the callee.
Suggested and reviewed by: alc
Sponsored by: The FreeBSD Foundation
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=314773
-rw-r--r-- | sys/kern/imgact_elf.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/sys/kern/imgact_elf.c b/sys/kern/imgact_elf.c index 1cc071b5d4e7..b07988fe4451 100644 --- a/sys/kern/imgact_elf.c +++ b/sys/kern/imgact_elf.c @@ -397,10 +397,8 @@ __elfN(map_partial)(vm_map_t map, vm_object_t object, vm_ooffset_t offset, /* * Create the page if it doesn't exist yet. Ignore errors. */ - vm_map_lock(map); - vm_map_insert(map, NULL, 0, trunc_page(start), round_page(end), - VM_PROT_ALL, VM_PROT_ALL, 0); - vm_map_unlock(map); + vm_map_fixed(map, NULL, 0, trunc_page(start), round_page(end) - + trunc_page(start), VM_PROT_ALL, VM_PROT_ALL, MAP_CHECK_EXCL); /* * Find the page from the underlying object. @@ -451,10 +449,8 @@ __elfN(map_insert)(struct image_params *imgp, vm_map_t map, vm_object_t object, * The mapping is not page aligned. This means we have * to copy the data. Sigh. */ - vm_map_lock(map); - rv = vm_map_insert(map, NULL, 0, start, end, - prot | VM_PROT_WRITE, VM_PROT_ALL, 0); - vm_map_unlock(map); + rv = vm_map_fixed(map, NULL, 0, start, end - start, + prot | VM_PROT_WRITE, VM_PROT_ALL, MAP_CHECK_EXCL); if (rv != KERN_SUCCESS) return (rv); if (object == NULL) @@ -477,10 +473,9 @@ __elfN(map_insert)(struct image_params *imgp, vm_map_t map, vm_object_t object, rv = KERN_SUCCESS; } else { vm_object_reference(object); - vm_map_lock(map); - rv = vm_map_insert(map, object, offset, start, end, - prot, VM_PROT_ALL, cow); - vm_map_unlock(map); + rv = vm_map_fixed(map, object, offset, start, + end - start, prot, VM_PROT_ALL, + cow | MAP_CHECK_EXCL); if (rv != KERN_SUCCESS) { locked = VOP_ISLOCKED(imgp->vp); VOP_UNLOCK(imgp->vp, 0); |