Module Name:    src
Committed By:   ad
Date:           Sat Mar 14 18:08:40 UTC 2020

Modified Files:
        src/sys/arch/arm/arm32: bus_dma.c
        src/sys/arch/mips/mips: bus_dma.c
        src/sys/arch/x86/x86: bus_dma.c
        src/sys/compat/linux/common: linux_futex.c
        src/sys/dev/nvmm/x86: nvmm_x86_svm.c nvmm_x86_vmx.c
        src/sys/dev/pci/qat: qatvar.h
        src/sys/external/bsd/drm2/include/linux: sched.h
        src/sys/kern: kern_ktrace.c kern_synch.c subr_copy.c vfs_bio.c
        src/sys/miscfs/genfs: genfs_io.c
        src/sys/nfs: nfs_syscalls.c
        src/sys/rump/librump/rumpkern: scheduler.c
        src/sys/sys: sched.h
        src/sys/ufs/ext2fs: ext2fs_lookup.c
        src/sys/ufs/lfs: ulfs_dirhash.c ulfs_lookup.c
        src/sys/ufs/ufs: ufs_dirhash.c ufs_lookup.c
        src/sys/uvm: uvm_amap.c

Log Message:
- Hide the details of SPCF_SHOULDYIELD and related behind a couple of small
  functions: preempt_point() and preempt_needed().

- preempt(): if the LWP has exceeded its timeslice in kernel, strip it of
  any priority boost gained earlier from blocking.


To generate a diff of this commit:
cvs rdiff -u -r1.120 -r1.121 src/sys/arch/arm/arm32/bus_dma.c
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/mips/mips/bus_dma.c
cvs rdiff -u -r1.81 -r1.82 src/sys/arch/x86/x86/bus_dma.c
cvs rdiff -u -r1.37 -r1.38 src/sys/compat/linux/common/linux_futex.c
cvs rdiff -u -r1.56 -r1.57 src/sys/dev/nvmm/x86/nvmm_x86_svm.c
cvs rdiff -u -r1.50 -r1.51 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/pci/qat/qatvar.h
cvs rdiff -u -r1.13 -r1.14 src/sys/external/bsd/drm2/include/linux/sched.h
cvs rdiff -u -r1.175 -r1.176 src/sys/kern/kern_ktrace.c
cvs rdiff -u -r1.342 -r1.343 src/sys/kern/kern_synch.c
cvs rdiff -u -r1.12 -r1.13 src/sys/kern/subr_copy.c
cvs rdiff -u -r1.289 -r1.290 src/sys/kern/vfs_bio.c
cvs rdiff -u -r1.89 -r1.90 src/sys/miscfs/genfs/genfs_io.c
cvs rdiff -u -r1.161 -r1.162 src/sys/nfs/nfs_syscalls.c
cvs rdiff -u -r1.50 -r1.51 src/sys/rump/librump/rumpkern/scheduler.c
cvs rdiff -u -r1.87 -r1.88 src/sys/sys/sched.h
cvs rdiff -u -r1.88 -r1.89 src/sys/ufs/ext2fs/ext2fs_lookup.c
cvs rdiff -u -r1.17 -r1.18 src/sys/ufs/lfs/ulfs_dirhash.c
cvs rdiff -u -r1.41 -r1.42 src/sys/ufs/lfs/ulfs_lookup.c
cvs rdiff -u -r1.38 -r1.39 src/sys/ufs/ufs/ufs_dirhash.c
cvs rdiff -u -r1.150 -r1.151 src/sys/ufs/ufs/ufs_lookup.c
cvs rdiff -u -r1.116 -r1.117 src/sys/uvm/uvm_amap.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/arch/arm/arm32/bus_dma.c
diff -u src/sys/arch/arm/arm32/bus_dma.c:1.120 src/sys/arch/arm/arm32/bus_dma.c:1.121
--- src/sys/arch/arm/arm32/bus_dma.c:1.120	Sat Feb 22 08:22:09 2020
+++ src/sys/arch/arm/arm32/bus_dma.c	Sat Mar 14 18:08:38 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: bus_dma.c,v 1.120 2020/02/22 08:22:09 skrll Exp $	*/
+/*	$NetBSD: bus_dma.c,v 1.121 2020/03/14 18:08:38 ad Exp $	*/
 
 /*-
- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996, 1997, 1998, 2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -36,7 +36,7 @@
 #include "opt_cputypes.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.120 2020/02/22 08:22:09 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.121 2020/03/14 18:08:38 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -1790,10 +1790,8 @@ _bus_dma_uiomove(void *buf, struct uio *
 			continue;
 		cnt = MIN(resid, iov->iov_len);
 
-		if (!VMSPACE_IS_KERNEL_P(vm) &&
-		    (curlwp->l_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-		    != 0) {
-			preempt();
+		if (!VMSPACE_IS_KERNEL_P(vm)) {
+			preempt_point();
 		}
 		if (direction == UIO_READ) {
 			error = copyout_vmspace(vm, cp, iov->iov_base, cnt);

Index: src/sys/arch/mips/mips/bus_dma.c
diff -u src/sys/arch/mips/mips/bus_dma.c:1.39 src/sys/arch/mips/mips/bus_dma.c:1.40
--- src/sys/arch/mips/mips/bus_dma.c:1.39	Fri Mar 13 03:49:39 2020
+++ src/sys/arch/mips/mips/bus_dma.c	Sat Mar 14 18:08:38 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: bus_dma.c,v 1.39 2020/03/13 03:49:39 thorpej Exp $	*/
+/*	$NetBSD: bus_dma.c,v 1.40 2020/03/14 18:08:38 ad Exp $	*/
 
 /*-
- * Copyright (c) 1997, 1998, 2001 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997, 1998, 2001, 2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -32,7 +32,7 @@
 
 #include <sys/cdefs.h>			/* RCS ID & Copyright macro defns */
 
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.39 2020/03/13 03:49:39 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.40 2020/03/14 18:08:38 ad Exp $");
 
 #define _MIPS_BUS_DMA_PRIVATE
 
