Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 2 Jul 2009 04:56:11 +0000 (UTC)
From:      Kip Macy <kmacy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r195279 - user/kmacy/releng_7_2_fcs/sys/amd64/amd64
Message-ID:  <200907020456.n624uBHt033925@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kmacy
Date: Thu Jul  2 04:56:11 2009
New Revision: 195279
URL: http://svn.freebsd.org/changeset/base/195279

Log:
  avoid deadlock between pmap_collect and pageout

Modified:
  user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c

Modified: user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c	Thu Jul  2 00:50:19 2009	(r195278)
+++ user/kmacy/releng_7_2_fcs/sys/amd64/amd64/pmap.c	Thu Jul  2 04:56:11 2009	(r195279)
@@ -1953,7 +1953,17 @@ pmap_collect(pmap_t locked_pmap, struct 
 	vm_offset_t va;
 	vm_page_t m, free = NULL;
 
-	vm_page_lock_queues();
+	/*
+	 * This isn't really a solid fix as we need to assure the caller
+	 * that pmap state hasn't changed -  but the way pageout works
+	 * we typically need to call pmap functions with the page queue lock
+	 * held
+	 */
+	if (vm_page_trylock_queues() == 0) {
+		PMAP_UNLOCK(locked_pmap);
+		vm_page_lock_queues();
+		PMAP_LOCK(locked_pmap);
+	}
 	TAILQ_FOREACH(m, &vpq->pl, pageq) {
 		if (m->hold_count || m->busy || vm_page_trylock(m) == 0)
 			continue;



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