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];
 };
 

Reply via email to