Can you try the attached(hackish) patch?
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
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "[email protected]"

Reply via email to