Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm Don't clear CI_ASTPENDING in exception return, ...
details: https://anonhg.NetBSD.org/src/rev/a20551e41531
branches: trunk
changeset: 807411:a20551e41531
user: matt <matt%NetBSD.org@localhost>
date: Wed Apr 08 18:10:08 2015 +0000
description:
Don't clear CI_ASTPENDING in exception return, do it in ast() instead.
Add basic support for __HAVE_PREEMPTION.
Use atomic ops for ci_astpending if __HAVE_PREEMPTION is defined.
Use kpreempt_disable/kpreempt_enable
diffstat:
sys/arch/arm/arm/arm_machdep.c | 40 ++++++++++++++++++++++++++++++++++---
sys/arch/arm/arm/ast.c | 39 ++++++++++++++++++++++++++----------
sys/arch/arm/include/arm32/frame.h | 8 +-----
sys/arch/arm/pic/pic.c | 10 +++++++-
4 files changed, 74 insertions(+), 23 deletions(-)
diffs (221 lines):
diff -r 08e9619a6abf -r a20551e41531 sys/arch/arm/arm/arm_machdep.c
--- a/sys/arch/arm/arm/arm_machdep.c Wed Apr 08 16:38:42 2015 +0000
+++ b/sys/arch/arm/arm/arm_machdep.c Wed Apr 08 18:10:08 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: arm_machdep.c,v 1.45 2015/04/08 16:37:32 matt Exp $ */
+/* $NetBSD: arm_machdep.c,v 1.46 2015/04/08 18:10:08 matt Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
#include <sys/param.h>
-__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.45 2015/04/08 16:37:32 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.46 2015/04/08 18:10:08 matt Exp $");
#include <sys/exec.h>
#include <sys/proc.h>
@@ -266,7 +266,7 @@
#ifdef __HAVE_PREEMPTION
atomic_or_uint(&l->l_dopreempt, DOPREEMPT_ACTIVE);
if (ci == cur_ci) {
- ci->ci_astpending |= 2;
+ atomic_or_uint(&ci->ci_astpending, __BIT(1));
} else {
ipi = IPI_KPREEMPT;
goto send_ipi;
@@ -274,7 +274,11 @@
#endif /* __HAVE_PREEMPTION */
return;
}
- ci->ci_astpending |= 1;
+#ifdef __HAVE_PREEMPTION
+ atomic_or_uint(&ci->ci_astpending, __BIT(0));
+#else
+ ci->ci_astpending = __BIT(0);
+#endif
#ifdef MULTIPROCESSOR
if (ci == curcpu() || !immed)
return;
@@ -321,3 +325,31 @@
return curcpu();
}
#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)
+{
+ return s == IPL_NONE;
+}
+
+void
+cpu_kpreempt_exit(uintptr_t where)
+{
+ atomic_and_uint(&curcpu()->ci_astpending, (unsigned int)~__BIT(1));
+}
+
+bool
+cpu_kpreempt_disabled(void)
+{
+ return curcpu()->ci_cpl != IPL_NONE;
+}
+#endif /* __HAVE_PREEMPTION */
diff -r 08e9619a6abf -r a20551e41531 sys/arch/arm/arm/ast.c
--- a/sys/arch/arm/arm/ast.c Wed Apr 08 16:38:42 2015 +0000
+++ b/sys/arch/arm/arm/ast.c Wed Apr 08 18:10:08 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: ast.c,v 1.25 2014/10/29 10:56:19 skrll Exp $ */
+/* $NetBSD: ast.c,v 1.26 2015/04/08 18:10:08 matt Exp $ */
/*
* Copyright (c) 1994,1995 Mark Brinicombe
@@ -41,7 +41,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.25 2014/10/29 10:56:19 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.26 2015/04/08 18:10:08 matt Exp $");
#include "opt_ddb.h"
@@ -50,10 +50,11 @@
#include <sys/proc.h>
#include <sys/acct.h>
#include <sys/systm.h>
+#include <sys/atomic.h>
#include <sys/kernel.h>
#include <sys/signal.h>
+#include <sys/userret.h>
#include <sys/vmmeter.h>
-#include <sys/userret.h>
#include <arm/locore.h>
@@ -76,11 +77,17 @@
* If our ASID got released, access via TTBR0 will have been disabled.
* So if it is disabled, activate the lwp again to get a new ASID.
*/
+#ifdef __HAVE_PREEMPTION
+ kpreempt_disable();
+#endif
KASSERT(curcpu()->ci_pmap_cur == l->l_proc->p_vmspace->vm_map.pmap);
- if (armreg_ttbcr_read() & TTBCR_S_PD0) {
+ if (__predict_false(armreg_ttbcr_read() & TTBCR_S_PD0)) {
pmap_activate(l);
}
KASSERT(!(armreg_ttbcr_read() & TTBCR_S_PD0));
+#ifdef __HAVE_PREEMPTION
+ kpreempt_enable();
+#endif
#endif
/* Invoke MI userret code */
@@ -116,12 +123,23 @@
KASSERT(VALID_R15_PSR(tf->tf_pc, tf->tf_spsr));
#endif
- curcpu()->ci_data.cpu_ntrap++;
- //curcpu()->ci_data.cpu_nast++;
+#ifdef __HAVE_PREEEMPTION
+ kpreempt_disable();
+#endif
+ struct cpu_info * const ci = curcpu();
+
+ ci->ci_data.cpu_ntrap++;
-#ifdef DEBUG
- KDASSERT(curcpu()->ci_cpl == IPL_NONE);
-#endif
+ KDASSERT(ci->ci_cpl == IPL_NONE);
+#ifdef __HAVE_PREEEMPTION
+ atomic_and_uint(&ci->ci_astpending, ~__BIT(0));
+#else
+ ci->ci_astpending = 0;
+#endif
+ const int want_resched = ci->ci_want_resched;
+#ifdef __HAVE_PREEEMPTION
+ kpreempt_enable();
+#endif
if (l->l_pflag & LP_OWEUPC) {
l->l_pflag &= ~LP_OWEUPC;
@@ -129,8 +147,7 @@
}
/* Allow a forced task switch. */
- if (l->l_cpu->ci_want_resched)
+ if (want_resched)
preempt();
-
userret(l);
}
diff -r 08e9619a6abf -r a20551e41531 sys/arch/arm/include/arm32/frame.h
--- a/sys/arch/arm/include/arm32/frame.h Wed Apr 08 16:38:42 2015 +0000
+++ b/sys/arch/arm/include/arm32/frame.h Wed Apr 08 18:10:08 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: frame.h,v 1.40 2015/04/08 16:38:42 matt Exp $ */
+/* $NetBSD: frame.h,v 1.41 2015/04/08 18:10:08 matt Exp $ */
/*
* Copyright (c) 1994-1997 Mark Brinicombe.
@@ -213,9 +213,7 @@
adr lr, 3f ;\
B_CF_CONTROL(r2) /* Set new CTRL reg value */ ;\
/* NOTREACHED */ \
-2: bic r1, r1, #0x00000001 ;\
- str r1, [r4, #CI_ASTPENDING] /* Clear astpending */ ;\
- CPSIE_I(r5, r5) /* Restore interrupts */ ;\
+2: CPSIE_I(r5, r5) /* Restore interrupts */ ;\
mov r0, sp ;\
bl _C_LABEL(ast) /* ast(frame) */ ;\
CPSID_I(r0, r5) /* Disable interrupts */ ;\
@@ -240,8 +238,6 @@
1: ldr r1, [r4, #CI_ASTPENDING] /* Pending AST? */ ;\
tst r1, #0x00000001 ;\
beq 2f /* Nope. Just bail */ ;\
- bic r1, r1, #0x00000001 ;\
- str r1, [r4, #CI_ASTPENDING] /* Clear astpending */ ;\
CPSIE_I(r5, r5) /* Restore interrupts */ ;\
mov r0, sp ;\
bl _C_LABEL(ast) /* ast(frame) */ ;\
diff -r 08e9619a6abf -r a20551e41531 sys/arch/arm/pic/pic.c
--- a/sys/arch/arm/pic/pic.c Wed Apr 08 16:38:42 2015 +0000
+++ b/sys/arch/arm/pic/pic.c Wed Apr 08 18:10:08 2015 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pic.c,v 1.26 2015/03/29 00:31:30 matt Exp $ */
+/* $NetBSD: pic.c,v 1.27 2015/04/08 18:10:08 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -33,7 +33,7 @@
#include "opt_multiprocessor.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.26 2015/03/29 00:31:30 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.27 2015/04/08 18:10:08 matt Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -505,6 +505,12 @@
pic_list_unblock_irqs();
}
}
+#ifdef __HAVE_PREEEMPTION
+ if (newipl == IPL_NONE && (ci->ci_astpending & __BIT(1))) {
+ pic_set_priority(ci, IPL_SCHED);
+ kpreempt(0);
+ }
+#endif
if (ci->ci_cpl != newipl)
pic_set_priority(ci, newipl);
}
Home |
Main Index |
Thread Index |
Old Index