@@ -1291,10 +1291,8 @@ _bus_dma_uiomove(void *buf, struct uio *
 			continue;
 		cnt = MIN(resid, iov->iov_len);
 
-		if (!VMSPACE_IS_KERNEL_P(vm) &&
-		    (curlwp->l_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-		    != 0) {
-			preempt();
+		if (!VMSPACE_IS_KERNEL_P(vm)) {
+			preempt_point();
 		}
 		if (direction == UIO_READ) {
 			error = copyout_vmspace(vm, cp, iov->iov_base, cnt);

Index: src/sys/arch/x86/x86/bus_dma.c
diff -u src/sys/arch/x86/x86/bus_dma.c:1.81 src/sys/arch/x86/x86/bus_dma.c:1.82
--- src/sys/arch/x86/x86/bus_dma.c:1.81	Thu Nov 14 16:23:52 2019
+++ src/sys/arch/x86/x86/bus_dma.c	Sat Mar 14 18:08:38 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: bus_dma.c,v 1.81 2019/11/14 16:23:52 maxv Exp $	*/
+/*	$NetBSD: bus_dma.c,v 1.82 2020/03/14 18:08:38 ad Exp $	*/
 
 /*-
- * Copyright (c) 1996, 1997, 1998, 2007 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996, 1997, 1998, 2007, 2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.81 2019/11/14 16:23:52 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.82 2020/03/14 18:08:38 ad Exp $");
 
 /*
  * The following is included because _bus_dma_uiomove is derived from
@@ -1064,10 +1064,8 @@ _bus_dma_uiomove(void *buf, struct uio *
 			continue;
 		cnt = MIN(resid, iov->iov_len);
 
-		if (!VMSPACE_IS_KERNEL_P(vm) &&
-		    (curlwp->l_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-		    != 0) {
-			preempt();
+		if (!VMSPACE_IS_KERNEL_P(vm)) {
+			preempt_point();
 		}
 		if (direction == UIO_READ) {
 			error = copyout_vmspace(vm, cp, iov->iov_base, cnt);

Index: src/sys/compat/linux/common/linux_futex.c
diff -u src/sys/compat/linux/common/linux_futex.c:1.37 src/sys/compat/linux/common/linux_futex.c:1.38
--- src/sys/compat/linux/common/linux_futex.c:1.37	Mon Apr 10 15:04:32 2017
+++ src/sys/compat/linux/common/linux_futex.c	Sat Mar 14 18:08:38 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_futex.c,v 1.37 2017/04/10 15:04:32 dholland Exp $ */
+/*	$NetBSD: linux_futex.c,v 1.38 2020/03/14 18:08:38 ad Exp $ */
 
 /*-
  * Copyright (c) 2005 Emmanuel Dreyfus, all rights reserved.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: linux_futex.c,v 1.37 2017/04/10 15:04:32 dholland Exp $");
+__KERNEL_RCSID(1, "$NetBSD: linux_futex.c,v 1.38 2020/03/14 18:08:38 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/time.h>
@@ -45,6 +45,7 @@ __KERNEL_RCSID(1, "$NetBSD: linux_futex.
 #include <sys/kmem.h>
 #include <sys/kernel.h>
 #include <sys/atomic.h>
+#include <sys/sched.h>
 
 #include <compat/linux/common/linux_types.h>
 #include <compat/linux/common/linux_emuldata.h>
@@ -801,7 +802,7 @@ release_futexes(struct lwp *l)
 		if (!--limit)
 			break;
 
-		yield();	/* XXX why? */
+		preempt_point();
 	}
 
 	if (pending)

Index: src/sys/dev/nvmm/x86/nvmm_x86_svm.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.56 src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.57
--- src/sys/dev/nvmm/x86/nvmm_x86_svm.c:1.56	Fri Feb 21 00:26:22 2020
+++ src/sys/dev/nvmm/x86/nvmm_x86_svm.c	Sat Mar 14 18:08:39 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: nvmm_x86_svm.c,v 1.56 2020/02/21 00:26:22 joerg Exp $	*/
+/*	$NetBSD: nvmm_x86_svm.c,v 1.57 2020/03/14 18:08:39 ad Exp $	*/
 
 /*
- * Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
+ * Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.56 2020/02/21 00:26:22 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_svm.c,v 1.57 2020/03/14 18:08:39 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1441,10 +1441,7 @@ svm_vcpu_run(struct nvmm_machine *mach, 
 		}
 
 		/* If no reason to return to userland, keep rolling. */
-		if (curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD) {
-			break;
-		}
-		if (curcpu()->ci_data.cpu_softints != 0) {
+		if (preempt_needed()) {
 			break;
 		}
 		if (curlwp->l_flag & LW_USERRET) {

Index: src/sys/dev/nvmm/x86/nvmm_x86_vmx.c
diff -u src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.50 src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.51
--- src/sys/dev/nvmm/x86/nvmm_x86_vmx.c:1.50	Thu Mar 12 13:01:59 2020
+++ src/sys/dev/nvmm/x86/nvmm_x86_vmx.c	Sat Mar 14 18:08:39 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: nvmm_x86_vmx.c,v 1.50 2020/03/12 13:01:59 tnn Exp $	*/
+/*	$NetBSD: nvmm_x86_vmx.c,v 1.51 2020/03/14 18:08:39 ad Exp $	*/
 
 /*
- * Copyright (c) 2018-2019 The NetBSD Foundation, Inc.
+ * Copyright (c) 2018-2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.50 2020/03/12 13:01:59 tnn Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nvmm_x86_vmx.c,v 1.51 2020/03/14 18:08:39 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -2063,10 +2063,7 @@ vmx_vcpu_run(struct nvmm_machine *mach, 
 		}
 
 		/* If no reason to return to userland, keep rolling. */
-		if (curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD) {
-			break;
-		}
-		if (curcpu()->ci_data.cpu_softints != 0) {
+		if (preempt_needed()) {
 			break;
 		}
 		if (curlwp->l_flag & LW_USERRET) {

Index: src/sys/dev/pci/qat/qatvar.h
diff -u src/sys/dev/pci/qat/qatvar.h:1.1 src/sys/dev/pci/qat/qatvar.h:1.2
--- src/sys/dev/pci/qat/qatvar.h:1.1	Wed Nov 20 09:37:46 2019
+++ src/sys/dev/pci/qat/qatvar.h	Sat Mar 14 18:08:39 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: qatvar.h,v 1.1 2019/11/20 09:37:46 hikaru Exp $	*/
+/*	$NetBSD: qatvar.h,v 1.2 2020/03/14 18:08:39 ad Exp $	*/
 
 /*
  * Copyright (c) 2019 Internet Initiative Japan, Inc.
@@ -889,7 +889,7 @@ struct qat_softc {
  * and the configroot threads, which is running for qat_init(),
  * takes kernel_lock and the uvm_scheduler is not working at that point.
  */
-#define QAT_YIELD()	yield()
+#define QAT_YIELD()	preempt_point()
 
 extern int qat_dump;
 

Index: src/sys/external/bsd/drm2/include/linux/sched.h
diff -u src/sys/external/bsd/drm2/include/linux/sched.h:1.13 src/sys/external/bsd/drm2/include/linux/sched.h:1.14
--- src/sys/external/bsd/drm2/include/linux/sched.h:1.13	Sat Sep 28 15:13:08 2019
+++ src/sys/external/bsd/drm2/include/linux/sched.h	Sat Mar 14 18:08:39 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: sched.h,v 1.13 2019/09/28 15:13:08 christos Exp $	*/
+/*	$NetBSD: sched.h,v 1.14 2020/03/14 18:08:39 ad Exp $	*/
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -87,8 +87,7 @@ static inline void
 cond_resched(void)
 {
 
-	if (curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-		preempt();
+	preempt_point();
 }
 
 #endif  /* _LINUX_SCHED_H_ */

Index: src/sys/kern/kern_ktrace.c
diff -u src/sys/kern/kern_ktrace.c:1.175 src/sys/kern/kern_ktrace.c:1.176
--- src/sys/kern/kern_ktrace.c:1.175	Fri Feb 21 00:26:22 2020
+++ src/sys/kern/kern_ktrace.c	Sat Mar 14 18:08:39 2020
@@ -1,7 +1,7 @@
-/*	$NetBSD: kern_ktrace.c,v 1.175 2020/02/21 00:26:22 joerg Exp $	*/
+/*	$NetBSD: kern_ktrace.c,v 1.176 2020/03/14 18:08:39 ad Exp $	*/
 
 /*-
- * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
+ * Copyright (c) 2006, 2007, 2008, 2020 The NetBSD Foundation, Inc.
  * All rights reserved.
  *
  * This code is derived from software contributed to The NetBSD Foundation
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.175 2020/02/21 00:26:22 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_ktrace.c,v 1.176 2020/03/14 18:08:39 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -720,7 +720,7 @@ ktr_io(lwp_t *l, int fd, enum uio_rw rw,
 	 */
 	ktraddentry(l, kte, KTA_WAITOK | KTA_LARGE);
 	if (resid > 0) {
-		if (curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD) {
+		if (preempt_needed()) {
 			(void)ktrenter(l);
 			preempt();
 			ktrexit(l);

Index: src/sys/kern/kern_synch.c
diff -u src/sys/kern/kern_synch.c:1.342 src/sys/kern/kern_synch.c:1.343
--- src/sys/kern/kern_synch.c:1.342	Sun Feb 23 16:27:09 2020
+++ src/sys/kern/kern_synch.c	Sat Mar 14 18:08:39 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_synch.c,v 1.342 2020/02/23 16:27:09 ad Exp $	*/
+/*	$NetBSD: kern_synch.c,v 1.343 2020/03/14 18:08:39 ad Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2004, 2006, 2007, 2008, 2009, 2019, 2020
@@ -69,7 +69,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.342 2020/02/23 16:27:09 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_synch.c,v 1.343 2020/03/14 18:08:39 ad Exp $");
 
 #include "opt_kstack.h"
 #include "opt_dtrace.h"
@@ -306,8 +306,7 @@ wakeup(wchan_t ident)
 
 /*
  * General yield call.  Puts the current LWP back on its run queue and
- * performs a voluntary context switch.  Should only be called when the
- * current LWP explicitly requests it (eg sched_yield(2)).
+ * performs a context switch.
  */
 void
 yield(void)
@@ -329,7 +328,12 @@ yield(void)
 
 /*
  * General preemption call.  Puts the current LWP back on its run queue
- * and performs an involuntary context switch.
+ * and performs an involuntary context switch.  Different from yield()
+ * in that:
+ *
+ * - It's counted differently (involuntary vs. voluntary).
+ * - Realtime threads go to the head of their runqueue vs. tail for yield().
+ * - Priority boost is retained unless LWP has exceeded timeslice.
  */
 void
 preempt(void)
@@ -342,14 +346,57 @@ preempt(void)
 	KASSERT(lwp_locked(l, l->l_cpu->ci_schedstate.spc_lwplock));
 	KASSERT(l->l_stat == LSONPROC);
 
-	/* Involuntary - keep kpriority boost. */
-	l->l_pflag |= LP_PREEMPTING;
 	spc_lock(l->l_cpu);
+	/* Involuntary - keep kpriority boost unless a CPU hog. */
+	if ((l->l_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD) != 0) {
+		l->l_kpriority = false;
+	}
+	l->l_pflag |= LP_PREEMPTING;
 	mi_switch(l);
 	KERNEL_LOCK(l->l_biglocks, l);
 }
 
 /*
+ * A breathing point for long running code in kernel.
+ */
+void
+preempt_point(void)
+{
+	lwp_t *l = curlwp;
+	int needed;
+
+	KPREEMPT_DISABLE(l);
+	needed = l->l_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD;
+#ifndef __HAVE_FAST_SOFTINTS
+	needed |= l->l_cpu->ci_data.cpu_softints;
+#endif
+	KPREEMPT_ENABLE(l);
+
+	if (__predict_false(needed)) {
+		preempt();
+	}
+}
+
+/*
+ * Check the SPCF_SHOULDYIELD flag.
+ */
+bool
+preempt_needed(void)
+{
+	lwp_t *l = curlwp;
+	int needed;
+
+	KPREEMPT_DISABLE(l);
+	needed = l->l_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD;
+#ifndef __HAVE_FAST_SOFTINTS
+	needed |= l->l_cpu->ci_data.cpu_softints;
+#endif
+	KPREEMPT_ENABLE(l);
+
+	return (bool)needed;
+}
+
+/*
  * Handle a request made by another agent to preempt the current LWP
  * in-kernel.  Usually called when l_dopreempt may be non-zero.
  *

Index: src/sys/kern/subr_copy.c
diff -u src/sys/kern/subr_copy.c:1.12 src/sys/kern/subr_copy.c:1.13
--- src/sys/kern/subr_copy.c:1.12	Sat Feb 22 21:59:30 2020
+++ src/sys/kern/subr_copy.c	Sat Mar 14 18:08:39 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_copy.c,v 1.12 2020/02/22 21:59:30 chs Exp $	*/
+/*	$NetBSD: subr_copy.c,v 1.13 2020/03/14 18:08:39 ad Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 1999, 2002, 2007, 2008, 2019
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_copy.c,v 1.12 2020/02/22 21:59:30 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_copy.c,v 1.13 2020/03/14 18:08:39 ad Exp $");
 
 #define	__UFETCHSTORE_PRIVATE
 #define	__UCAS_PRIVATE
@@ -123,9 +123,7 @@ uiomove(void *buf, size_t n, struct uio 
 		if (cnt > n)
 			cnt = n;
 		if (!VMSPACE_IS_KERNEL_P(vm)) {
-			if (curcpu()->ci_schedstate.spc_flags &
-			    SPCF_SHOULDYIELD)
-				preempt();
+			preempt_point();
 		}
 
 		if (uio->uio_rw == UIO_READ) {

Index: src/sys/kern/vfs_bio.c
diff -u src/sys/kern/vfs_bio.c:1.289 src/sys/kern/vfs_bio.c:1.290
--- src/sys/kern/vfs_bio.c:1.289	Fri Feb 21 02:04:40 2020
+++ src/sys/kern/vfs_bio.c	Sat Mar 14 18:08:39 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_bio.c,v 1.289 2020/02/21 02:04:40 riastradh Exp $	*/
+/*	$NetBSD: vfs_bio.c,v 1.290 2020/03/14 18:08:39 ad Exp $	*/
 
 /*-
  * Copyright (c) 2007, 2008, 2009, 2019 The NetBSD Foundation, Inc.
@@ -123,7 +123,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.289 2020/02/21 02:04:40 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.290 2020/03/14 18:08:39 ad Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_bufcache.h"
@@ -1378,8 +1378,7 @@ allocbuf(buf_t *bp, int size, int preser
 		 * Need to trim overall memory usage.
 		 */
 		while (buf_canrelease()) {
-			if (curcpu()->ci_schedstate.spc_flags &
-			    SPCF_SHOULDYIELD) {
+			if (preempt_needed()) {
 				mutex_exit(&bufcache_lock);
 				preempt();
 				mutex_enter(&bufcache_lock);

Index: src/sys/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.89 src/sys/miscfs/genfs/genfs_io.c:1.90
--- src/sys/miscfs/genfs/genfs_io.c:1.89	Sat Mar 14 15:34:24 2020
+++ src/sys/miscfs/genfs/genfs_io.c	Sat Mar 14 18:08:39 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.89 2020/03/14 15:34:24 ad Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.90 2020/03/14 18:08:39 ad Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.89 2020/03/14 15:34:24 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.90 2020/03/14 18:08:39 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -1047,8 +1047,7 @@ retry:
 		 * a preempt point.
 		 */
 
-		if ((l->l_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-		    != 0) {
+		if (preempt_needed()) {
 			nextoff = pg->offset; /* visit this page again */
 			rw_exit(slock);
 			preempt();

Index: src/sys/nfs/nfs_syscalls.c
diff -u src/sys/nfs/nfs_syscalls.c:1.161 src/sys/nfs/nfs_syscalls.c:1.162
--- src/sys/nfs/nfs_syscalls.c:1.161	Sun Feb  3 03:19:28 2019
+++ src/sys/nfs/nfs_syscalls.c	Sat Mar 14 18:08:39 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: nfs_syscalls.c,v 1.161 2019/02/03 03:19:28 mrg Exp $	*/
+/*	$NetBSD: nfs_syscalls.c,v 1.162 2020/03/14 18:08:39 ad Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_syscalls.c,v 1.161 2019/02/03 03:19:28 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_syscalls.c,v 1.162 2020/03/14 18:08:39 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -635,10 +635,8 @@ nfssvc_nfsd(struct nfssvc_copy_ops *ops,
 	for (;;) {
 		bool dummy;
 
-		if ((curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-		    != 0) {
-			preempt();
-		}
+		preempt_point();
+
 		if (nfsd->nfsd_slp == NULL) {
 			mutex_enter(&nfsd_lock);
 			while (nfsd->nfsd_slp == NULL &&

Index: src/sys/rump/librump/rumpkern/scheduler.c
diff -u src/sys/rump/librump/rumpkern/scheduler.c:1.50 src/sys/rump/librump/rumpkern/scheduler.c:1.51
--- src/sys/rump/librump/rumpkern/scheduler.c:1.50	Sat Feb 15 18:12:15 2020
+++ src/sys/rump/librump/rumpkern/scheduler.c	Sat Mar 14 18:08:39 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: scheduler.c,v 1.50 2020/02/15 18:12:15 ad Exp $	*/
+/*      $NetBSD: scheduler.c,v 1.51 2020/03/14 18:08:39 ad Exp $	*/
 
 /*
  * Copyright (c) 2010, 2011 Antti Kantee.  All Rights Reserved.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.50 2020/02/15 18:12:15 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: scheduler.c,v 1.51 2020/03/14 18:08:39 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -597,3 +597,16 @@ sched_dequeue(struct lwp *l)
 
 	panic("sched_dequeue not implemented");
 }
+
+void
+preempt_point(void)
+{
+
+}
+
+bool
+preempt_needed(void)
+{
+
+	return false;
+}

Index: src/sys/sys/sched.h
diff -u src/sys/sys/sched.h:1.87 src/sys/sys/sched.h:1.88
--- src/sys/sys/sched.h:1.87	Sun Jan 12 22:03:23 2020
+++ src/sys/sys/sched.h	Sat Mar 14 18:08:39 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: sched.h,v 1.87 2020/01/12 22:03:23 ad Exp $	*/
+/*	$NetBSD: sched.h,v 1.88 2020/03/14 18:08:39 ad Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2007, 2008, 2019, 2020
@@ -268,6 +268,8 @@ void		sched_print_runqueue(void (*pr)(co
 /* Dispatching */
 bool		kpreempt(uintptr_t);
 void		preempt(void);
+bool		preempt_needed(void);
+void		preempt_point(void);
 void		yield(void);
 void		mi_switch(struct lwp *);
 void		updatertime(lwp_t *, const struct bintime *);

Index: src/sys/ufs/ext2fs/ext2fs_lookup.c
diff -u src/sys/ufs/ext2fs/ext2fs_lookup.c:1.88 src/sys/ufs/ext2fs/ext2fs_lookup.c:1.89
--- src/sys/ufs/ext2fs/ext2fs_lookup.c:1.88	Tue Aug 23 06:40:25 2016
+++ src/sys/ufs/ext2fs/ext2fs_lookup.c	Sat Mar 14 18:08:40 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ext2fs_lookup.c,v 1.88 2016/08/23 06:40:25 christos Exp $	*/
+/*	$NetBSD: ext2fs_lookup.c,v 1.89 2020/03/14 18:08:40 ad Exp $	*/
 
 /*
  * Modified for NetBSD 1.2E
@@ -48,7 +48,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ext2fs_lookup.c,v 1.88 2016/08/23 06:40:25 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ext2fs_lookup.c,v 1.89 2020/03/14 18:08:40 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -418,8 +418,8 @@ ext2fs_lookup(void *v)
 
 searchloop:
 	while (results->ulr_offset < endsearch) {
-		if (curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-			preempt();
+		preempt_point();
+
 		/*
 		 * If necessary, get the next directory block.
 		 */

Index: src/sys/ufs/lfs/ulfs_dirhash.c
diff -u src/sys/ufs/lfs/ulfs_dirhash.c:1.17 src/sys/ufs/lfs/ulfs_dirhash.c:1.18
--- src/sys/ufs/lfs/ulfs_dirhash.c:1.17	Mon Jun 20 01:53:38 2016
+++ src/sys/ufs/lfs/ulfs_dirhash.c	Sat Mar 14 18:08:40 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_dirhash.c,v 1.17 2016/06/20 01:53:38 dholland Exp $	*/
+/*	$NetBSD: ulfs_dirhash.c,v 1.18 2020/03/14 18:08:40 ad Exp $	*/
 /*  from NetBSD: ufs_dirhash.c,v 1.37 2014/12/20 00:28:05 christos Exp  */
 
 /*
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_dirhash.c,v 1.17 2016/06/20 01:53:38 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_dirhash.c,v 1.18 2020/03/14 18:08:40 ad Exp $");
 
 /*
  * This implements a hash-based lookup scheme for ULFS directories.
@@ -214,10 +214,8 @@ ulfsdirhash_build(struct inode *ip)
 	bmask = VFSTOULFS(vp->v_mount)->um_mountp->mnt_stat.f_iosize - 1;
 	pos = 0;
 	while (pos < ip->i_size) {
-		if ((curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-		    != 0) {
-			preempt();
-		}
+		preempt_point();
+
 		/* If necessary, get the next directory block. */
 		if ((pos & bmask) == 0) {
 			if (bp != NULL)

Index: src/sys/ufs/lfs/ulfs_lookup.c
diff -u src/sys/ufs/lfs/ulfs_lookup.c:1.41 src/sys/ufs/lfs/ulfs_lookup.c:1.42
--- src/sys/ufs/lfs/ulfs_lookup.c:1.41	Sat Jun 10 05:29:36 2017
+++ src/sys/ufs/lfs/ulfs_lookup.c	Sat Mar 14 18:08:40 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ulfs_lookup.c,v 1.41 2017/06/10 05:29:36 maya Exp $	*/
+/*	$NetBSD: ulfs_lookup.c,v 1.42 2020/03/14 18:08:40 ad Exp $	*/
 /*  from NetBSD: ufs_lookup.c,v 1.135 2015/07/11 11:04:48 mlelstv  */
 
 /*
@@ -38,7 +38,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.41 2017/06/10 05:29:36 maya Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ulfs_lookup.c,v 1.42 2020/03/14 18:08:40 ad Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_lfs.h"
@@ -292,8 +292,8 @@ ulfs_lookup(void *v)
 
 searchloop:
 	while (results->ulr_offset < endsearch) {
-		if (curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-			preempt();
+		preempt_point();
+
 		/*
 		 * If necessary, get the next directory block.
 		 */

Index: src/sys/ufs/ufs/ufs_dirhash.c
diff -u src/sys/ufs/ufs/ufs_dirhash.c:1.38 src/sys/ufs/ufs/ufs_dirhash.c:1.39
--- src/sys/ufs/ufs/ufs_dirhash.c:1.38	Sun Mar  8 00:23:59 2020
+++ src/sys/ufs/ufs/ufs_dirhash.c	Sat Mar 14 18:08:40 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_dirhash.c,v 1.38 2020/03/08 00:23:59 chs Exp $	*/
+/*	$NetBSD: ufs_dirhash.c,v 1.39 2020/03/14 18:08:40 ad Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002 Ian Dowse.  All rights reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_dirhash.c,v 1.38 2020/03/08 00:23:59 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_dirhash.c,v 1.39 2020/03/14 18:08:40 ad Exp $");
 
 /*
  * This implements a hash-based lookup scheme for UFS directories.
@@ -212,10 +212,8 @@ ufsdirhash_build(struct inode *ip)
 	bmask = VFSTOUFS(vp->v_mount)->um_mountp->mnt_stat.f_iosize - 1;
 	pos = 0;
 	while (pos < ip->i_size) {
-		if ((curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-		    != 0) {
-			preempt();
-		}
+		preempt_point();
+
 		/* If necessary, get the next directory block. */
 		if ((pos & bmask) == 0) {
 			if (bp != NULL)

Index: src/sys/ufs/ufs/ufs_lookup.c
diff -u src/sys/ufs/ufs/ufs_lookup.c:1.150 src/sys/ufs/ufs/ufs_lookup.c:1.151
--- src/sys/ufs/ufs/ufs_lookup.c:1.150	Sun May  5 15:07:12 2019
+++ src/sys/ufs/ufs/ufs_lookup.c	Sat Mar 14 18:08:40 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_lookup.c,v 1.150 2019/05/05 15:07:12 christos Exp $	*/
+/*	$NetBSD: ufs_lookup.c,v 1.151 2020/03/14 18:08:40 ad Exp $	*/
 
 /*
  * Copyright (c) 1989, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_lookup.c,v 1.150 2019/05/05 15:07:12 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_lookup.c,v 1.151 2020/03/14 18:08:40 ad Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ffs.h"
@@ -453,8 +453,8 @@ ufs_lookup(void *v)
 
 searchloop:
 	while (results->ulr_offset < endsearch) {
-		if (curcpu()->ci_schedstate.spc_flags & SPCF_SHOULDYIELD)
-			preempt();
+		preempt_point();
+
 		/*
 		 * If necessary, get the next directory block.
 		 */

Index: src/sys/uvm/uvm_amap.c
diff -u src/sys/uvm/uvm_amap.c:1.116 src/sys/uvm/uvm_amap.c:1.117
--- src/sys/uvm/uvm_amap.c:1.116	Mon Feb 24 12:38:57 2020
+++ src/sys/uvm/uvm_amap.c	Sat Mar 14 18:08:40 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_amap.c,v 1.116 2020/02/24 12:38:57 rin Exp $	*/
+/*	$NetBSD: uvm_amap.c,v 1.117 2020/03/14 18:08:40 ad Exp $	*/
 
 /*
  * Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_amap.c,v 1.116 2020/02/24 12:38:57 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_amap.c,v 1.117 2020/03/14 18:08:40 ad Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -764,8 +764,8 @@ amap_wipeout(struct vm_amap *amap)
 			anon->an_link = tofree;
 			tofree = anon;
 		}
-		if (curlwp->l_cpu->ci_schedstate.spc_flags & SPCF_SHOULDYIELD) {
-			preempt();
+		if ((lcv & 31) == 31) {
+			preempt_point();
 		}
 	}
 

Reply via email to