Module Name: src
Committed By: matt
Date: Mon Mar 3 08:50:48 UTC 2014
Modified Files:
src/sys/arch/arm/pic: pic.c picvar.h
Log Message:
Add a mpsafe flag to the intrsource
To generate a diff of this commit:
cvs rdiff -u -r1.19 -r1.20 src/sys/arch/arm/pic/pic.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/pic/picvar.h
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/pic/pic.c
diff -u src/sys/arch/arm/pic/pic.c:1.19 src/sys/arch/arm/pic/pic.c:1.20
--- src/sys/arch/arm/pic/pic.c:1.19 Tue Jan 28 13:20:30 2014
+++ src/sys/arch/arm/pic/pic.c Mon Mar 3 08:50:48 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: pic.c,v 1.19 2014/01/28 13:20:30 martin Exp $ */
+/* $NetBSD: pic.c,v 1.20 2014/03/03 08:50:48 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -28,7 +28,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.19 2014/01/28 13:20:30 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pic.c,v 1.20 2014/03/03 08:50:48 matt Exp $");
#define _INTR_PRIVATE
#include <sys/param.h>
@@ -255,18 +255,27 @@ pic_find_pending_irqs_by_ipl(struct pic_
void
pic_dispatch(struct intrsource *is, void *frame)
{
- int rv __unused;
+ int (*func)(void *) = is->is_func;
+ void *arg = is->is_arg;
- if (__predict_false(is->is_arg == NULL)
- && __predict_true(frame != NULL)) {
- rv = (*is->is_func)(frame);
- } else if (__predict_true(is->is_arg != NULL)) {
- rv = (*is->is_func)(is->is_arg);
- } else {
- pic_deferral_ev.ev_count++;
- return;
+ if (__predict_false(arg == NULL)) {
+ if (__predict_false(frame == NULL)) {
+ pic_deferral_ev.ev_count++;
+ return;
+ }
+ arg = frame;
}
+#ifdef MULTIPROCESSOR
+ if (!is->is_mpsafe) {
+ KERNEL_LOCK(1, NULL);
+ (void)(*func)(arg);
+ KERNEL_UNLOCK_ONE(NULL);
+ } else
+#endif
+ (void)(*func)(arg);
+
+
struct pic_percpu * const pcpu = percpu_getref(is->is_pic->pic_percpu);
KASSERT(pcpu->pcpu_magic == PICPERCPU_MAGIC);
pcpu->pcpu_evs[is->is_irq].ev_count++;
@@ -607,6 +616,9 @@ pic_establish_intr(struct pic_softc *pic
is->is_type = type;
is->is_func = func;
is->is_arg = arg;
+#ifdef MULTIPROCESSOR
+ is->is_mpsafe = false;
+#endif
if (pic->pic_ops->pic_source_name)
(*pic->pic_ops->pic_source_name)(pic, irq, is->is_source,
Index: src/sys/arch/arm/pic/picvar.h
diff -u src/sys/arch/arm/pic/picvar.h:1.7 src/sys/arch/arm/pic/picvar.h:1.8
--- src/sys/arch/arm/pic/picvar.h:1.7 Sat Sep 1 00:00:42 2012
+++ src/sys/arch/arm/pic/picvar.h Mon Mar 3 08:50:48 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: picvar.h,v 1.7 2012/09/01 00:00:42 matt Exp $ */
+/* $NetBSD: picvar.h,v 1.8 2014/03/03 08:50:48 matt Exp $ */
/*-
* Copyright (c) 2008 The NetBSD Foundation, Inc.
* All rights reserved.
@@ -99,6 +99,7 @@ struct intrsource {
uint8_t is_ipl; /* IPL_xxx */
uint8_t is_irq; /* local to pic */
uint8_t is_iplidx;
+ bool is_mpsafe;
char is_source[16];
};