svn commit: r340064 - in head/sys: kern vm

Mark Johnston markj at FreeBSD.org
Fri Nov 2 16:26:46 UTC 2018


Author: markj
Date: Fri Nov  2 16:26:44 2018
New Revision: 340064
URL: https://svnweb.freebsd.org/changeset/base/340064

Log:
  Initialize the eflags field of vm_map headers.
  
  Initializing the eflags field of the map->header entry to a value with a
  unique new bit set makes a few comparisons to &map->header unnecessary.
  
  Submitted by:	Doug Moore <dougm at rice.edu>
  Reviewed by:	alc, kib
  Tested by:	pho
  MFC after:	2 weeks
  Differential Revision:	https://reviews.freebsd.org/D14005

Modified:
  head/sys/kern/sys_process.c
  head/sys/vm/vm_map.c
  head/sys/vm/vm_map.h

Modified: head/sys/kern/sys_process.c
==============================================================================
--- head/sys/kern/sys_process.c	Fri Nov  2 16:21:44 2018	(r340063)
+++ head/sys/kern/sys_process.c	Fri Nov  2 16:26:44 2018	(r340064)
@@ -387,8 +387,9 @@ ptrace_vm_entry(struct thread *td, struct proc *p, str
 			error = EINVAL;
 			break;
 		}
-		while (entry != &map->header &&
-		    (entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0) {
+		KASSERT((map->header.eflags & MAP_ENTRY_IS_SUB_MAP) == 0,
+		    ("Submap in map header"));
+		while ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0) {
 			entry = entry->next;
 			index++;
 		}

Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c	Fri Nov  2 16:21:44 2018	(r340063)
+++ head/sys/vm/vm_map.c	Fri Nov  2 16:26:44 2018	(r340064)
@@ -796,6 +796,7 @@ _vm_map_init(vm_map_t map, pmap_t pmap, vm_offset_t mi
 {
 
 	map->header.next = map->header.prev = &map->header;
+	map->header.eflags = MAP_ENTRY_HEADER;
 	map->needs_wakeup = FALSE;
 	map->system_map = 0;
 	map->pmap = pmap;
@@ -1277,8 +1278,8 @@ charged:
 		if (object->ref_count > 1 || object->shadow_count != 0)
 			vm_object_clear_flag(object, OBJ_ONEMAPPING);
 		VM_OBJECT_WUNLOCK(object);
-	} else if (prev_entry != &map->header &&
-	    (prev_entry->eflags & ~MAP_ENTRY_USER_WIRED) == protoeflags &&
+	} else if ((prev_entry->eflags & ~MAP_ENTRY_USER_WIRED) ==
+	    protoeflags &&
 	    (cow & (MAP_STACK_GROWS_DOWN | MAP_STACK_GROWS_UP)) == 0 &&
 	    prev_entry->end == start && (prev_entry->cred == cred ||
 	    (prev_entry->object.vm_object != NULL &&
@@ -1708,8 +1709,7 @@ vm_map_simplify_entry(vm_map_t map, vm_map_entry_t ent
 		return;
 
 	prev = entry->prev;
-	if (prev != &map->header &&
-	    vm_map_mergeable_neighbors(prev, entry)) {
+	if (vm_map_mergeable_neighbors(prev, entry)) {
 		vm_map_entry_unlink(map, prev);
 		entry->start = prev->start;
 		entry->offset = prev->offset;
@@ -1719,8 +1719,7 @@ vm_map_simplify_entry(vm_map_t map, vm_map_entry_t ent
 	}
 
 	next = entry->next;
-	if (next != &map->header &&
-	    vm_map_mergeable_neighbors(entry, next)) {
+	if (vm_map_mergeable_neighbors(entry, next)) {
 		vm_map_entry_unlink(map, next);
 		entry->end = next->end;
 		vm_map_entry_resize_free(map, entry);

Modified: head/sys/vm/vm_map.h
==============================================================================
--- head/sys/vm/vm_map.h	Fri Nov  2 16:21:44 2018	(r340063)
+++ head/sys/vm/vm_map.h	Fri Nov  2 16:26:44 2018	(r340064)
@@ -146,6 +146,7 @@ struct vm_map_entry {
 #define	MAP_ENTRY_GUARD			0x10000
 #define	MAP_ENTRY_STACK_GAP_DN		0x20000
 #define	MAP_ENTRY_STACK_GAP_UP		0x40000
+#define	MAP_ENTRY_HEADER		0x80000
 
 #ifdef	_KERNEL
 static __inline u_char
@@ -175,24 +176,22 @@ vm_map_entry_system_wired_count(vm_map_entry_t entry)
  *	list.  Both structures are ordered based upon the start and
  *	end addresses contained within each map entry.
  *
- *	Counterintuitively, the map's min offset value is stored in
- *	map->header.end, and its max offset value is stored in
- *	map->header.start.
- *
- *	The list header has max start value and min end value to act
- *	as sentinels for sequential search of the doubly-linked list.
  *	Sleator and Tarjan's top-down splay algorithm is employed to
  *	control height imbalance in the binary search tree.
  *
+ *	The map's min offset value is stored in map->header.end, and
+ *	its max offset value is stored in map->header.start.  These
+ *	values act as sentinels for any forward or backward address
+ *	scan of the list.  The map header has a special value for the
+ *	eflags field, MAP_ENTRY_HEADER, that is set initially, is
+ *	never changed, and prevents an eflags match of the header
+ *	with any other map entry.
+ *
  *	List of locks
  *	(c)	const until freed
  */
 struct vm_map {
 	struct vm_map_entry header;	/* List of entries */
-/*
-	map min_offset	header.end	(c)
-	map max_offset	header.start	(c)
-*/
 	struct sx lock;			/* Lock for map data */
 	struct mtx system_mtx;
 	int nentries;			/* Number of entries */


More information about the svn-src-all mailing list