Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 24 Dec 2017 20:17:36 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r327169 - in projects/clang600-import/sys: cddl/contrib/opensolaris/uts/common/sys vm x86/isa
Message-ID:  <201712242017.vBOKHakQ064389@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Sun Dec 24 20:17:36 2017
New Revision: 327169
URL: https://svnweb.freebsd.org/changeset/base/327169

Log:
  Merge ^/head r327165 through r327168.

Modified:
  projects/clang600-import/sys/cddl/contrib/opensolaris/uts/common/sys/sysmacros.h
  projects/clang600-import/sys/vm/vm_page.c
  projects/clang600-import/sys/vm/vm_pageout.c
  projects/clang600-import/sys/vm/vm_pageout.h
  projects/clang600-import/sys/x86/isa/orm.c
Directory Properties:
  projects/clang600-import/   (props changed)
  projects/clang600-import/sys/cddl/contrib/opensolaris/   (props changed)

Modified: projects/clang600-import/sys/cddl/contrib/opensolaris/uts/common/sys/sysmacros.h
==============================================================================
--- projects/clang600-import/sys/cddl/contrib/opensolaris/uts/common/sys/sysmacros.h	Sun Dec 24 19:45:16 2017	(r327168)
+++ projects/clang600-import/sys/cddl/contrib/opensolaris/uts/common/sys/sysmacros.h	Sun Dec 24 20:17:36 2017	(r327169)
@@ -388,7 +388,7 @@ highbit(ulong_t i)
 #if defined(__FreeBSD__) && defined(_KERNEL) && defined(HAVE_INLINE_FLSL)
 	return (flsl(i));
 #else
-	register int h = 1;
+	int h = 1;
 
 	if (i == 0)
 		return (0);

Modified: projects/clang600-import/sys/vm/vm_page.c
==============================================================================
--- projects/clang600-import/sys/vm/vm_page.c	Sun Dec 24 19:45:16 2017	(r327168)
+++ projects/clang600-import/sys/vm/vm_page.c	Sun Dec 24 20:17:36 2017	(r327169)
@@ -2661,15 +2661,9 @@ _vm_wait(void)
 		msleep(&vm_pageout_pages_needed, &vm_page_queue_free_mtx,
 		    PDROP | PSWP, "VMWait", 0);
 	} else {
-		if (__predict_false(pageproc == NULL))
+		if (pageproc == NULL)
 			panic("vm_wait in early boot");
-		if (!vm_pageout_wanted) {
-			vm_pageout_wanted = true;
-			wakeup(&vm_pageout_wanted);
-		}
-		vm_pages_needed = true;
-		msleep(&vm_cnt.v_free_count, &vm_page_queue_free_mtx, PDROP | PVM,
-		    "vmwait", 0);
+		pagedaemon_wait(PVM, "vmwait");
 	}
 }
 
@@ -2699,7 +2693,6 @@ vm_page_alloc_fail(vm_object_t object, int req)
 
 	atomic_add_int(&vm_pageout_deficit,
 	    max((u_int)req >> VM_ALLOC_COUNT_SHIFT, 1));
-	pagedaemon_wakeup();
 	if (req & (VM_ALLOC_WAITOK | VM_ALLOC_WAITFAIL)) {
 		if (object != NULL) 
 			VM_OBJECT_WUNLOCK(object);
@@ -2708,8 +2701,10 @@ vm_page_alloc_fail(vm_object_t object, int req)
 			VM_OBJECT_WLOCK(object);
 		if (req & VM_ALLOC_WAITOK)
 			return (EAGAIN);
-	} else
+	} else {
 		mtx_unlock(&vm_page_queue_free_mtx);
+		pagedaemon_wakeup();
+	}
 	return (0);
 }
 
@@ -2728,13 +2723,7 @@ vm_waitpfault(void)
 {
 
 	mtx_lock(&vm_page_queue_free_mtx);
-	if (!vm_pageout_wanted) {
-		vm_pageout_wanted = true;
-		wakeup(&vm_pageout_wanted);
-	}
-	vm_pages_needed = true;
-	msleep(&vm_cnt.v_free_count, &vm_page_queue_free_mtx, PDROP | PUSER,
-	    "pfault", 0);
+	pagedaemon_wait(PUSER, "pfault");
 }
 
 struct vm_pagequeue *

