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