Module Name:    src
Committed By:   ad
Date:           Mon Jan 13 11:53:25 UTC 2020

Modified Files:
        src/sys/kern: kern_runq.c

Log Message:
- Fix an inverted test that could have prevented LWPs running on helper
  CPUs to teleport somewhere better during preempt().

- Fix a comment.


To generate a diff of this commit:
cvs rdiff -u -r1.58 -r1.59 src/sys/kern/kern_runq.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_runq.c
diff -u src/sys/kern/kern_runq.c:1.58 src/sys/kern/kern_runq.c:1.59
--- src/sys/kern/kern_runq.c:1.58	Sun Jan 12 22:03:22 2020
+++ src/sys/kern/kern_runq.c	Mon Jan 13 11:53:24 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_runq.c,v 1.58 2020/01/12 22:03:22 ad Exp $	*/
+/*	$NetBSD: kern_runq.c,v 1.59 2020/01/13 11:53:24 ad Exp $	*/
 
 /*-
  * Copyright (c) 2019, 2020 The NetBSD Foundation, Inc.
@@ -56,7 +56,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_runq.c,v 1.58 2020/01/12 22:03:22 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_runq.c,v 1.59 2020/01/13 11:53:24 ad Exp $");
 
 #include "opt_dtrace.h"
 
@@ -884,12 +884,12 @@ sched_preempted(struct lwp *l)
 	 * Try to select another CPU if:
 	 *
 	 * - there is no migration pending already
-	 * - and there is no realtime LWP in the mix (no time to waste then)
-	 * - and this LWP is running on a 2nd class CPU, or is child of vfork()
+	 * - and this LWP is running on a 2nd class CPU
+	 * - or this LWP is a child of vfork() that has just done execve()
 	 */
-	if (tspc->spc_maxpriority >= PRI_USER_RT || l->l_target_cpu != NULL ||
-	    ((tspc->spc_flags & SPCF_1STCLASS) | (l->l_pflag & LP_TELEPORT))
-	    == 0) {
+	if (l->l_target_cpu != NULL ||
+	    ((tspc->spc_flags & SPCF_1STCLASS) != 0 &&
+	    (l->l_pflag & LP_TELEPORT) == 0)) {
 		return;
 	}
 
@@ -911,20 +911,26 @@ sched_preempted(struct lwp *l)
 		tci = tci->ci_sibling[CPUREL_CORE];
 	}
 
-	/*
-	 * Try to find a better CPU to take it, but don't move to another
-	 * 2nd class CPU; there's not much point.
-	 *
-	 * Search in the current CPU package in order to try and keep L2/L3
-	 * cache locality, but expand to include the whole system if needed.
-	 */
 	if ((l->l_pflag & LP_TELEPORT) != 0) {
+		/*
+		 * A child of vfork(): now that the parent is released,
+		 * scatter far and wide, to match the LSIDL distribution
+		 * done in sched_takecpu().
+		 */
 		l->l_pflag &= ~LP_TELEPORT;
 		tci = sched_bestcpu(l, sched_nextpkg());
 		if (tci != ci) {
 			l->l_target_cpu = tci;
 		}
 	} else {
+		/*
+		 * Try to find a better CPU to take it, but don't move to
+		 * another 2nd class CPU; there's not much point.
+		 *
+		 * Search in the current CPU package in order to try and
+		 * keep L2/L3 cache locality, but expand to include the
+		 * whole system if needed.
+		 */
 		tci = sched_bestcpu(l, l->l_cpu);
 		if (tci != ci &&
 		    (tci->ci_schedstate.spc_flags & SPCF_1STCLASS) != 0) {

Reply via email to