svn commit: r355217 - head/sys/vm

Jeff Roberson jeff at FreeBSD.org
Fri Nov 29 19:57:50 UTC 2019


Author: jeff
Date: Fri Nov 29 19:57:49 2019
New Revision: 355217
URL: https://svnweb.freebsd.org/changeset/base/355217

Log:
  Restore swap space accounting for non-anonymous swap objects.  This was
  broken in r355082.  Reduce some locking in nearby related object type
  checks.
  
  Reviewed by:	kib, markj
  Differential Revision:	https://reviews.freebsd.org/D22565

Modified:
  head/sys/vm/vm_map.c

Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c	Fri Nov 29 19:49:20 2019	(r355216)
+++ head/sys/vm/vm_map.c	Fri Nov 29 19:57:49 2019	(r355217)
@@ -2445,9 +2445,7 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_p
 
 	if ((prot & (VM_PROT_READ | VM_PROT_EXECUTE)) == 0 || object == NULL)
 		return;
-	VM_OBJECT_RLOCK(object);
 	if (object->type == OBJT_DEVICE || object->type == OBJT_SG) {
-		VM_OBJECT_RUNLOCK(object);
 		VM_OBJECT_WLOCK(object);
 		if (object->type == OBJT_DEVICE || object->type == OBJT_SG) {
 			pmap_object_init_pt(map->pmap, addr, object, pindex,
@@ -2456,7 +2454,8 @@ vm_map_pmap_enter(vm_map_t map, vm_offset_t addr, vm_p
 			return;
 		}
 		VM_OBJECT_LOCK_DOWNGRADE(object);
-	}
+	} else
+		VM_OBJECT_RLOCK(object);
 
 	psize = atop(size);
 	if (psize + pindex > object->size) {
@@ -2623,6 +2622,8 @@ again:
 			continue;
 		}
 
+		if (obj->type != OBJT_DEFAULT && obj->type != OBJT_SWAP)
+			continue;
 		VM_OBJECT_WLOCK(obj);
 		if (obj->type != OBJT_DEFAULT && obj->type != OBJT_SWAP) {
 			VM_OBJECT_WUNLOCK(obj);
@@ -3809,14 +3810,14 @@ vm_map_check_protection(vm_map_t map, vm_offset_t star
 
 /*
  *
- *	vm_map_copy_anon_object:
+ *	vm_map_copy_swap_object:
  *
- *	Copies an anonymous object from an existing map entry to a
+ *	Copies a swap-backed object from an existing map entry to a
  *	new one.  Carries forward the swap charge.  May change the
  *	src object on return.
  */
 static void
-vm_map_copy_anon_object(vm_map_entry_t src_entry, vm_map_entry_t dst_entry,
+vm_map_copy_swap_object(vm_map_entry_t src_entry, vm_map_entry_t dst_entry,
     vm_offset_t size, vm_ooffset_t *fork_charge)
 {
 	vm_object_t src_object;
@@ -3898,8 +3899,9 @@ vm_map_copy_entry(
 		 */
 		size = src_entry->end - src_entry->start;
 		if ((src_object = src_entry->object.vm_object) != NULL) {
-			if ((src_object->flags & OBJ_ANON) != 0) {
-				vm_map_copy_anon_object(src_entry, dst_entry,
+			if (src_object->type == OBJT_DEFAULT ||
+			    src_object->type == OBJT_SWAP) {
+				vm_map_copy_swap_object(src_entry, dst_entry,
 				    size, fork_charge);
 				/* May have split/collapsed, reload obj. */
 				src_object = src_entry->object.vm_object;


More information about the svn-src-all mailing list