Index: vm_map.c =================================================================== --- vm_map.c (revision 212479) +++ vm_map.c (working copy) @@ -128,7 +128,7 @@ static void vm_map_zfini(void *mem, int size); static void _vm_map_init(vm_map_t map, pmap_t pmap, vm_offset_t min, vm_offset_t max); -static void vm_map_entry_dispose(vm_map_t map, vm_map_entry_t entry); +void vm_map_entry_dispose(vm_map_t map, vm_map_entry_t entry); #ifdef INVARIANTS static void vm_map_zdtor(void *mem, int size, void *arg); static void vmspace_zdtor(void *mem, int size, void *arg); @@ -716,7 +716,7 @@ * * Inverse of vm_map_entry_create. */ -static void +void vm_map_entry_dispose(vm_map_t map, vm_map_entry_t entry) { uma_zfree(map->system_map ? kmapentzone : mapentzone, entry); Index: vm_mmap.c =================================================================== --- vm_mmap.c (revision 212479) +++ vm_mmap.c (working copy) @@ -123,6 +123,8 @@ static int vm_mmap_shm(struct thread *, vm_size_t, vm_prot_t, vm_prot_t *, int *, struct shmfd *, vm_ooffset_t, vm_object_t *); +void vm_map_entry_dispose(vm_map_t map, vm_map_entry_t entry); + /* * MPSAFE */ @@ -550,6 +552,8 @@ #ifdef HWPMC_HOOKS struct pmckern_map_out pkm; vm_map_entry_t entry; + vm_map_entry_t free_entry; + vm_object_t object; #endif vm_offset_t addr; vm_size_t size, pageoff; @@ -596,11 +600,25 @@ vm_map_delete(map, addr, addr + size); #ifdef HWPMC_HOOKS + free_entry = map->deferred_freelist; + map->deferred_freelist = NULL; /* downgrade the lock to prevent a LOR with the pmc-sx lock */ vm_map_lock_downgrade(map); if (pkm.pm_address != (uintptr_t) NULL) PMC_CALL_HOOK(td, PMC_FN_MUNMAP, (void *) &pkm); vm_map_unlock_read(map); + + while (free_entry != NULL) { + entry = free_entry; + free_entry = free_entry->next; + + if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0) { + object = entry->object.vm_object; + vm_object_deallocate(object); + } + + vm_map_entry_dispose(map, entry); + } #else vm_map_unlock(map); #endif