Module Name: src
Committed By: ad
Date: Sat Nov 23 19:40:38 UTC 2019
Modified Files:
src/sys/arch/aarch64/aarch64: cpu_machdep.c
src/sys/arch/alpha/alpha: machdep.c
src/sys/arch/amiga/include: cpu.h
src/sys/arch/arm/arm: arm_machdep.c
src/sys/arch/arm/arm32: genassym.cf
src/sys/arch/atari/include: cpu.h
src/sys/arch/cesfic/include: cpu.h
src/sys/arch/evbcf/include: cpu.h
src/sys/arch/hp300/include: cpu.h
src/sys/arch/hppa/hppa: hppa_machdep.c
src/sys/arch/ia64/include: cpu.h
src/sys/arch/luna68k/include: cpu.h
src/sys/arch/mac68k/include: cpu.h
src/sys/arch/mips/mips: cpu_subr.c ipifuncs.c
src/sys/arch/mvme68k/include: cpu.h
src/sys/arch/news68k/include: cpu.h
src/sys/arch/next68k/include: cpu.h
src/sys/arch/powerpc/booke: e500_intr.c
src/sys/arch/powerpc/include: cpu.h
src/sys/arch/powerpc/include/booke: intr.h
src/sys/arch/powerpc/powerpc: genassym.cf powerpc_machdep.c
src/sys/arch/riscv/riscv: genassym.cf riscv_machdep.c
src/sys/arch/sh3/include: cpu.h
src/sys/arch/sparc/include: cpu.h
src/sys/arch/sparc64/include: cpu.h
src/sys/arch/sparc64/sparc64: genassym.cf machdep.c
src/sys/arch/sun68k/include: cpu.h
src/sys/arch/usermode/dev: cpu.c
src/sys/arch/usermode/include: cpu.h
src/sys/arch/vax/include: cpu.h
src/sys/arch/x68k/include: cpu.h
src/sys/arch/x86/include: cpu.h intrdefs.h
src/sys/arch/x86/x86: cpu.c ipi.c x86_machdep.c
src/sys/arch/xen/include: intrdefs.h
src/sys/arch/xen/x86: cpu.c xen_ipi.c
Log Message:
cpu_need_resched():
- Remove all code that should be MI, leaving the bare minimum under arch/.
- Make the required actions very explicit.
- Pass in LWP pointer for convenience.
- When a trap is required on another CPU, have the IPI set it locally.
- Expunge cpu_did_resched().
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/aarch64/aarch64/cpu_machdep.c
cvs rdiff -u -r1.354 -r1.355 src/sys/arch/alpha/alpha/machdep.c
cvs rdiff -u -r1.82 -r1.83 src/sys/arch/amiga/include/cpu.h
cvs rdiff -u -r1.55 -r1.56 src/sys/arch/arm/arm/arm_machdep.c
cvs rdiff -u -r1.80 -r1.81 src/sys/arch/arm/arm32/genassym.cf
cvs rdiff -u -r1.72 -r1.73 src/sys/arch/atari/include/cpu.h
cvs rdiff -u -r1.32 -r1.33 src/sys/arch/cesfic/include/cpu.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/evbcf/include/cpu.h
cvs rdiff -u -r1.71 -r1.72 src/sys/arch/hp300/include/cpu.h
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/hppa/hppa/hppa_machdep.c
cvs rdiff -u -r1.17 -r1.18 src/sys/arch/ia64/include/cpu.h
cvs rdiff -u -r1.36 -r1.37 src/sys/arch/luna68k/include/cpu.h
cvs rdiff -u -r1.101 -r1.102 src/sys/arch/mac68k/include/cpu.h
cvs rdiff -u -r1.35 -r1.36 src/sys/arch/mips/mips/cpu_subr.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/mips/mips/ipifuncs.c
cvs rdiff -u -r1.50 -r1.51 src/sys/arch/mvme68k/include/cpu.h
cvs rdiff -u -r1.45 -r1.46 src/sys/arch/news68k/include/cpu.h
cvs rdiff -u -r1.49 -r1.50 src/sys/arch/next68k/include/cpu.h
cvs rdiff -u -r1.38 -r1.39 src/sys/arch/powerpc/booke/e500_intr.c
cvs rdiff -u -r1.108 -r1.109 src/sys/arch/powerpc/include/cpu.h
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/powerpc/include/booke/intr.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/powerpc/powerpc/genassym.cf
cvs rdiff -u -r1.73 -r1.74 src/sys/arch/powerpc/powerpc/powerpc_machdep.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/riscv/riscv/genassym.cf \
src/sys/arch/riscv/riscv/riscv_machdep.c
cvs rdiff -u -r1.57 -r1.58 src/sys/arch/sh3/include/cpu.h
cvs rdiff -u -r1.101 -r1.102 src/sys/arch/sparc/include/cpu.h
cvs rdiff -u -r1.126 -r1.127 src/sys/arch/sparc64/include/cpu.h
cvs rdiff -u -r1.81 -r1.82 src/sys/arch/sparc64/sparc64/genassym.cf
cvs rdiff -u -r1.292 -r1.293 src/sys/arch/sparc64/sparc64/machdep.c
cvs rdiff -u -r1.24 -r1.25 src/sys/arch/sun68k/include/cpu.h
cvs rdiff -u -r1.80 -r1.81 src/sys/arch/usermode/dev/cpu.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/usermode/include/cpu.h
cvs rdiff -u -r1.102 -r1.103 src/sys/arch/vax/include/cpu.h
cvs rdiff -u -r1.61 -r1.62 src/sys/arch/x68k/include/cpu.h
cvs rdiff -u -r1.112 -r1.113 src/sys/arch/x86/include/cpu.h
cvs rdiff -u -r1.22 -r1.23 src/sys/arch/x86/include/intrdefs.h
cvs rdiff -u -r1.175 -r1.176 src/sys/arch/x86/x86/cpu.c
cvs rdiff -u -r1.28 -r1.29 src/sys/arch/x86/x86/ipi.c
cvs rdiff -u -r1.128 -r1.129 src/sys/arch/x86/x86/x86_machdep.c
cvs rdiff -u -r1.13 -r1.14 src/sys/arch/xen/include/intrdefs.h
cvs rdiff -u -r1.130 -r1.131 src/sys/arch/xen/x86/cpu.c
cvs rdiff -u -r1.33 -r1.34 src/sys/arch/xen/x86/xen_ipi.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/aarch64/aarch64/cpu_machdep.c
diff -u src/sys/arch/aarch64/aarch64/cpu_machdep.c:1.7 src/sys/arch/aarch64/aarch64/cpu_machdep.c:1.8
--- src/sys/arch/aarch64/aarch64/cpu_machdep.c:1.7 Thu Nov 21 19:57:23 2019
+++ src/sys/arch/aarch64/aarch64/cpu_machdep.c Sat Nov 23 19:40:34 2019
@@ -1,7 +1,7 @@
-/* $NetBSD: cpu_machdep.c,v 1.7 2019/11/21 19:57:23 ad Exp $ */
+/* $NetBSD: cpu_machdep.c,v 1.8 2019/11/23 19:40:34 ad Exp $ */
/*-
- * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * Copyright (c) 2014, 2019 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(1, "$NetBSD: cpu_machdep.c,v 1.7 2019/11/21 19:57:23 ad Exp $");
+__KERNEL_RCSID(1, "$NetBSD: cpu_machdep.c,v 1.8 2019/11/23 19:40:34 ad Exp $");
#include "opt_multiprocessor.h"
@@ -124,7 +124,8 @@ dosoftints(void)
if (softints == 0) {
#ifdef __HAVE_PREEMPTION
if (ci->ci_want_resched & RESCHED_KPREEMPT) {
- ci->ci_want_resched &= ~RESCHED_KPREEMPT;
+ atomic_and_uint(&ci->ci_want_resched,
+ ~RESCHED_KPREEMPT);
splsched();
kpreempt(-2);
}
@@ -233,60 +234,25 @@ startlwp(void *arg)
}
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
- struct lwp * const l = ci->ci_data.cpu_onproc;
-#ifdef MULTIPROCESSOR
- struct cpu_info * const cur_ci = curcpu();
-#endif
-
KASSERT(kpreempt_disabled());
- ci->ci_want_resched |= flags;
-
- if (__predict_false((l->l_pflag & LP_INTR) != 0)) {
- /*
- * No point doing anything, it will switch soon.
- * Also here to prevent an assertion failure in
- * kpreempt() due to preemption being set on a
- * soft interrupt LWP.
- */
- return;
- }
-
- if (__predict_false(l == ci->ci_data.cpu_idlelwp)) {
-#ifdef MULTIPROCESSOR
- /*
- * If the other CPU is idling, it must be waiting for an
- * interrupt. So give it one.
- */
- if (__predict_false(ci != cur_ci))
- intr_ipi_send(ci->ci_kcpuset, IPI_NOP);
-#endif
- return;
- }
-
-#ifdef MULTIPROCESSOR
- atomic_or_uint(&ci->ci_want_resched, flags);
-#else
- ci->ci_want_resched |= flags;
-#endif
-
- if (flags & RESCHED_KPREEMPT) {
+ if ((flags & RESCHED_KPREEMPT) != 0) {
#ifdef __HAVE_PREEMPTION
- atomic_or_uint(&l->l_dopreempt, DOPREEMPT_ACTIVE);
- if (ci != cur_ci) {
+ if ((flags & RESCHED_REMOTE) != 0) {
intr_ipi_send(ci->ci_kcpuset, IPI_KPREEMPT);
}
#endif
return;
}
- setsoftast(ci); /* force call to ast() */
+ if ((flags & RESCHED_REMOTE) != 0) {
#ifdef MULTIPROCESSOR
- if (ci != cur_ci && (flags & RESCHED_IMMED)) {
intr_ipi_send(ci->ci_kcpuset, IPI_AST);
- }
#endif
+ } else {
+ setsoftast(ci); /* force call to ast() */
+ }
}
void
Index: src/sys/arch/alpha/alpha/machdep.c
diff -u src/sys/arch/alpha/alpha/machdep.c:1.354 src/sys/arch/alpha/alpha/machdep.c:1.355
--- src/sys/arch/alpha/alpha/machdep.c:1.354 Fri Apr 5 14:12:14 2019
+++ src/sys/arch/alpha/alpha/machdep.c Sat Nov 23 19:40:34 2019
@@ -1,7 +1,7 @@
-/* $NetBSD: machdep.c,v 1.354 2019/04/05 14:12:14 thorpej Exp $ */
+/* $NetBSD: machdep.c,v 1.355 2019/11/23 19:40:34 ad Exp $ */
/*-
- * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
+ * Copyright (c) 1998, 1999, 2000, 2019 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -67,7 +67,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.354 2019/04/05 14:12:14 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.355 2019/11/23 19:40:34 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1866,19 +1866,15 @@ cpu_setmcontext(struct lwp *l, const mco
* or after the current trap/syscall if in system mode.
*/
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
+ if ((flags & RESCHED_IDLE) == 0) {
+ if ((flags & RESCHED_REMOTE) != 0) {
#if defined(MULTIPROCESSOR)
- bool immed = (flags & RESCHED_IMMED) != 0;
+ alpha_send_ipi(ci->ci_cpuid, ALPHA_IPI_AST);
#endif /* defined(MULTIPROCESSOR) */
-
- aston(ci->ci_data.cpu_onproc);
- ci->ci_want_resched = 1;
- if (ci->ci_data.cpu_onproc != ci->ci_data.cpu_idlelwp) {
-#if defined(MULTIPROCESSOR)
- if (immed && ci != curcpu()) {
- alpha_send_ipi(ci->ci_cpuid, 0);
+ } else {
+ aston(l);
}
-#endif /* defined(MULTIPROCESSOR) */
}
}
Index: src/sys/arch/amiga/include/cpu.h
diff -u src/sys/arch/amiga/include/cpu.h:1.82 src/sys/arch/amiga/include/cpu.h:1.83
--- src/sys/arch/amiga/include/cpu.h:1.82 Wed Aug 22 01:05:21 2018
+++ src/sys/arch/amiga/include/cpu.h Sat Nov 23 19:40:34 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.82 2018/08/22 01:05:21 msaitoh Exp $ */
+/* $NetBSD: cpu.h,v 1.83 2019/11/23 19:40:34 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -77,9 +77,8 @@ struct clockframe {
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
setsoftast(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/arm/arm/arm_machdep.c
diff -u src/sys/arch/arm/arm/arm_machdep.c:1.55 src/sys/arch/arm/arm/arm_machdep.c:1.56
--- src/sys/arch/arm/arm/arm_machdep.c:1.55 Sat Apr 6 03:06:24 2019
+++ src/sys/arch/arm/arm/arm_machdep.c Sat Nov 23 19:40:34 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: arm_machdep.c,v 1.55 2019/04/06 03:06:24 thorpej Exp $ */
+/* $NetBSD: arm_machdep.c,v 1.56 2019/11/23 19:40:34 ad Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
#include <sys/param.h>
-__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.55 2019/04/06 03:06:24 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.56 2019/11/23 19:40:34 ad Exp $");
#include <sys/exec.h>
#include <sys/proc.h>
@@ -223,67 +223,38 @@ startlwp(void *arg)
}
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
- struct lwp * const l = ci->ci_data.cpu_onproc;
- const bool immed = (flags & RESCHED_IMMED) != 0;
-#ifdef MULTIPROCESSOR
- struct cpu_info * const cur_ci = curcpu();
- u_long ipi = IPI_NOP;
-#endif
-
- if (__predict_false((l->l_pflag & LP_INTR) != 0)) {
- /*
- * No point doing anything, it will switch soon.
- * Also here to prevent an assertion failure in
- * kpreempt() due to preemption being set on a
- * soft interrupt LWP.
- */
- return;
- }
- if (ci->ci_want_resched && !immed)
- return;
- if (l == ci->ci_data.cpu_idlelwp) {
+ if (flags & RESCHED_IDLE) {
#ifdef MULTIPROCESSOR
/*
* If the other CPU is idling, it must be waiting for an
* event. So give it one.
*/
- if (ci != cur_ci)
- goto send_ipi;
+ if (flags & RESCHED_REMOTE) {
+ intr_ipi_send(ci->ci_kcpuset, IPI_NOP);
+ }
#endif
return;
}
-#ifdef MULTIPROCESSOR
- atomic_swap_uint(&ci->ci_want_resched, 1);
-#else
- ci->ci_want_resched = 1;
-#endif
if (flags & RESCHED_KPREEMPT) {
#ifdef __HAVE_PREEMPTION
- atomic_or_uint(&l->l_dopreempt, DOPREEMPT_ACTIVE);
- if (ci == cur_ci) {
- atomic_or_uint(&ci->ci_astpending, __BIT(1));
+ if (flags & RESCHED_REMOTE) {
+ intr_ipi_send(ci->ci_kcpuset, IPI_KPREEMPT);
} else {
- ipi = IPI_KPREEMPT;
- goto send_ipi;
+ atomic_or_uint(&ci->ci_astpending, __BIT(1));
}
#endif /* __HAVE_PREEMPTION */
return;
}
+ if (flags & RESCHED_REMOTE) {
#ifdef MULTIPROCESSOR
- if (ci == cur_ci || !immed) {
+ intr_ipi_send(ci->ci_kcpuset, IPI_AST);
+#endif /* MULTIPROCESSOR */
+ } else {
setsoftast(ci);
- return;
}
- ipi = IPI_AST;
-
- send_ipi:
- intr_ipi_send(ci->ci_kcpuset, ipi);
-#else
- setsoftast(ci);
-#endif /* MULTIPROCESSOR */
}
bool
@@ -312,14 +283,6 @@ arm_curcpu(void)
#endif
#ifdef __HAVE_PREEMPTION
-void
-cpu_set_curpri(int pri)
-{
- kpreempt_disable();
- curcpu()->ci_schedstate.spc_curpriority = pri;
- kpreempt_enable();
-}
-
bool
cpu_kpreempt_enter(uintptr_t where, int s)
{
Index: src/sys/arch/arm/arm32/genassym.cf
diff -u src/sys/arch/arm/arm32/genassym.cf:1.80 src/sys/arch/arm/arm32/genassym.cf:1.81
--- src/sys/arch/arm/arm32/genassym.cf:1.80 Thu Oct 18 09:01:52 2018
+++ src/sys/arch/arm/arm32/genassym.cf Sat Nov 23 19:40:34 2019
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.80 2018/10/18 09:01:52 skrll Exp $
+# $NetBSD: genassym.cf,v 1.81 2019/11/23 19:40:34 ad Exp $
# Copyright (c) 1982, 1990 The Regents of the University of California.
# All rights reserved.
@@ -225,7 +225,6 @@ define CI_ARM_CPUID offsetof(struct cpu
define CI_CURLWP offsetof(struct cpu_info, ci_curlwp)
define CI_CPL offsetof(struct cpu_info, ci_cpl)
define CI_ASTPENDING offsetof(struct cpu_info, ci_astpending)
-define CI_WANT_RESCHED offsetof(struct cpu_info, ci_want_resched)
define CI_INTR_DEPTH offsetof(struct cpu_info, ci_intr_depth)
define CI_MTX_COUNT offsetof(struct cpu_info, ci_mtx_count)
define CI_UNDEFSAVE offsetof(struct cpu_info, ci_undefsave[0])
Index: src/sys/arch/atari/include/cpu.h
diff -u src/sys/arch/atari/include/cpu.h:1.72 src/sys/arch/atari/include/cpu.h:1.73
--- src/sys/arch/atari/include/cpu.h:1.72 Mon Feb 18 01:12:22 2019
+++ src/sys/arch/atari/include/cpu.h Sat Nov 23 19:40:34 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.72 2019/02/18 01:12:22 thorpej Exp $ */
+/* $NetBSD: cpu.h,v 1.73 2019/11/23 19:40:34 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -85,9 +85,8 @@ struct clockframe {
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
setsoftast(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/cesfic/include/cpu.h
diff -u src/sys/arch/cesfic/include/cpu.h:1.32 src/sys/arch/cesfic/include/cpu.h:1.33
--- src/sys/arch/cesfic/include/cpu.h:1.32 Mon Feb 18 01:12:22 2019
+++ src/sys/arch/cesfic/include/cpu.h Sat Nov 23 19:40:34 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.32 2019/02/18 01:12:22 thorpej Exp $ */
+/* $NetBSD: cpu.h,v 1.33 2019/11/23 19:40:34 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -79,9 +79,8 @@ struct clockframe {
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
aston(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/evbcf/include/cpu.h
diff -u src/sys/arch/evbcf/include/cpu.h:1.4 src/sys/arch/evbcf/include/cpu.h:1.5
--- src/sys/arch/evbcf/include/cpu.h:1.4 Wed Aug 22 01:05:22 2018
+++ src/sys/arch/evbcf/include/cpu.h Sat Nov 23 19:40:35 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.4 2018/08/22 01:05:22 msaitoh Exp $ */
+/* $NetBSD: cpu.h,v 1.5 2019/11/23 19:40:35 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -86,8 +86,8 @@ extern volatile unsigned int interrupt_d
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci, flags) \
- do { ci->ci_want_resched++; aston(); } while (/* CONSTCOND */0)
+#define cpu_need_resched(ci,l,flags) \
+ do { aston(); } while (/* CONSTCOND */0)
/*
* Give a profiling tick to the current process when the user profiling
Index: src/sys/arch/hp300/include/cpu.h
diff -u src/sys/arch/hp300/include/cpu.h:1.71 src/sys/arch/hp300/include/cpu.h:1.72
--- src/sys/arch/hp300/include/cpu.h:1.71 Mon Feb 18 01:12:23 2019
+++ src/sys/arch/hp300/include/cpu.h Sat Nov 23 19:40:35 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.71 2019/02/18 01:12:23 thorpej Exp $ */
+/* $NetBSD: cpu.h,v 1.72 2019/11/23 19:40:35 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -88,9 +88,8 @@ struct clockframe {
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
aston(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/hppa/hppa/hppa_machdep.c
diff -u src/sys/arch/hppa/hppa/hppa_machdep.c:1.29 src/sys/arch/hppa/hppa/hppa_machdep.c:1.30
--- src/sys/arch/hppa/hppa/hppa_machdep.c:1.29 Mon Feb 24 07:23:43 2014
+++ src/sys/arch/hppa/hppa/hppa_machdep.c Sat Nov 23 19:40:35 2019
@@ -1,7 +1,7 @@
-/* $NetBSD: hppa_machdep.c,v 1.29 2014/02/24 07:23:43 skrll Exp $ */
+/* $NetBSD: hppa_machdep.c,v 1.30 2019/11/23 19:40:35 ad Exp $ */
/*-
- * Copyright (c) 1997 The NetBSD Foundation, Inc.
+ * Copyright (c) 1997, 2019 The NetBSD Foundation, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hppa_machdep.c,v 1.29 2014/02/24 07:23:43 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hppa_machdep.c,v 1.30 2019/11/23 19:40:35 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -292,20 +292,14 @@ hppa_ras(struct lwp *l)
* or after the current trap/syscall if in system mode.
*/
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
- bool immed = (flags & RESCHED_IMMED) != 0;
-
- if (ci->ci_want_resched && !immed)
- return;
- ci->ci_want_resched = 1;
- setsoftast(ci->ci_data.cpu_onproc);
+ if ((flags & RESCHED_REMOTE) != 0) {
#ifdef MULTIPROCESSOR
- if (ci->ci_curlwp != ci->ci_data.cpu_idlelwp) {
- if (immed && ci != curcpu()) {
- /* XXX send IPI */
- }
- }
+ /* XXX send IPI */
#endif
+ } else {
+ setsoftast(l);
+ }
}
Index: src/sys/arch/ia64/include/cpu.h
diff -u src/sys/arch/ia64/include/cpu.h:1.17 src/sys/arch/ia64/include/cpu.h:1.18
--- src/sys/arch/ia64/include/cpu.h:1.17 Thu Jan 10 17:05:56 2019
+++ src/sys/arch/ia64/include/cpu.h Sat Nov 23 19:40:35 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.17 2019/01/10 17:05:56 scole Exp $ */
+/* $NetBSD: cpu.h,v 1.18 2019/11/23 19:40:35 ad Exp $ */
/*-
* Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -136,7 +136,7 @@ extern struct cpu_info *cpu_info_list;
#define aston(l) ((l)->l_md.md_astpending = 1)
-#define need_resched(ci) /*XXX: FIXME */
+#define need_resched(ci,l,f) /*XXX: FIXME */
struct clockframe {
struct trapframe cf_tf;
@@ -165,7 +165,7 @@ struct clockframe {
#define cpu_signotify(l) aston(l)
// void cpu_need_resched(struct cpu_info *ci, int flags)
-#define cpu_need_resched(ci, f) do { \
+#define cpu_need_resched(ci, l, f) do { \
__USE(ci); \
__USE(f); \
} while(/*CONSTCOND*/0)
Index: src/sys/arch/luna68k/include/cpu.h
diff -u src/sys/arch/luna68k/include/cpu.h:1.36 src/sys/arch/luna68k/include/cpu.h:1.37
--- src/sys/arch/luna68k/include/cpu.h:1.36 Mon Feb 18 01:12:23 2019
+++ src/sys/arch/luna68k/include/cpu.h Sat Nov 23 19:40:35 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.36 2019/02/18 01:12:23 thorpej Exp $ */
+/* $NetBSD: cpu.h,v 1.37 2019/11/23 19:40:35 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -80,9 +80,8 @@ struct clockframe {
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
aston(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/mac68k/include/cpu.h
diff -u src/sys/arch/mac68k/include/cpu.h:1.101 src/sys/arch/mac68k/include/cpu.h:1.102
--- src/sys/arch/mac68k/include/cpu.h:1.101 Mon Feb 18 01:12:23 2019
+++ src/sys/arch/mac68k/include/cpu.h Sat Nov 23 19:40:35 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.101 2019/02/18 01:12:23 thorpej Exp $ */
+/* $NetBSD: cpu.h,v 1.102 2019/11/23 19:40:35 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -99,9 +99,8 @@ struct clockframe {
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
aston(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/mips/mips/cpu_subr.c
diff -u src/sys/arch/mips/mips/cpu_subr.c:1.35 src/sys/arch/mips/mips/cpu_subr.c:1.36
--- src/sys/arch/mips/mips/cpu_subr.c:1.35 Thu Nov 21 19:57:23 2019
+++ src/sys/arch/mips/mips/cpu_subr.c Sat Nov 23 19:40:35 2019
@@ -1,7 +1,7 @@
-/* $NetBSD: cpu_subr.c,v 1.35 2019/11/21 19:57:23 ad Exp $ */
+/* $NetBSD: cpu_subr.c,v 1.36 2019/11/23 19:40:35 ad Exp $ */
/*-
- * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * Copyright (c) 2010, 2019 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: cpu_subr.c,v 1.35 2019/11/21 19:57:23 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu_subr.c,v 1.36 2019/11/23 19:40:35 ad Exp $");
#include "opt_cputype.h"
#include "opt_ddb.h"
@@ -481,62 +481,27 @@ cpu_setmcontext(struct lwp *l, const mco
}
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
- struct lwp * const l = ci->ci_data.cpu_onproc;
-#ifdef MULTIPROCESSOR
- struct cpu_info * const cur_ci = curcpu();
-#endif
-
KASSERT(kpreempt_disabled());
- ci->ci_want_resched |= flags;
-
- if (__predict_false((l->l_pflag & LP_INTR) != 0)) {
- /*
- * No point doing anything, it will switch soon.
- * Also here to prevent an assertion failure in
- * kpreempt() due to preemption being set on a
- * soft interrupt LWP.
- */
- return;
- }
-
- if (__predict_false(l == ci->ci_data.cpu_idlelwp)) {
-#ifdef MULTIPROCESSOR
- /*
- * If the other CPU is idling, it must be waiting for an
- * interrupt. So give it one.
- */
- if (__predict_false(ci != cur_ci))
- cpu_send_ipi(ci, IPI_NOP);
-#endif
- return;
- }
-
-#ifdef MULTIPROCESSOR
- atomic_or_uint(&ci->ci_want_resched, flags);
-#else
- ci->ci_want_resched |= flags;
-#endif
-
- if (flags & RESCHED_KPREEMPT) {
+ if ((flags & RESCHED_KPREEMPT) != 0) {
#ifdef __HAVE_PREEMPTION
- atomic_or_uint(&l->l_dopreempt, DOPREEMPT_ACTIVE);
- if (ci == cur_ci) {
- softint_trigger(SOFTINT_KPREEMPT);
- } else {
+ if ((flags & RESCHED_REMOTE) != 0) {
cpu_send_ipi(ci, IPI_KPREEMPT);
+ } else {
+ softint_trigger(SOFTINT_KPREEMPT);
}
#endif
return;
}
- l->l_md.md_astpending = 1; /* force call to ast() */
+ if ((flags & RESSCHED_REMOTE) != 0) {
#ifdef MULTIPROCESSOR
- if (ci != cur_ci && (flags & RESCHED_IMMED)) {
cpu_send_ipi(ci, IPI_AST);
- }
#endif
+ } else {
+ l->l_md.md_astpending = 1; /* force call to ast() */
+ }
}
uint32_t
@@ -552,9 +517,14 @@ cpu_signotify(struct lwp *l)
#ifdef __HAVE_FAST_SOFTINTS
KASSERT(lwp_locked(l, NULL));
#endif
- KASSERT(l->l_stat == LSONPROC || l->l_stat == LSRUN || l->l_stat == LSSTOP);
- l->l_md.md_astpending = 1; /* force call to ast() */
+ if (l->l_cpu != curcpu()) {
+#ifdef MULTIPROCESSOR
+ cpu_send_ipi(l->l_cpu, IPI_AST);
+#endif
+ } else {
+ l->l_md.md_astpending = 1; /* force call to ast() */
+ }
}
void
Index: src/sys/arch/mips/mips/ipifuncs.c
diff -u src/sys/arch/mips/mips/ipifuncs.c:1.11 src/sys/arch/mips/mips/ipifuncs.c:1.12
--- src/sys/arch/mips/mips/ipifuncs.c:1.11 Fri Jun 26 22:29:38 2015
+++ src/sys/arch/mips/mips/ipifuncs.c Sat Nov 23 19:40:35 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: ipifuncs.c,v 1.11 2015/06/26 22:29:38 matt Exp $ */
+/* $NetBSD: ipifuncs.c,v 1.12 2019/11/23 19:40:35 ad Exp $ */
/*-
* Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include "opt_ddb.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.11 2015/06/26 22:29:38 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.12 2019/11/23 19:40:35 ad Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
@@ -74,6 +74,12 @@ ipi_nop(struct cpu_info *ci)
}
static void
+ipi_ast(struct cpu_info *ci)
+{
+ ci->ci_data.cpu_onproc->l_md.md_astpending = 1;
+}
+
+static void
ipi_shootdown(struct cpu_info *ci)
{
pmap_tlb_shootdown_process();
@@ -120,7 +126,7 @@ ipi_process(struct cpu_info *ci, uint64_
}
if (ipi_mask & __BIT(IPI_AST)) {
ci->ci_evcnt_per_ipi[IPI_AST].ev_count++;
- ipi_nop(ci);
+ ipi_ast(ci);
}
if (ipi_mask & __BIT(IPI_SHOOTDOWN)) {
ci->ci_evcnt_per_ipi[IPI_SHOOTDOWN].ev_count++;
Index: src/sys/arch/mvme68k/include/cpu.h
diff -u src/sys/arch/mvme68k/include/cpu.h:1.50 src/sys/arch/mvme68k/include/cpu.h:1.51
--- src/sys/arch/mvme68k/include/cpu.h:1.50 Wed Aug 22 01:05:22 2018
+++ src/sys/arch/mvme68k/include/cpu.h Sat Nov 23 19:40:35 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.50 2018/08/22 01:05:22 msaitoh Exp $ */
+/* $NetBSD: cpu.h,v 1.51 2019/11/23 19:40:35 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -86,9 +86,8 @@ extern volatile unsigned int interrupt_d
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
aston(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/news68k/include/cpu.h
diff -u src/sys/arch/news68k/include/cpu.h:1.45 src/sys/arch/news68k/include/cpu.h:1.46
--- src/sys/arch/news68k/include/cpu.h:1.45 Mon Feb 18 01:12:24 2019
+++ src/sys/arch/news68k/include/cpu.h Sat Nov 23 19:40:35 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.45 2019/02/18 01:12:24 thorpej Exp $ */
+/* $NetBSD: cpu.h,v 1.46 2019/11/23 19:40:35 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -104,9 +104,8 @@ struct clockframe {
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
aston(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/next68k/include/cpu.h
diff -u src/sys/arch/next68k/include/cpu.h:1.49 src/sys/arch/next68k/include/cpu.h:1.50
--- src/sys/arch/next68k/include/cpu.h:1.49 Mon Feb 18 01:12:24 2019
+++ src/sys/arch/next68k/include/cpu.h Sat Nov 23 19:40:36 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.49 2019/02/18 01:12:24 thorpej Exp $ */
+/* $NetBSD: cpu.h,v 1.50 2019/11/23 19:40:36 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -90,9 +90,8 @@ extern volatile unsigned int interrupt_d
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
aston(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/powerpc/booke/e500_intr.c
diff -u src/sys/arch/powerpc/booke/e500_intr.c:1.38 src/sys/arch/powerpc/booke/e500_intr.c:1.39
--- src/sys/arch/powerpc/booke/e500_intr.c:1.38 Sun Sep 16 09:25:47 2018
+++ src/sys/arch/powerpc/booke/e500_intr.c Sat Nov 23 19:40:36 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: e500_intr.c,v 1.38 2018/09/16 09:25:47 skrll Exp $ */
+/* $NetBSD: e500_intr.c,v 1.39 2019/11/23 19:40:36 ad Exp $ */
/*-
* Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -41,7 +41,7 @@
#define __INTR_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: e500_intr.c,v 1.38 2018/09/16 09:25:47 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: e500_intr.c,v 1.39 2019/11/23 19:40:36 ad Exp $");
#include <sys/param.h>
#include <sys/proc.h>
@@ -1335,6 +1335,12 @@ e500_ipi_suspend(void)
#endif /* MULTIPROCESSOR */
}
+static void
+e500_ipi_ast(void)
+{
+ curcpu()->ci_data.cpu_onproc->l_md.md_astpending = 1;
+}
+
static const ipifunc_t e500_ipifuncs[] = {
[ilog2(IPI_XCALL)] = xc_ipi_handler,
[ilog2(IPI_GENERIC)] = ipi_cpu_handler,
@@ -1344,6 +1350,7 @@ static const ipifunc_t e500_ipifuncs[] =
#endif
[ilog2(IPI_TLB1SYNC)] = e500_tlb1_sync,
[ilog2(IPI_SUSPEND)] = e500_ipi_suspend,
+ [ilog2(IPI_AST)] = e500_ipi_ast,
};
static int
Index: src/sys/arch/powerpc/include/cpu.h
diff -u src/sys/arch/powerpc/include/cpu.h:1.108 src/sys/arch/powerpc/include/cpu.h:1.109
--- src/sys/arch/powerpc/include/cpu.h:1.108 Wed Aug 22 01:05:23 2018
+++ src/sys/arch/powerpc/include/cpu.h Sat Nov 23 19:40:36 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.108 2018/08/22 01:05:23 msaitoh Exp $ */
+/* $NetBSD: cpu.h,v 1.109 2019/11/23 19:40:36 ad Exp $ */
/*
* Copyright (C) 1999 Wolfgang Solfrank.
@@ -434,10 +434,8 @@ vaddr_t cpu_lwp_pc(struct lwp *);
void cpu_ast(struct lwp *, struct cpu_info *);
void * cpu_uarea_alloc(bool);
bool cpu_uarea_free(void *);
-void cpu_need_resched(struct cpu_info *, int);
void cpu_signotify(struct lwp *);
void cpu_need_proftick(struct lwp *);
-#define cpu_did_resched(l) ((l)->l_md.md_astpending = 0)
void cpu_fixup_stubs(void);
Index: src/sys/arch/powerpc/include/booke/intr.h
diff -u src/sys/arch/powerpc/include/booke/intr.h:1.11 src/sys/arch/powerpc/include/booke/intr.h:1.12
--- src/sys/arch/powerpc/include/booke/intr.h:1.11 Thu Apr 19 21:50:07 2018
+++ src/sys/arch/powerpc/include/booke/intr.h Sat Nov 23 19:40:36 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.h,v 1.11 2018/04/19 21:50:07 christos Exp $ */
+/* $NetBSD: intr.h,v 1.12 2019/11/23 19:40:36 ad Exp $ */
/*-
* Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -75,6 +75,7 @@
#define IPI_TLB1SYNC 0x0008
#define IPI_GENERIC 0x0010
#define IPI_SUSPEND 0x0020
+#define IPI_AST 0x0040
#define __HAVE_FAST_SOFTINTS 1
#define SOFTINT_KPREEMPT SOFTINT_COUNT
Index: src/sys/arch/powerpc/powerpc/genassym.cf
diff -u src/sys/arch/powerpc/powerpc/genassym.cf:1.10 src/sys/arch/powerpc/powerpc/genassym.cf:1.11
--- src/sys/arch/powerpc/powerpc/genassym.cf:1.10 Fri Aug 30 21:29:29 2013
+++ src/sys/arch/powerpc/powerpc/genassym.cf Sat Nov 23 19:40:36 2019
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.10 2013/08/30 21:29:29 matt Exp $
+# $NetBSD: genassym.cf,v 1.11 2019/11/23 19:40:36 ad Exp $
#-
# Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
@@ -163,7 +163,6 @@ define CI_SIZE sizeof(struct cpu_info)
define CI_CURLWP offsetof(struct cpu_info, ci_curlwp)
define CI_CURPCB offsetof(struct cpu_info, ci_curpcb)
define CI_CURPM offsetof(struct cpu_info, ci_curpm)
-define CI_WANT_RESCHED offsetof(struct cpu_info, ci_want_resched)
define CI_CPL offsetof(struct cpu_info, ci_cpl)
define CI_IDEPTH offsetof(struct cpu_info, ci_idepth)
define CI_IDLESPIN offsetof(struct cpu_info, ci_idlespin)
Index: src/sys/arch/powerpc/powerpc/powerpc_machdep.c
diff -u src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.73 src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.74
--- src/sys/arch/powerpc/powerpc/powerpc_machdep.c:1.73 Thu Nov 21 19:57:24 2019
+++ src/sys/arch/powerpc/powerpc/powerpc_machdep.c Sat Nov 23 19:40:36 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: powerpc_machdep.c,v 1.73 2019/11/21 19:57:24 ad Exp $ */
+/* $NetBSD: powerpc_machdep.c,v 1.74 2019/11/23 19:40:36 ad Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: powerpc_machdep.c,v 1.73 2019/11/21 19:57:24 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: powerpc_machdep.c,v 1.74 2019/11/23 19:40:36 ad Exp $");
#include "opt_altivec.h"
#include "opt_ddb.h"
@@ -381,60 +381,27 @@ cpu_ast(struct lwp *l, struct cpu_info *
}
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
- struct lwp * const l = ci->ci_data.cpu_onproc;
-#if defined(MULTIPROCESSOR)
- struct cpu_info * const cur_ci = curcpu();
-#endif
-
KASSERT(kpreempt_disabled());
-#ifdef MULTIPROCESSOR
- atomic_or_uint(&ci->ci_want_resched, flags);
-#else
- ci->ci_want_resched |= flags;
-#endif
-
- if (__predict_false((l->l_pflag & LP_INTR) != 0)) {
- /*
- * No point doing anything, it will switch soon.
- * Also here to prevent an assertion failure in
- * kpreempt() due to preemption being set on a
- * soft interrupt LWP.
- */
- return;
- }
-
- if (__predict_false(l == ci->ci_data.cpu_idlelwp)) {
-#if defined(MULTIPROCESSOR)
- /*
- * If the other CPU is idling, it must be waiting for an
- * interrupt. So give it one.
- */
- if (__predict_false(ci != cur_ci))
- cpu_send_ipi(cpu_index(ci), IPI_NOMESG);
-#endif
- return;
- }
-
#ifdef __HAVE_PREEMPTION
- if (flags & RESCHED_KPREEMPT) {
- atomic_or_uint(&l->l_dopreempt, DOPREEMPT_ACTIVE);
- if (ci == cur_ci) {
- softint_trigger(SOFTINT_KPREEMPT);
- } else {
+ if ((flags & RESCHED_KPREEMPT) != 0) {
+ if ((flags & RESCHED_REMOTE) != 0) {
cpu_send_ipi(cpu_index(ci), IPI_KPREEMPT);
+ } else {
+ softint_trigger(SOFTINT_KPREEMPT);
}
return;
}
#endif
- l->l_md.md_astpending = 1; /* force call to ast() */
+ if ((flags & RESCHED_REMOTE) != 0) {
#if defined(MULTIPROCESSOR)
- if (ci != cur_ci && (flags & RESCHED_IMMED)) {
- cpu_send_ipi(cpu_index(ci), IPI_NOMESG);
- }
+ cpu_send_ipi(cpu_index(ci), IPI_AST);
#endif
+ } else {
+ l->l_md.md_astpending = 1; /* force call to ast() */
+ }
}
void
@@ -447,7 +414,13 @@ cpu_need_proftick(lwp_t *l)
void
cpu_signotify(lwp_t *l)
{
- l->l_md.md_astpending = 1;
+ if (l->l_cpu != curcpu()) {
+#if defined(MULTIPROCESSOR)
+ cpu_send_ipi(cpu_index(l->l_cpu), IPI_AST);
+#endif
+ } else {
+ l->l_md.md_astpending = 1;
+ }
}
vaddr_t
Index: src/sys/arch/riscv/riscv/genassym.cf
diff -u src/sys/arch/riscv/riscv/genassym.cf:1.5 src/sys/arch/riscv/riscv/genassym.cf:1.6
--- src/sys/arch/riscv/riscv/genassym.cf:1.5 Sun Jun 16 07:42:52 2019
+++ src/sys/arch/riscv/riscv/genassym.cf Sat Nov 23 19:40:36 2019
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.5 2019/06/16 07:42:52 maxv Exp $
+# $NetBSD: genassym.cf,v 1.6 2019/11/23 19:40:36 ad Exp $
#-
# Copyright (c) 2014 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -130,7 +130,6 @@ define CI_IDLELWP offsetof(struct cpu_in
define CI_MTX_COUNT offsetof(struct cpu_info, ci_mtx_count)
define CI_MTX_OLDSPL offsetof(struct cpu_info, ci_mtx_oldspl)
define CI_SOFTINTS offsetof(struct cpu_info, ci_softints)
-define CI_WANT_RESCHED offsetof(struct cpu_info, ci_want_resched)
define FB_A0 offsetof(struct faultbuf, fb_reg[FB_A0])
define FB_RA offsetof(struct faultbuf, fb_reg[FB_RA])
Index: src/sys/arch/riscv/riscv/riscv_machdep.c
diff -u src/sys/arch/riscv/riscv/riscv_machdep.c:1.5 src/sys/arch/riscv/riscv/riscv_machdep.c:1.6
--- src/sys/arch/riscv/riscv/riscv_machdep.c:1.5 Thu Nov 21 19:57:24 2019
+++ src/sys/arch/riscv/riscv/riscv_machdep.c Sat Nov 23 19:40:36 2019
@@ -1,5 +1,5 @@
/*-
- * Copyright (c) 2014 The NetBSD Foundation, Inc.
+ * Copyright (c) 2014, 2019 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -31,7 +31,7 @@
#include "opt_modular.h"
-__RCSID("$NetBSD: riscv_machdep.c,v 1.5 2019/11/21 19:57:24 ad Exp $");
+__RCSID("$NetBSD: riscv_machdep.c,v 1.6 2019/11/23 19:40:36 ad Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -243,62 +243,27 @@ cpu_setmcontext(struct lwp *l, const mco
}
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
- struct lwp * const l = ci->ci_data.cpu_onproc;
-#ifdef MULTIPROCESSOR
- struct cpu_info * const cur_ci = curcpu();
-#endif
-
KASSERT(kpreempt_disabled());
- ci->ci_want_resched |= flags;
-
- if (__predict_false((l->l_pflag & LP_INTR) != 0)) {
- /*
- * No point doing anything, it will switch soon.
- * Also here to prevent an assertion failure in
- * kpreempt() due to preemption being set on a
- * soft interrupt LWP.
- */
- return;
- }
-
- if (__predict_false(l == ci->ci_data.cpu_idlelwp)) {
-#ifdef MULTIPROCESSOR
- /*
- * If the other CPU is idling, it must be waiting for an
- * interrupt. So give it one.
- */
- if (__predict_false(ci != cur_ci))
- cpu_send_ipi(ci, IPI_NOP);
-#endif
- return;
- }
-
-#ifdef MULTIPROCESSOR
- atomic_or_uint(&ci->ci_want_resched, flags);
-#else
- ci->ci_want_resched |= flags;
-#endif
-
- if (flags & RESCHED_KPREEMPT) {
+ if ((flags & RESCHED_KPREEMPT) != 0) {
#ifdef __HAVE_PREEMPTION
- atomic_or_uint(&l->l_dopreempt, DOPREEMPT_ACTIVE);
- if (ci == cur_ci) {
- softint_trigger(SOFTINT_KPREEMPT);
- } else {
+ if ((flags & RESCHED_REMOTE) != 0) {
cpu_send_ipi(ci, IPI_KPREEMPT);
+ } else {
+ softint_trigger(SOFTINT_KPREEMPT);
}
#endif
return;
}
- l->l_md.md_astpending = 1; /* force call to ast() */
+ if ((flags & RESCHED_REMOTE) != 0) {
#ifdef MULTIPROCESSOR
- if (ci != cur_ci && (flags & RESCHED_IMMED)) {
cpu_send_ipi(ci, IPI_AST);
- }
#endif
+ } else {
+ l->l_md.md_astpending = 1; /* force call to ast() */
+ }
}
void
@@ -308,9 +273,14 @@ cpu_signotify(struct lwp *l)
#ifdef __HAVE_FAST_SOFTINTS
KASSERT(lwp_locked(l, NULL));
#endif
- KASSERT(l->l_stat == LSONPROC || l->l_stat == LSRUN || l->l_stat == LSSTOP);
- l->l_md.md_astpending = 1; /* force call to ast() */
+ if (l->l_cpu != curcpu()) {
+#ifdef MULTIPROCESSOR
+ cpu_send_ipi(ci, IPI_AST);
+#endif
+ } else {
+ l->l_md.md_astpending = 1; /* force call to ast() */
+ }
}
void
Index: src/sys/arch/sh3/include/cpu.h
diff -u src/sys/arch/sh3/include/cpu.h:1.57 src/sys/arch/sh3/include/cpu.h:1.58
--- src/sys/arch/sh3/include/cpu.h:1.57 Wed Aug 22 01:05:23 2018
+++ src/sys/arch/sh3/include/cpu.h Sat Nov 23 19:40:36 2019
@@ -1,7 +1,7 @@
-/* $NetBSD: cpu.h,v 1.57 2018/08/22 01:05:23 msaitoh Exp $ */
+/* $NetBSD: cpu.h,v 1.58 2019/11/23 19:40:36 ad Exp $ */
/*-
- * Copyright (c) 2002 The NetBSD Foundation, Inc. All rights reserved.
+ * Copyright (c) 2002, 2019 The NetBSD Foundation, Inc. All rights reserved.
* Copyright (c) 1990 The Regents of the University of California.
* All rights reserved.
*
@@ -99,11 +99,9 @@ struct clockframe {
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci, flags) \
+#define cpu_need_resched(ci,l,flags) \
do { \
- __USE(flags); \
- ci->ci_want_resched = 1; \
- if (curlwp != ci->ci_data.cpu_idlelwp) \
+ if ((flags & RESCHED_IDLE) == 0) \
aston(curlwp); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/sparc/include/cpu.h
diff -u src/sys/arch/sparc/include/cpu.h:1.101 src/sys/arch/sparc/include/cpu.h:1.102
--- src/sys/arch/sparc/include/cpu.h:1.101 Wed Aug 22 01:05:23 2018
+++ src/sys/arch/sparc/include/cpu.h Sat Nov 23 19:40:36 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.101 2018/08/22 01:05:23 msaitoh Exp $ */
+/* $NetBSD: cpu.h,v 1.102 2019/11/23 19:40:36 ad Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -451,13 +451,12 @@ void sparc_softintr_init(void);
* Preempt the current process on the target CPU if in interrupt from
* user mode, or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci, flags) do { \
+#define cpu_need_resched(ci, l, flags) do { \
__USE(flags); \
- (ci)->ci_want_resched = 1; \
(ci)->ci_want_ast = 1; \
\
/* Just interrupt the target CPU, so it can notice its AST */ \
- if (((flags) & RESCHED_IMMED) || (ci)->ci_cpuid != cpu_number()) \
+ if ((flags & RESCHED_REMOTE) != 0) \
XCALL0(sparc_noop, 1U << (ci)->ci_cpuid); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/sparc64/include/cpu.h
diff -u src/sys/arch/sparc64/include/cpu.h:1.126 src/sys/arch/sparc64/include/cpu.h:1.127
--- src/sys/arch/sparc64/include/cpu.h:1.126 Fri Feb 8 20:14:50 2019
+++ src/sys/arch/sparc64/include/cpu.h Sat Nov 23 19:40:36 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.126 2019/02/08 20:14:50 palle Exp $ */
+/* $NetBSD: cpu.h,v 1.127 2019/11/23 19:40:36 ad Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -267,7 +267,6 @@ extern struct pool_cache *fpstate_cache;
#define curpcb curcpu()->ci_cpcb
#define want_ast curcpu()->ci_want_ast
-#define want_resched curcpu()->ci_want_resched
/*
* definitions of cpu-dependent requirements
Index: src/sys/arch/sparc64/sparc64/genassym.cf
diff -u src/sys/arch/sparc64/sparc64/genassym.cf:1.81 src/sys/arch/sparc64/sparc64/genassym.cf:1.82
--- src/sys/arch/sparc64/sparc64/genassym.cf:1.81 Fri Feb 10 23:26:23 2017
+++ src/sys/arch/sparc64/sparc64/genassym.cf Sat Nov 23 19:40:37 2019
@@ -1,4 +1,4 @@
-# $NetBSD: genassym.cf,v 1.81 2017/02/10 23:26:23 palle Exp $
+# $NetBSD: genassym.cf,v 1.82 2019/11/23 19:40:37 ad Exp $
#
# Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -169,7 +169,6 @@ define CI_SPINUP offsetof(struct cpu_inf
define CI_PADDR offsetof(struct cpu_info, ci_paddr)
define CI_CPUID offsetof(struct cpu_info, ci_cpuid)
define CI_WANT_AST offsetof(struct cpu_info, ci_want_ast)
-define CI_WANT_RESCHED offsetof(struct cpu_info, ci_want_resched)
define CI_EINTSTACK offsetof(struct cpu_info, ci_eintstack)
define CI_IDLELWP offsetof(struct cpu_info, ci_data.cpu_idlelwp)
define CI_NFAULT offsetof(struct cpu_info, ci_data.cpu_nfault)
Index: src/sys/arch/sparc64/sparc64/machdep.c
diff -u src/sys/arch/sparc64/sparc64/machdep.c:1.292 src/sys/arch/sparc64/sparc64/machdep.c:1.293
--- src/sys/arch/sparc64/sparc64/machdep.c:1.292 Sun Nov 10 21:16:33 2019
+++ src/sys/arch/sparc64/sparc64/machdep.c Sat Nov 23 19:40:37 2019
@@ -1,7 +1,7 @@
-/* $NetBSD: machdep.c,v 1.292 2019/11/10 21:16:33 chs Exp $ */
+/* $NetBSD: machdep.c,v 1.293 2019/11/23 19:40:37 ad Exp $ */
/*-
- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc.
+ * Copyright (c) 1996, 1997, 1998, 2019 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -71,7 +71,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.292 2019/11/10 21:16:33 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.293 2019/11/23 19:40:37 ad Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
@@ -2622,19 +2622,16 @@ cpu_setmcontext(struct lwp *l, const mco
* or after the current trap/syscall if in system mode.
*/
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
- ci->ci_want_resched = 1;
ci->ci_want_ast = 1;
#ifdef MULTIPROCESSOR
- if (ci == curcpu())
- return;
- /* Just interrupt the target CPU, so it can notice its AST */
- if ((flags & RESCHED_IMMED) != 0 &&
- ci->ci_data.cpu_onproc != ci->ci_data.cpu_idlelwp)
+ if ((flags & RESCHED_REMOTE) != 0) {
+ /* Just interrupt the target CPU, so it can notice its AST */
sparc64_send_ipi(ci->ci_cpuid, sparc64_ipi_nop, 0, 0);
+ }
#endif
}
@@ -2648,8 +2645,9 @@ cpu_signotify(struct lwp *l)
ci->ci_want_ast = 1;
#ifdef MULTIPROCESSOR
- if (ci != curcpu())
+ if (ci != curcpu()) {
sparc64_send_ipi(ci->ci_cpuid, sparc64_ipi_nop, 0, 0);
+ }
#endif
}
Index: src/sys/arch/sun68k/include/cpu.h
diff -u src/sys/arch/sun68k/include/cpu.h:1.24 src/sys/arch/sun68k/include/cpu.h:1.25
--- src/sys/arch/sun68k/include/cpu.h:1.24 Thu Aug 23 04:04:34 2018
+++ src/sys/arch/sun68k/include/cpu.h Sat Nov 23 19:40:37 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.24 2018/08/23 04:04:34 msaitoh Exp $ */
+/* $NetBSD: cpu.h,v 1.25 2019/11/23 19:40:37 ad Exp $ */
/*
* Copyright (c) 1982, 1990 The Regents of the University of California.
@@ -134,7 +134,6 @@ extern int astpending; /* need to trap
*/
#define cpu_need_resched(ci,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
aston(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/usermode/dev/cpu.c
diff -u src/sys/arch/usermode/dev/cpu.c:1.80 src/sys/arch/usermode/dev/cpu.c:1.81
--- src/sys/arch/usermode/dev/cpu.c:1.80 Fri Jun 1 07:26:15 2018
+++ src/sys/arch/usermode/dev/cpu.c Sat Nov 23 19:40:37 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.80 2018/06/01 07:26:15 reinoud Exp $ */
+/* $NetBSD: cpu.c,v 1.81 2019/11/23 19:40:37 ad Exp $ */
/*-
* Copyright (c) 2007 Jared D. McNeill <[email protected]>
@@ -30,7 +30,7 @@
#include "opt_hz.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.80 2018/06/01 07:26:15 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.81 2019/11/23 19:40:37 ad Exp $");
#include <sys/param.h>
#include <sys/conf.h>
@@ -182,9 +182,8 @@ cpu_reboot(int howto, char *bootstr)
}
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
- ci->ci_want_resched |= flags;
aston(ci);
}
Index: src/sys/arch/usermode/include/cpu.h
diff -u src/sys/arch/usermode/include/cpu.h:1.11 src/sys/arch/usermode/include/cpu.h:1.12
--- src/sys/arch/usermode/include/cpu.h:1.11 Wed Aug 1 09:50:57 2018
+++ src/sys/arch/usermode/include/cpu.h Sat Nov 23 19:40:37 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.11 2018/08/01 09:50:57 reinoud Exp $ */
+/* $NetBSD: cpu.h,v 1.12 2019/11/23 19:40:37 ad Exp $ */
/*-
* Copyright (c) 2007 Jared D. McNeill <[email protected]>
@@ -46,7 +46,6 @@ extern void userret(struct lwp *);
struct cpu_info;
extern int astpending;
#define aston(ci) (astpending++)
-extern void cpu_need_resched(struct cpu_info *ci, int flags);
extern void kgdb_port_init(void);
struct cpu_info {
Index: src/sys/arch/vax/include/cpu.h
diff -u src/sys/arch/vax/include/cpu.h:1.102 src/sys/arch/vax/include/cpu.h:1.103
--- src/sys/arch/vax/include/cpu.h:1.102 Wed Aug 22 01:05:23 2018
+++ src/sys/arch/vax/include/cpu.h Sat Nov 23 19:40:37 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.102 2018/08/22 01:05:23 msaitoh Exp $ */
+/* $NetBSD: cpu.h,v 1.103 2019/11/23 19:40:37 ad Exp $ */
/*
* Copyright (c) 1994 Ludd, University of Lule}, Sweden
@@ -151,10 +151,9 @@ extern int cpu_printfataltraps;
#define curcpu() (curlwp->l_cpu + 0)
#define curlwp ((struct lwp *)mfpr(PR_SSP))
#define cpu_number() (curcpu()->ci_cpuid)
-#define cpu_need_resched(ci, flags) \
+#define cpu_need_resched(ci, l, flags) \
do { \
__USE(flags); \
- (ci)->ci_want_resched = 1; \
mtpr(AST_OK,PR_ASTLVL); \
} while (/*CONSTCOND*/ 0)
#define cpu_proc_fork(x, y) do { } while (/*CONSCOND*/0)
Index: src/sys/arch/x68k/include/cpu.h
diff -u src/sys/arch/x68k/include/cpu.h:1.61 src/sys/arch/x68k/include/cpu.h:1.62
--- src/sys/arch/x68k/include/cpu.h:1.61 Mon Feb 18 01:12:24 2019
+++ src/sys/arch/x68k/include/cpu.h Sat Nov 23 19:40:37 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.61 2019/02/18 01:12:24 thorpej Exp $ */
+/* $NetBSD: cpu.h,v 1.62 2019/11/23 19:40:37 ad Exp $ */
/*
* Copyright (c) 1988 University of Utah.
@@ -88,9 +88,8 @@ struct clockframe {
* Preempt the current process if in interrupt from user mode,
* or after the current trap/syscall if in system mode.
*/
-#define cpu_need_resched(ci,flags) do { \
+#define cpu_need_resched(ci,l,flags) do { \
__USE(flags); \
- ci->ci_want_resched = 1; \
aston(); \
} while (/*CONSTCOND*/0)
Index: src/sys/arch/x86/include/cpu.h
diff -u src/sys/arch/x86/include/cpu.h:1.112 src/sys/arch/x86/include/cpu.h:1.113
--- src/sys/arch/x86/include/cpu.h:1.112 Thu Nov 21 21:48:33 2019
+++ src/sys/arch/x86/include/cpu.h Sat Nov 23 19:40:37 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.h,v 1.112 2019/11/21 21:48:33 ad Exp $ */
+/* $NetBSD: cpu.h,v 1.113 2019/11/23 19:40:37 ad Exp $ */
/*
* Copyright (c) 1990 The Regents of the University of California.
@@ -384,11 +384,7 @@ lwp_t *x86_curlwp(void);
#define CPU_IS_PRIMARY(ci) ((ci)->ci_flags & CPUF_PRIMARY)
-#define X86_AST_GENERIC 0x01
-#define X86_AST_PREEMPT 0x02
-
-#define aston(l, why) ((l)->l_md.md_astpending |= (why))
-#define cpu_did_resched(l) ((l)->l_md.md_astpending &= ~X86_AST_PREEMPT)
+#define aston(l) ((l)->l_md.md_astpending = 1)
void cpu_boot_secondary_processors(void);
void cpu_init_idle_lwps(void);
Index: src/sys/arch/x86/include/intrdefs.h
diff -u src/sys/arch/x86/include/intrdefs.h:1.22 src/sys/arch/x86/include/intrdefs.h:1.23
--- src/sys/arch/x86/include/intrdefs.h:1.22 Fri Feb 15 08:54:01 2019
+++ src/sys/arch/x86/include/intrdefs.h Sat Nov 23 19:40:37 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: intrdefs.h,v 1.22 2019/02/15 08:54:01 nonaka Exp $ */
+/* $NetBSD: intrdefs.h,v 1.23 2019/11/23 19:40:37 ad Exp $ */
#ifndef _X86_INTRDEFS_H_
#define _X86_INTRDEFS_H_
@@ -60,7 +60,7 @@
#ifndef XENPV
#define X86_IPI_HALT 0x00000001
-#define X86_IPI_MICROSET 0x00000002
+#define X86_IPI_AST 0x00000002
#define X86_IPI_GENERIC 0x00000004
#define X86_IPI_SYNCH_FPU 0x00000008
#define X86_IPI_MTRR 0x00000010
@@ -71,7 +71,7 @@
#define X86_NIPI 9
-#define X86_IPI_NAMES { "halt IPI", "timeset IPI", "generic IPI", \
+#define X86_IPI_NAMES { "halt IPI", "AST IPI", "generic IPI", \
"FPU synch IPI", "MTRR update IPI", \
"GDT update IPI", "xcall IPI", \
"ACPI CPU sleep IPI", "kpreempt IPI" }
Index: src/sys/arch/x86/x86/cpu.c
diff -u src/sys/arch/x86/x86/cpu.c:1.175 src/sys/arch/x86/x86/cpu.c:1.176
--- src/sys/arch/x86/x86/cpu.c:1.175 Fri Nov 22 23:36:25 2019
+++ src/sys/arch/x86/x86/cpu.c Sat Nov 23 19:40:37 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.175 2019/11/22 23:36:25 ad Exp $ */
+/* $NetBSD: cpu.c,v 1.176 2019/11/23 19:40:37 ad Exp $ */
/*
* Copyright (c) 2000-2012 NetBSD Foundation, Inc.
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.175 2019/11/22 23:36:25 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.176 2019/11/23 19:40:37 ad Exp $");
#include "opt_ddb.h"
#include "opt_mpbios.h" /* for MPDEBUG */
@@ -1348,11 +1348,12 @@ cpu_broadcast_halt(void)
}
/*
- * Send a dummy ipi to a cpu to force it to run splraise()/spllower()
+ * Send a dummy ipi to a cpu to force it to run splraise()/spllower(),
+ * and trigger an AST on the running LWP.
*/
void
cpu_kick(struct cpu_info *ci)
{
- x86_send_ipi(ci, 0);
+ x86_send_ipi(ci, X86_IPI_AST);
}
Index: src/sys/arch/x86/x86/ipi.c
diff -u src/sys/arch/x86/x86/ipi.c:1.28 src/sys/arch/x86/x86/ipi.c:1.29
--- src/sys/arch/x86/x86/ipi.c:1.28 Sat Oct 12 06:31:04 2019
+++ src/sys/arch/x86/x86/ipi.c Sat Nov 23 19:40:37 2019
@@ -1,7 +1,7 @@
-/* $NetBSD: ipi.c,v 1.28 2019/10/12 06:31:04 maxv Exp $ */
+/* $NetBSD: ipi.c,v 1.29 2019/11/23 19:40:37 ad Exp $ */
/*-
- * Copyright (c) 2000, 2008, 2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 2000, 2008, 2009, 2019 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>
-__KERNEL_RCSID(0, "$NetBSD: ipi.c,v 1.28 2019/10/12 06:31:04 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ipi.c,v 1.29 2019/11/23 19:40:37 ad Exp $");
#include "opt_mtrr.h"
@@ -59,6 +59,7 @@ __KERNEL_RCSID(0, "$NetBSD: ipi.c,v 1.28
#include <x86/fpu.h>
+static void x86_ipi_ast(struct cpu_info *);
static void x86_ipi_halt(struct cpu_info *);
static void x86_ipi_kpreempt(struct cpu_info *);
static void x86_ipi_xcall(struct cpu_info *);
@@ -81,7 +82,7 @@ static void x86_ipi_synch_fpu(struct cpu
void (* const ipifunc[X86_NIPI])(struct cpu_info *) =
{
x86_ipi_halt, /* X86_IPI_HALT */
- NULL, /* X86_IPI_MICROSET */
+ x86_ipi_ast, /* X86_IPI_AST */
x86_ipi_generic, /* X86_IPI_GENERIC */
x86_ipi_synch_fpu, /* X86_IPI_SYNCH_FPU */
x86_ipi_reload_mtrr, /* X86_IPI_MTRR */
@@ -98,20 +99,30 @@ void (* const ipifunc[X86_NIPI])(struct
int
x86_send_ipi(struct cpu_info *ci, int ipimask)
{
- int ret;
-
- atomic_or_32(&ci->ci_ipis, ipimask);
+ uint32_t o, n;
+ int ret = 0;
/* Don't send IPI to CPU which isn't (yet) running. */
- if (!(ci->ci_flags & CPUF_RUNNING))
+ if (__predict_false((ci->ci_flags & CPUF_RUNNING) == 0))
return ENOENT;
- ret = x86_ipi(LAPIC_IPI_VECTOR, ci->ci_cpuid, LAPIC_DLMODE_FIXED);
- if (ret != 0) {
- printf("ipi of %x from %s to %s failed\n",
- ipimask,
- device_xname(curcpu()->ci_dev),
- device_xname(ci->ci_dev));
+ /* Set in new IPI bit, and capture previous state. */
+ for (o = 0;; o = n) {
+ n = atomic_cas_32(&ci->ci_ipis, o, o | ipimask);
+ if (__predict_true(o == n)) {
+ break;
+ }
+ }
+
+ /* If no IPI already pending, send one. */
+ if (o == 0) {
+ ret = x86_ipi(LAPIC_IPI_VECTOR, ci->ci_cpuid, LAPIC_DLMODE_FIXED);
+ if (ret != 0) {
+ printf("ipi of %x from %s to %s failed\n",
+ ipimask,
+ device_xname(curcpu()->ci_dev),
+ device_xname(ci->ci_dev));
+ }
}
return ret;
@@ -201,6 +212,13 @@ x86_ipi_kpreempt(struct cpu_info *ci)
softint_trigger(1 << SIR_PREEMPT);
}
+static void
+x86_ipi_ast(struct cpu_info *ci)
+{
+
+ aston(ci->ci_data.cpu_onproc);
+}
+
/*
* MD support for xcall(9) interface.
*/
Index: src/sys/arch/x86/x86/x86_machdep.c
diff -u src/sys/arch/x86/x86/x86_machdep.c:1.128 src/sys/arch/x86/x86/x86_machdep.c:1.129
--- src/sys/arch/x86/x86/x86_machdep.c:1.128 Thu Oct 3 05:06:29 2019
+++ src/sys/arch/x86/x86/x86_machdep.c Sat Nov 23 19:40:37 2019
@@ -1,12 +1,12 @@
-/* $NetBSD: x86_machdep.c,v 1.128 2019/10/03 05:06:29 maxv Exp $ */
+/* $NetBSD: x86_machdep.c,v 1.129 2019/11/23 19:40:37 ad Exp $ */
/*-
* Copyright (c) 2002, 2006, 2007 YAMAMOTO Takashi,
- * Copyright (c) 2005, 2008, 2009 The NetBSD Foundation, Inc.
+ * Copyright (c) 2005, 2008, 2009, 2019 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
- * by Julio M. Merino Vidal.
+ * by Julio M. Merino Vidal, and Andrew Doran.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.128 2019/10/03 05:06:29 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: x86_machdep.c,v 1.129 2019/11/23 19:40:37 ad Exp $");
#include "opt_modular.h"
#include "opt_physmem.h"
@@ -290,53 +290,35 @@ module_init_md(void)
#endif /* MODULAR */
void
-cpu_need_resched(struct cpu_info *ci, int flags)
+cpu_need_resched(struct cpu_info *ci, struct lwp *l, int flags)
{
- struct cpu_info *cur;
- lwp_t *l;
KASSERT(kpreempt_disabled());
- cur = curcpu();
- l = ci->ci_data.cpu_onproc;
- ci->ci_want_resched |= flags;
-
- if (__predict_false((l->l_pflag & LP_INTR) != 0)) {
- /*
- * No point doing anything, it will switch soon.
- * Also here to prevent an assertion failure in
- * kpreempt() due to preemption being set on a
- * soft interrupt LWP.
- */
- return;
- }
- if (l == ci->ci_data.cpu_idlelwp) {
- if (ci == cur)
- return;
- if (x86_cpu_idle_ipi != false) {
+ if ((flags & RESCHED_IDLE) != 0) {
+ if ((flags & RESCHED_REMOTE) != 0 &&
+ x86_cpu_idle_ipi != false) {
cpu_kick(ci);
}
return;
}
- if ((flags & RESCHED_KPREEMPT) != 0) {
#ifdef __HAVE_PREEMPTION
- atomic_or_uint(&l->l_dopreempt, DOPREEMPT_ACTIVE);
- if (ci == cur) {
- softint_trigger(1 << SIR_PREEMPT);
- } else {
+ if ((flags & RESCHED_KPREEMPT) != 0) {
+ if ((flags & RESCHED_REMOTE) != 0) {
x86_send_ipi(ci, X86_IPI_KPREEMPT);
+ } else {
+ softint_trigger(1 << SIR_PREEMPT);
}
return;
-#endif
}
+#endif
- aston(l, X86_AST_PREEMPT);
- if (ci == cur) {
- return;
- }
- if ((flags & RESCHED_IMMED) != 0) {
+ KASSERT((flags & RESCHED_UPREEMPT) != 0);
+ if ((flags & RESCHED_REMOTE) != 0) {
cpu_kick(ci);
+ } else {
+ aston(l);
}
}
@@ -345,9 +327,12 @@ cpu_signotify(struct lwp *l)
{
KASSERT(kpreempt_disabled());
- aston(l, X86_AST_GENERIC);
- if (l->l_cpu != curcpu())
+
+ if (l->l_cpu != curcpu()) {
cpu_kick(l->l_cpu);
+ } else {
+ aston(l);
+ }
}
void
@@ -358,7 +343,7 @@ cpu_need_proftick(struct lwp *l)
KASSERT(l->l_cpu == curcpu());
l->l_pflag |= LP_OWEUPC;
- aston(l, X86_AST_GENERIC);
+ aston(l);
}
bool
@@ -392,7 +377,6 @@ cpu_kpreempt_enter(uintptr_t where, int
*/
if (s > IPL_PREEMPT) {
softint_trigger(1 << SIR_PREEMPT);
- aston(l, X86_AST_PREEMPT); /* paranoid */
return false;
}
Index: src/sys/arch/xen/include/intrdefs.h
diff -u src/sys/arch/xen/include/intrdefs.h:1.13 src/sys/arch/xen/include/intrdefs.h:1.14
--- src/sys/arch/xen/include/intrdefs.h:1.13 Mon Sep 10 05:08:55 2018
+++ src/sys/arch/xen/include/intrdefs.h Sat Nov 23 19:40:38 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: intrdefs.h,v 1.13 2018/09/10 05:08:55 cherry Exp $ */
+/* $NetBSD: intrdefs.h,v 1.14 2019/11/23 19:40:38 ad Exp $ */
/* This file co-exists, and is included via machine/intrdefs.h */
@@ -13,9 +13,10 @@
#define XEN_IPI_XCALL 0x00000008
#define XEN_IPI_HVCB 0x00000010
#define XEN_IPI_GENERIC 0x00000020
+#define XEN_IPI_AST 0x00000040
/* Note: IPI_KICK does not have a handler. */
-#define XEN_NIPIS 6
+#define XEN_NIPIS 7
/* The number of 'irqs' that XEN understands */
#define NUM_XEN_IRQS 256
Index: src/sys/arch/xen/x86/cpu.c
diff -u src/sys/arch/xen/x86/cpu.c:1.130 src/sys/arch/xen/x86/cpu.c:1.131
--- src/sys/arch/xen/x86/cpu.c:1.130 Sat Oct 12 06:31:04 2019
+++ src/sys/arch/xen/x86/cpu.c Sat Nov 23 19:40:38 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: cpu.c,v 1.130 2019/10/12 06:31:04 maxv Exp $ */
+/* $NetBSD: cpu.c,v 1.131 2019/11/23 19:40:38 ad Exp $ */
/*-
* Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -65,7 +65,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.130 2019/10/12 06:31:04 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cpu.c,v 1.131 2019/11/23 19:40:38 ad Exp $");
#include "opt_ddb.h"
#include "opt_multiprocessor.h"
@@ -1271,11 +1271,11 @@ cpu_broadcast_halt(void)
}
/*
- * Send a dummy ipi to a cpu.
+ * Send a dummy ipi to a cpu, and raise an AST on the running LWP.
*/
void
cpu_kick(struct cpu_info *ci)
{
- (void)xen_send_ipi(ci, XEN_IPI_KICK);
+ (void)xen_send_ipi(ci, XEN_IPI_AST);
}
Index: src/sys/arch/xen/x86/xen_ipi.c
diff -u src/sys/arch/xen/x86/xen_ipi.c:1.33 src/sys/arch/xen/x86/xen_ipi.c:1.34
--- src/sys/arch/xen/x86/xen_ipi.c:1.33 Sat Oct 12 06:31:04 2019
+++ src/sys/arch/xen/x86/xen_ipi.c Sat Nov 23 19:40:38 2019
@@ -1,7 +1,7 @@
-/* $NetBSD: xen_ipi.c,v 1.33 2019/10/12 06:31:04 maxv Exp $ */
+/* $NetBSD: xen_ipi.c,v 1.34 2019/11/23 19:40:38 ad Exp $ */
/*-
- * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * Copyright (c) 2011, 2019 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@@ -33,10 +33,10 @@
/*
* Based on: x86/ipi.c
- * __KERNEL_RCSID(0, "$NetBSD: xen_ipi.c,v 1.33 2019/10/12 06:31:04 maxv Exp $");
+ * __KERNEL_RCSID(0, "$NetBSD: xen_ipi.c,v 1.34 2019/11/23 19:40:38 ad Exp $");
*/
-__KERNEL_RCSID(0, "$NetBSD: xen_ipi.c,v 1.33 2019/10/12 06:31:04 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xen_ipi.c,v 1.34 2019/11/23 19:40:38 ad Exp $");
#include "opt_ddb.h"
@@ -71,6 +71,7 @@ static void xen_ipi_synch_fpu(struct cpu
static void xen_ipi_xcall(struct cpu_info *, struct intrframe *);
static void xen_ipi_hvcb(struct cpu_info *, struct intrframe *);
static void xen_ipi_generic(struct cpu_info *, struct intrframe *);
+static void xen_ipi_ast(struct cpu_info *, struct intrframe *);
static void (*ipifunc[XEN_NIPIS])(struct cpu_info *, struct intrframe *) =
{ /* In order of priority (see: xen/include/intrdefs.h */
@@ -84,6 +85,7 @@ static void (*ipifunc[XEN_NIPIS])(struct
xen_ipi_xcall,
xen_ipi_hvcb,
xen_ipi_generic,
+ xen_ipi_ast
};
static int
@@ -152,7 +154,7 @@ valid_ipimask(uint32_t ipimask)
{
uint32_t masks = XEN_IPI_GENERIC | XEN_IPI_HVCB | XEN_IPI_XCALL |
XEN_IPI_DDB | XEN_IPI_SYNCH_FPU |
- XEN_IPI_HALT | XEN_IPI_KICK;
+ XEN_IPI_HALT | XEN_IPI_KICK | XEN_IPI_AST;
if (ipimask & ~masks) {
return false;
@@ -283,6 +285,15 @@ xen_ipi_xcall(struct cpu_info *ci, struc
xc_ipi_handler();
}
+static void
+xen_ipi_ast(struct cpu_info *ci, struct intrframe *intrf)
+{
+ KASSERT(ci != NULL);
+ KASSERT(intrf != NULL);
+
+ aston(ci->ci_data.cpu_onproc);
+}
+
void
xc_send_ipi(struct cpu_info *ci)
{