Index: sys/lwp.h
===================================================================
RCS file: /cvsroot/src/sys/sys/lwp.h,v
retrieving revision 1.179
diff -p -u -r1.179 lwp.h
--- sys/lwp.h 19 Apr 2018 21:19:07 -0000 1.179
+++ sys/lwp.h 28 Nov 2018 12:04:10 -0000
@@ -258,6 +258,7 @@ extern int maxlwp __read_mostly; /* max
#define LP_VFORKWAIT 0x00000200 /* Waiting at vfork() for a child */
#define LP_SINGLESTEP 0x00000400 /* Single step thread in ptrace(2) */
#define LP_TIMEINTR 0x00010000 /* Time this soft interrupt */
+#define LP_PREEMPTING 0x00020000 /* mi_switch called involuntarily */
#define LP_RUNNING 0x20000000 /* Active on a CPU */
#define LP_BOUND 0x80000000 /* Bound to a CPU */
Index: kern/kern_synch.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_synch.c,v
retrieving revision 1.318
diff -p -u -r1.318 kern_synch.c
--- kern/kern_synch.c 14 Aug 2018 01:06:01 -0000 1.318
+++ kern/kern_synch.c 28 Nov 2018 12:04:14 -0000
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_synch.c,v 1.318 2018/08/14 01:06:01 ozaki-r Exp $ */
+/* $NetBSD: kern_synch.c,v 1.319 2018/11/28 09:44:49 mlelstv Exp $ */
/*-
* Copyright (c) 1999, 2000, 2004, 2006, 2007, 2008, 2009
@@ -69,7 +69,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.318 2018/08/14 01:06:01 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.319 2018/11/28 09:44:49 mlelstv Exp $");
#include "opt_kstack.h"
#include "opt_dtrace.h"
@@ -286,12 +286,16 @@ preempt(void)
{
struct lwp *l = curlwp;
+ /* check if the scheduler has another LWP to run */
+ if ((l->l_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD) == 0)
+ return;
+
KERNEL_UNLOCK_ALL(l, &l->l_biglocks);
lwp_lock(l);
KASSERT(lwp_locked(l, l->l_cpu->ci_schedstate.spc_lwplock));
KASSERT(l->l_stat == LSONPROC);
l->l_kpriority = false;
- l->l_nivcsw++;
+ l->l_pflag |= LP_PREEMPTING;
(void)mi_switch(l);
KERNEL_LOCK(l->l_biglocks, l);
}
@@ -649,6 +653,9 @@ mi_switch(lwp_t *l)
KASSERT(l->l_ctxswtch == 0);
l->l_ctxswtch = 1;
l->l_ncsw++;
+ if ((l->l_pflag & LP_PREEMPTING) != 0)
+ l->l_nivcsw++;
+ l->l_pflag &= ~LP_PREEMPTING;
KASSERT((l->l_pflag & LP_RUNNING) != 0);
l->l_pflag &= ~LP_RUNNING;
@@ -752,6 +759,7 @@ mi_switch(lwp_t *l)
/* Nothing to do - just unlock and return. */
pserialize_switchpoint();
mutex_spin_exit(spc->spc_mutex);
+ l->l_pflag &= ~LP_PREEMPTING;
lwp_unlock(l);
retval = 0;
}