Module Name: src
Committed By: cliff
Date: Mon Apr 12 22:40:55 UTC 2010
Modified Files:
src/sys/arch/mips/rmi [matt-nb5-mips64]: rmixl_intr.c rmixl_intr.h
Log Message:
- establishing an ISR now takes 'mpsafe' arg
- obtain/release kernel lock around calls to non-mpsafe ISRs
To generate a diff of this commit:
cvs rdiff -u -r1.1.2.16 -r1.1.2.17 src/sys/arch/mips/rmi/rmixl_intr.c
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/arch/mips/rmi/rmixl_intr.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/mips/rmi/rmixl_intr.c
diff -u src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.16 src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.17
--- src/sys/arch/mips/rmi/rmixl_intr.c:1.1.2.16 Mon Mar 29 23:35:24 2010
+++ src/sys/arch/mips/rmi/rmixl_intr.c Mon Apr 12 22:40:55 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: rmixl_intr.c,v 1.1.2.16 2010/03/29 23:35:24 cliff Exp $ */
+/* $NetBSD: rmixl_intr.c,v 1.1.2.17 2010/04/12 22:40:55 cliff Exp $ */
/*-
* Copyright (c) 2007 Ruslan Ermilov and Vsevolod Lobko.
@@ -64,7 +64,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rmixl_intr.c,v 1.1.2.16 2010/03/29 23:35:24 cliff Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rmixl_intr.c,v 1.1.2.17 2010/04/12 22:40:55 cliff Exp $");
#include "opt_ddb.h"
#define __INTR_PRIVATE
@@ -422,12 +422,13 @@
* establish vector for mips3 count/compare clock interrupt
* this ensures we enable in EIRR,
* even though cpu_intr() handles the interrupt
+ * note the 'mpsafe' arg here is a placeholder only
*/
void *
rmixl_intr_init_clk(void)
{
int vec = ffs(MIPS_INT_MASK_5 >> 8) - 1;
- void *ih = rmixl_vec_establish(vec, 0, IPL_SCHED, NULL, NULL);
+ void *ih = rmixl_vec_establish(vec, 0, IPL_SCHED, NULL, NULL, false);
if (ih == NULL)
panic("%s: establish vec %d failed", __func__, vec);
@@ -442,7 +443,7 @@
rmixl_intr_init_ipi(void)
{
void *ih = rmixl_vec_establish(RMIXL_INTRVEC_IPI, -1, IPL_SCHED,
- rmixl_ipi_intr, NULL);
+ rmixl_ipi_intr, NULL, false);
if (ih == NULL)
panic("%s: establish vec %d failed",
__func__, RMIXL_INTRVEC_IPI);
@@ -671,7 +672,7 @@
void *
rmixl_vec_establish(int vec, int cpumask, int ipl,
- int (*func)(void *), void *arg)
+ int (*func)(void *), void *arg, bool mpsafe)
{
rmixl_intrhand_t *ih;
int s;
@@ -700,6 +701,7 @@
ih->ih_func = func;
ih->ih_arg = arg;
+ ih->ih_mpsafe = mpsafe;
ih->ih_irq = vec;
ih->ih_ipl = ipl;
ih->ih_cpumask = cpumask;
@@ -710,8 +712,9 @@
}
void *
-rmixl_intr_establish(int irq, int cpumask, int ipl, rmixl_intr_trigger_t trigger,
- rmixl_intr_polarity_t polarity, int (*func)(void *), void *arg)
+rmixl_intr_establish(int irq, int cpumask, int ipl,
+ rmixl_intr_trigger_t trigger, rmixl_intr_polarity_t polarity,
+ int (*func)(void *), void *arg, bool mpsafe)
{
rmixl_intrhand_t *ih;
int s;
@@ -738,7 +741,7 @@
/*
* establish vector
*/
- ih = rmixl_vec_establish(irq, cpumask, ipl, func, arg);
+ ih = rmixl_vec_establish(irq, cpumask, ipl, func, arg, mpsafe);
/*
* establish IRT Entry
@@ -843,8 +846,19 @@
RMIXL_PICREG_WRITE(RMIXL_PIC_INTRACK,
(uint32_t)vecbit);
- if (ih->ih_func != NULL)
+ if (ih->ih_func != NULL) {
+#ifdef MULTIPROCESSOR
+ if (ih->ih_mpsafe) {
+ (void)(*ih->ih_func)(ih->ih_arg);
+ } else {
+ KERNEL_LOCK(1, NULL);
+ (void)(*ih->ih_func)(ih->ih_arg);
+ KERNEL_UNLOCK_ONE(NULL);
+ }
+#else
(void)(*ih->ih_func)(ih->ih_arg);
+#endif /* MULTIPROCESSOR */
+ }
sc->sc_vec_evcnts[vec].ev_count++;
}
Index: src/sys/arch/mips/rmi/rmixl_intr.h
diff -u src/sys/arch/mips/rmi/rmixl_intr.h:1.1.2.1 src/sys/arch/mips/rmi/rmixl_intr.h:1.1.2.2
--- src/sys/arch/mips/rmi/rmixl_intr.h:1.1.2.1 Sun Mar 21 19:28:01 2010
+++ src/sys/arch/mips/rmi/rmixl_intr.h Mon Apr 12 22:40:55 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: rmixl_intr.h,v 1.1.2.1 2010/03/21 19:28:01 cliff Exp $ */
+/* $NetBSD: rmixl_intr.h,v 1.1.2.2 2010/04/12 22:40:55 cliff Exp $ */
#ifndef _MIPS_RMI_RMIXL_INTR_H_
#define _MIPS_RMI_RMIXL_INTR_H_
@@ -40,6 +40,7 @@
typedef struct rmixl_intrhand {
int (*ih_func)(void *);
void *ih_arg;
+ int ih_mpsafe; /* true if does not need kernel lock */
int ih_irq; /* >=32 if not-PIC-based */
int ih_ipl; /* interrupt priority */
int ih_cpumask; /* CPUs which may handle this irpt */
@@ -53,10 +54,10 @@
extern void *rmixl_intr_establish(int, int, int,
rmixl_intr_trigger_t, rmixl_intr_polarity_t,
- int (*)(void *), void *);
+ int (*)(void *), void *, bool);
extern void rmixl_intr_disestablish(void *);
extern void *rmixl_vec_establish(int, int, int,
- int (*)(void *), void *);
+ int (*)(void *), void *, bool);
extern void rmixl_vec_disestablish(void *);
extern const char *rmixl_intr_string(int);
extern void rmixl_intr_init_cpu(struct cpu_info *);