Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 16 Jan 2011 18:01:40 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r217478 - head/sys/vm
Message-ID:  <201101161801.p0GI1eId072064@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Sun Jan 16 18:01:39 2011
New Revision: 217478
URL: http://svn.freebsd.org/changeset/base/217478

Log:
  Shift responsibility for synchronizing access to the page's act_count
  field to the object's lock.
  
  Reviewed by:	kib@

Modified:
  head/sys/vm/vm_page.c
  head/sys/vm/vm_page.h
  head/sys/vm/vm_pageout.c

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c	Sun Jan 16 17:33:34 2011	(r217477)
+++ head/sys/vm/vm_page.c	Sun Jan 16 18:01:39 2011	(r217478)
@@ -1338,8 +1338,8 @@ vm_page_alloc(vm_object_t object, vm_pin
 		atomic_add_int(&cnt.v_wire_count, 1);
 		m->wire_count = 1;
 	}
-	m->act_count = 0;
 	mtx_unlock(&vm_page_queue_free_mtx);
+	m->act_count = 0;
 
 	if (object != NULL) {
 		/* Ignore device objects; the pager sets "memattr" for them. */
@@ -1603,6 +1603,7 @@ vm_page_activate(vm_page_t m)
 	int queue;
 
 	vm_page_lock_assert(m, MA_OWNED);
+	VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
 	if ((queue = m->queue) != PQ_ACTIVE) {
 		if (m->wire_count == 0 && (m->flags & PG_UNMANAGED) == 0) {
 			if (m->act_count < ACT_INIT)

Modified: head/sys/vm/vm_page.h
==============================================================================
--- head/sys/vm/vm_page.h	Sun Jan 16 17:33:34 2011	(r217477)
+++ head/sys/vm/vm_page.h	Sun Jan 16 18:01:39 2011	(r217478)
@@ -116,7 +116,7 @@ struct vm_page {
 	u_int wire_count;		/* wired down maps refs (P) */
 	short hold_count;		/* page hold count (P) */
 	u_short oflags;			/* page flags (O) */
-	u_char	act_count;		/* page usage count (P) */
+	u_char	act_count;		/* page usage count (O) */
 	u_char	busy;			/* page busy count (O) */
 	/* NOTE that these must support one bit per DEV_BSIZE in a page!!! */
 	/* so, on normal X86 kernels, they must be at least 8 bits wide */

Modified: head/sys/vm/vm_pageout.c
==============================================================================
--- head/sys/vm/vm_pageout.c	Sun Jan 16 17:33:34 2011	(r217477)
+++ head/sys/vm/vm_pageout.c	Sun Jan 16 18:01:39 2011	(r217478)
@@ -855,9 +855,9 @@ rescan0:
 		} else if (((m->flags & PG_REFERENCED) == 0) &&
 			(actcount = pmap_ts_referenced(m))) {
 			vm_page_activate(m);
-			VM_OBJECT_UNLOCK(object);
-			m->act_count += (actcount + ACT_ADVANCE);
 			vm_page_unlock(m);
+			m->act_count += actcount + ACT_ADVANCE;
+			VM_OBJECT_UNLOCK(object);
 			continue;
 		}
 
@@ -871,9 +871,9 @@ rescan0:
 			vm_page_flag_clear(m, PG_REFERENCED);
 			actcount = pmap_ts_referenced(m);
 			vm_page_activate(m);
-			VM_OBJECT_UNLOCK(object);
-			m->act_count += (actcount + ACT_ADVANCE + 1);
 			vm_page_unlock(m);
+			m->act_count += actcount + ACT_ADVANCE + 1;
+			VM_OBJECT_UNLOCK(object);
 			continue;
 		}
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101161801.p0GI1eId072064>