Modified: projects/clang600-import/sys/vm/vm_pageout.c
==============================================================================
--- projects/clang600-import/sys/vm/vm_pageout.c	Sun Dec 24 19:45:16 2017	(r327168)
+++ projects/clang600-import/sys/vm/vm_pageout.c	Sun Dec 24 20:17:36 2017	(r327169)
@@ -1829,10 +1829,14 @@ vm_pageout_worker(void *arg)
 			pass++;
 		} else {
 			/*
-			 * Yes.  Sleep until pages need to be reclaimed or
+			 * Yes.  If threads are still sleeping in VM_WAIT
+			 * then we immediately start a new scan.  Otherwise,
+			 * sleep until the next wakeup or until pages need to
 			 * have their reference stats updated.
 			 */
-			if (mtx_sleep(&vm_pageout_wanted,
+			if (vm_pages_needed) {
+				mtx_unlock(&vm_page_queue_free_mtx);
+			} else if (mtx_sleep(&vm_pageout_wanted,
 			    &vm_page_queue_free_mtx, PDROP | PVM, "psleep",
 			    hz) == 0) {
 				VM_CNT_INC(v_pdwakeups);
@@ -1940,17 +1944,42 @@ vm_pageout(void)
 }
 
 /*
- * Unless the free page queue lock is held by the caller, this function
- * should be regarded as advisory.  Specifically, the caller should
- * not msleep() on &vm_cnt.v_free_count following this function unless
- * the free page queue lock is held until the msleep() is performed.
+ * Perform an advisory wakeup of the page daemon.
  */
 void
 pagedaemon_wakeup(void)
 {
 
+	mtx_assert(&vm_page_queue_free_mtx, MA_NOTOWNED);
+
 	if (!vm_pageout_wanted && curthread->td_proc != pageproc) {
 		vm_pageout_wanted = true;
 		wakeup(&vm_pageout_wanted);
 	}
+}
+
+/*
+ * Wake up the page daemon and wait for it to reclaim free pages.
+ *
+ * This function returns with the free queues mutex unlocked.
+ */
+void
+pagedaemon_wait(int pri, const char *wmesg)
+{
+
+	mtx_assert(&vm_page_queue_free_mtx, MA_OWNED);
+
+	/*
+	 * vm_pageout_wanted may have been set by an advisory wakeup, but if the
+	 * page daemon is running on a CPU, the wakeup will have been lost.
+	 * Thus, deliver a potentially spurious wakeup to ensure that the page
+	 * daemon has been notified of the shortage.
+	 */
+	if (!vm_pageout_wanted || !vm_pages_needed) {
+		vm_pageout_wanted = true;
+		wakeup(&vm_pageout_wanted);
+	}
+	vm_pages_needed = true;
+	msleep(&vm_cnt.v_free_count, &vm_page_queue_free_mtx, PDROP | pri,
+	    wmesg, 0);
 }

Modified: projects/clang600-import/sys/vm/vm_pageout.h
==============================================================================
--- projects/clang600-import/sys/vm/vm_pageout.h	Sun Dec 24 19:45:16 2017	(r327168)
+++ projects/clang600-import/sys/vm/vm_pageout.h	Sun Dec 24 20:17:36 2017	(r327169)
@@ -96,11 +96,12 @@ extern bool vm_pages_needed;
  *	Signal pageout-daemon and wait for it.
  */
 
-extern void pagedaemon_wakeup(void);
+void pagedaemon_wait(int pri, const char *wmesg);
+void pagedaemon_wakeup(void);
 #define VM_WAIT vm_wait()
 #define VM_WAITPFAULT vm_waitpfault()
-extern void vm_wait(void);
-extern void vm_waitpfault(void);
+void vm_wait(void);
+void vm_waitpfault(void);
 
 #ifdef _KERNEL
 int vm_pageout_flush(vm_page_t *, int, int, int, int *, boolean_t *);

Modified: projects/clang600-import/sys/x86/isa/orm.c
==============================================================================
--- projects/clang600-import/sys/x86/isa/orm.c	Sun Dec 24 19:45:16 2017	(r327168)
+++ projects/clang600-import/sys/x86/isa/orm.c	Sun Dec 24 20:17:36 2017	(r327169)
@@ -156,7 +156,6 @@ orm_identify(driver_t* driver, device_t parent)
 		device_set_desc(child, "ISA Option ROM");
 	else
 		device_set_desc(child, "ISA Option ROMs");
-//	isa_set_vendorid(child, PNP_EISAID("PNP0C80"));
 }
 
 static int



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