aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/link_elf.c
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2005-08-28 00:19:54 +0000
committerAlan Cox <alc@FreeBSD.org>2005-08-28 00:19:54 +0000
commit41673965526cc4aadfe00c3eb75a9bd56b7e5c95 (patch)
treea2d802eac71c0b8373ed5fdf2d4476158374d62d /sys/kern/link_elf.c
parent3ae0e7d8ae7f4874cf7f50d5e7bdc079fecd4e0b (diff)
downloadsrc-41673965526cc4aadfe00c3eb75a9bd56b7e5c95.tar.gz
src-41673965526cc4aadfe00c3eb75a9bd56b7e5c95.zip
Revert the previous change for two reasons: (1) If vm_map_find() succeeds
but vm_map_wire() fails, then a vm object, vm map entries, and kernel_map free space is leaked and (2) unwiring is handled automatically by vm_map_remove(). Suggested by: tegge
Notes
Notes: svn path=/head/; revision=149539
Diffstat (limited to 'sys/kern/link_elf.c')
-rw-r--r--sys/kern/link_elf.c27
1 files changed, 10 insertions, 17 deletions
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c
index 62843c758c92..5679cbf2f3fa 100644
--- a/sys/kern/link_elf.c
+++ b/sys/kern/link_elf.c
@@ -710,15 +710,6 @@ link_elf_load_file(linker_class_t cls, const char* filename,
(vm_offset_t *) &ef->address,
mapsize, 1,
VM_PROT_ALL, VM_PROT_ALL, 0);
-#ifdef SPARSE_MAPPING
- /*
- * Wire down the pages
- */
- if (error == 0)
- error = vm_map_wire(kernel_map, (vm_offset_t) ef->address,
- (vm_offset_t) ef->address + mapsize,
- VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES);
-#endif
if (error) {
vm_object_deallocate(ef->object);
ef->object = 0;
@@ -747,6 +738,16 @@ link_elf_load_file(linker_class_t cls, const char* filename,
}
bzero(segbase + segs[i]->p_filesz,
segs[i]->p_memsz - segs[i]->p_filesz);
+
+#ifdef SPARSE_MAPPING
+ /*
+ * Wire down the pages
+ */
+ vm_map_wire(kernel_map,
+ (vm_offset_t) segbase,
+ (vm_offset_t) segbase + segs[i]->p_memsz,
+ VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES);
+#endif
}
#ifdef GPROF
@@ -880,14 +881,6 @@ link_elf_unload_file(linker_file_t file)
#ifdef SPARSE_MAPPING
if (ef->object) {
- /*
- * Unwire the pages
- */
- vm_map_unwire(kernel_map,
- (vm_offset_t) ef->address,
- (vm_offset_t) ef->address
- + (ef->object->size << PAGE_SHIFT),
- VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES);
vm_map_remove(kernel_map, (vm_offset_t) ef->address,
(vm_offset_t) ef->address
+ (ef->object->size << PAGE_SHIFT));