From b1253edf64680c2d5e8e009712d289cceb05550b Mon Sep 17 00:00:00 2001 From: nakayama Date: Thu, 3 Apr 2008 10:34:45 +0000 Subject: [PATCH] Revise cpu_need_resched and cpu_signotify, then make them like x86's ones. This can avoid sending IPI to myself. --- sys/arch/sparc64/include/cpu.h | 7 +++---- sys/arch/sparc64/sparc64/ipifuncs.c | 5 +++-- sys/arch/sparc64/sparc64/machdep.c | 26 ++++++++++++++++++++++---- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/sys/arch/sparc64/include/cpu.h b/sys/arch/sparc64/include/cpu.h index d294fff0222a..591c873d0245 100644 --- a/sys/arch/sparc64/include/cpu.h +++ b/sys/arch/sparc64/include/cpu.h @@ -1,4 +1,4 @@ -/* $NetBSD: cpu.h,v 1.77 2008/03/17 04:04:00 nakayama Exp $ */ +/* $NetBSD: cpu.h,v 1.78 2008/04/03 10:34:45 nakayama Exp $ */ /* * Copyright (c) 1992, 1993 @@ -288,10 +288,9 @@ void setsoftnet(void); #define cpu_need_proftick(l) ((l)->l_pflag |= LP_OWEUPC, want_ast = 1) /* - * Notify the current process (l) that it has a signal pending, - * process as soon as possible. + * Notify an LWP that it has a signal pending, process as soon as possible. */ -#define cpu_signotify(l) (want_ast = 1) +void cpu_signotify(struct lwp *); /* * Interrupt handler chains. Interrupt handlers should return 0 for diff --git a/sys/arch/sparc64/sparc64/ipifuncs.c b/sys/arch/sparc64/sparc64/ipifuncs.c index e117220f89ba..b433cdb3cdab 100644 --- a/sys/arch/sparc64/sparc64/ipifuncs.c +++ b/sys/arch/sparc64/sparc64/ipifuncs.c @@ -1,4 +1,4 @@ -/* $NetBSD: ipifuncs.c,v 1.19 2008/03/27 15:20:47 martin Exp $ */ +/* $NetBSD: ipifuncs.c,v 1.20 2008/04/03 10:34:46 nakayama Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.19 2008/03/27 15:20:47 martin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ipifuncs.c,v 1.20 2008/04/03 10:34:46 nakayama Exp $"); #include "opt_ddb.h" @@ -200,6 +200,7 @@ sparc64_send_ipi(int upaid, ipifunc_t func, uint64_t arg1, uint64_t arg2) int i, ik; uint64_t intr_func; + KASSERT(upaid != curcpu()->ci_cpuid); if (ldxa(0, ASR_IDSR) & IDSR_BUSY) panic("recursive IPI?"); diff --git a/sys/arch/sparc64/sparc64/machdep.c b/sys/arch/sparc64/sparc64/machdep.c index e28f0c7b51b8..2b5181ab6f79 100644 --- a/sys/arch/sparc64/sparc64/machdep.c +++ b/sys/arch/sparc64/sparc64/machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: machdep.c,v 1.217 2008/03/14 15:39:18 nakayama Exp $ */ +/* $NetBSD: machdep.c,v 1.218 2008/04/03 10:34:46 nakayama Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. @@ -78,7 +78,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.217 2008/03/14 15:39:18 nakayama Exp $"); +__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.218 2008/04/03 10:34:46 nakayama Exp $"); #include "opt_ddb.h" #include "opt_multiprocessor.h" @@ -1969,9 +1969,27 @@ cpu_need_resched(struct cpu_info *ci, int flags) ci->ci_want_resched = 1; ci->ci_want_ast = 1; -#if defined(MULTIPROCESSOR) +#ifdef MULTIPROCESSOR + if (ci == curcpu()) + return; /* Just interrupt the target CPU, so it can notice its AST */ - if ((flags & RESCHED_IMMED) || ci->ci_index != cpu_number()) + if ((flags & RESCHED_IMMED) != 0 && + ci->ci_data.cpu_onproc != ci->ci_data.cpu_idlelwp) + sparc64_send_ipi(ci->ci_cpuid, sparc64_ipi_nop, 0, 0); +#endif +} + +/* + * Notify an LWP that it has a signal pending, process as soon as possible. + */ +void +cpu_signotify(struct lwp *l) +{ + struct cpu_info *ci = l->l_cpu; + + ci->ci_want_ast = 1; +#ifdef MULTIPROCESSOR + if (ci != curcpu()) sparc64_send_ipi(ci->ci_cpuid, sparc64_ipi_nop, 0, 0); #endif }