diff options
author | alc <alc@FreeBSD.org> | 2005-08-28 00:19:54 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2005-08-28 00:19:54 +0000 |
commit | 597f2facce5b3d33143ba51c46fbca07dc9dbbed (patch) | |
tree | a2d802eac71c0b8373ed5fdf2d4476158374d62d /sys/kern/link_elf.c | |
parent | fc694070c0e025c6bf5cb8ab5448868cbbfbef01 (diff) | |
download | FreeBSD-src-597f2facce5b3d33143ba51c46fbca07dc9dbbed.zip FreeBSD-src-597f2facce5b3d33143ba51c46fbca07dc9dbbed.tar.gz |
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
Diffstat (limited to 'sys/kern/link_elf.c')
-rw-r--r-- | sys/kern/link_elf.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/sys/kern/link_elf.c b/sys/kern/link_elf.c index 62843c7..5679cbf 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)); |