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;
       }