Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 12 Sep 2010 14:57:05 -0400
From:      Ryan Stone <rysto32@gmail.com>
To:        Michael Butler <imb@protected-networks.net>
Cc:        Kostik Belousov <kostikbel@gmail.com>, current@freebsd.org
Subject:   Re: r212281 breaks KDE
Message-ID:  <AANLkTi=uLB3W4vC87mWPjdEz6evOY-XD3AhGZ3yX4kdJ@mail.gmail.com>
In-Reply-To: <4C8D1ADA.1090004@protected-networks.net>
References:  <4C8CE6F1.3030400@protected-networks.net> <20100912161901.GD2465@deviant.kiev.zoral.com.ua> <4C8D1ADA.1090004@protected-networks.net>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
Can you try the attached(hackish) patch?

[-- Attachment #2 --]
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

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTi=uLB3W4vC87mWPjdEz6evOY-XD3AhGZ3yX4kdJ>