svn commit: r192311 - in stable/7/sys: . amd64/amd64 arm/arm
contrib/pf dev/ath/ath_hal dev/cxgb i386/i386 ia64/ia64 kern
powerpc/powerpc sparc64/sparc64 sys
John Baldwin
jhb at FreeBSD.org
Mon May 18 17:14:25 UTC 2009
Author: jhb
Date: Mon May 18 17:14:23 2009
New Revision: 192311
URL: http://svn.freebsd.org/changeset/base/192311
Log:
MFC: Simplify the interrupt code a bit by always including the ie_disable
and ie_eoi methods and collapsing down to a single intr_event_create()
routine.
Modified:
stable/7/sys/ (props changed)
stable/7/sys/amd64/amd64/intr_machdep.c
stable/7/sys/arm/arm/intr.c
stable/7/sys/contrib/pf/ (props changed)
stable/7/sys/dev/ath/ath_hal/ (props changed)
stable/7/sys/dev/cxgb/ (props changed)
stable/7/sys/i386/i386/intr_machdep.c
stable/7/sys/ia64/ia64/interrupt.c
stable/7/sys/kern/kern_intr.c
stable/7/sys/powerpc/powerpc/intr_machdep.c
stable/7/sys/sparc64/sparc64/intr_machdep.c
stable/7/sys/sys/interrupt.h
Modified: stable/7/sys/amd64/amd64/intr_machdep.c
==============================================================================
--- stable/7/sys/amd64/amd64/intr_machdep.c Mon May 18 17:10:26 2009 (r192310)
+++ stable/7/sys/amd64/amd64/intr_machdep.c Mon May 18 17:14:23 2009 (r192311)
@@ -77,12 +77,6 @@ static struct sx intr_table_lock;
static struct mtx intrcnt_lock;
static STAILQ_HEAD(, pic) pics;
-#ifdef INTR_FILTER
-static void intr_eoi_src(void *arg);
-static void intr_disab_eoi_src(void *arg);
-static void intr_event_stray(void *cookie);
-#endif
-
#ifdef SMP
static int assign_cpu;
@@ -90,6 +84,10 @@ static void intr_assign_next_cpu(struct
#endif
static int intr_assign_cpu(void *arg, u_char cpu);
+static void intr_disable_src(void *arg);
+#ifdef INTR_FILTER
+static void intr_event_stray(void *cookie);
+#endif
static void intr_init(void *__dummy);
static int intr_pic_registered(struct pic *pic);
static void intrcnt_setname(const char *name, int index);
@@ -144,16 +142,10 @@ intr_register_source(struct intsrc *isrc
vector = isrc->is_pic->pic_vector(isrc);
if (interrupt_sources[vector] != NULL)
return (EEXIST);
-#ifdef INTR_FILTER
- error = intr_event_create(&isrc->is_event, isrc, 0,
- (mask_fn)isrc->is_pic->pic_enable_source,
- intr_eoi_src, intr_disab_eoi_src, intr_assign_cpu, "irq%d:",
- vector);
-#else
error = intr_event_create(&isrc->is_event, isrc, 0,
- (mask_fn)isrc->is_pic->pic_enable_source, intr_assign_cpu, "irq%d:",
+ intr_disable_src, (mask_fn)isrc->is_pic->pic_enable_source,
+ (mask_fn)isrc->is_pic->pic_eoi_source, intr_assign_cpu, "irq%d:",
vector);
-#endif
if (error)
return (error);
sx_xlock(&intr_table_lock);
@@ -237,6 +229,15 @@ intr_config_intr(int vector, enum intr_t
return (isrc->is_pic->pic_config_intr(isrc, trig, pol));
}
+static void
+intr_disable_src(void *arg)
+{
+ struct intsrc *isrc;
+
+ isrc = arg;
+ isrc->is_pic->pic_disable_source(isrc, PIC_EOI);
+}
+
#ifdef INTR_FILTER
void
intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame)
@@ -289,24 +290,6 @@ intr_event_stray(void *cookie)
"too many stray irq %d's: not logging anymore\n",
isrc->is_pic->pic_vector(isrc));
}
-
-static void
-intr_eoi_src(void *arg)
-{
- struct intsrc *isrc;
-
- isrc = arg;
- isrc->is_pic->pic_eoi_source(isrc);
-}
-
-static void
-intr_disab_eoi_src(void *arg)
-{
- struct intsrc *isrc;
-
- isrc = arg;
- isrc->is_pic->pic_disable_source(isrc, PIC_EOI);
-}
#else
void
intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame)
Modified: stable/7/sys/arm/arm/intr.c
==============================================================================
--- stable/7/sys/arm/arm/intr.c Mon May 18 17:10:26 2009 (r192310)
+++ stable/7/sys/arm/arm/intr.c Mon May 18 17:14:23 2009 (r192311)
@@ -50,6 +50,8 @@ __FBSDID("$FreeBSD$");
#include <machine/intr.h>
#include <machine/cpu.h>
+typedef void (*mask_fn)(void *);
+
static struct intr_event *intr_events[NIRQ];
static int intrcnt_tab[NIRQ];
static int intrcnt_index = 0;
@@ -57,27 +59,6 @@ static int last_printed = 0;
void arm_handler_execute(struct trapframe *, int);
-#ifdef INTR_FILTER
-static void
-intr_disab_eoi_src(void *arg)
-{
- uintptr_t nb;
-
- nb = (uintptr_t)arg;
- arm_mask_irq(nb);
-}
-
-static void
-intr_eoi_src(void *arg)
-{
- uintptr_t nb;
-
- nb = (uintptr_t)arg;
- arm_unmask_irq(nb);
-}
-
-#endif
-
void
arm_setup_irqhandler(const char *name, driver_filter_t *filt,
void (*hand)(void*), void *arg, int irq, int flags, void **cookiep)
@@ -89,14 +70,9 @@ arm_setup_irqhandler(const char *name, d
return;
event = intr_events[irq];
if (event == NULL) {
-#ifdef INTR_FILTER
- error = intr_event_create(&event, (void *)irq, 0,
- (void (*)(void *))arm_unmask_irq, intr_eoi_src,
- intr_disab_eoi_src, NULL, "intr%d:", irq);
-#else
error = intr_event_create(&event, (void *)irq, 0,
- (void (*)(void *))arm_unmask_irq, NULL, "intr%d:", irq);
-#endif
+ (mask_fn)arm_mask_irq, (mask_fn)arm_unmask_irq,
+ (mask_fn)arm_unmask_irq, NULL, "intr%d:", irq);
if (error)
return;
intr_events[irq] = event;
Modified: stable/7/sys/i386/i386/intr_machdep.c
==============================================================================
--- stable/7/sys/i386/i386/intr_machdep.c Mon May 18 17:10:26 2009 (r192310)
+++ stable/7/sys/i386/i386/intr_machdep.c Mon May 18 17:14:23 2009 (r192311)
@@ -68,12 +68,6 @@ static struct sx intr_table_lock;
static struct mtx intrcnt_lock;
static STAILQ_HEAD(, pic) pics;
-#ifdef INTR_FILTER
-static void intr_eoi_src(void *arg);
-static void intr_disab_eoi_src(void *arg);
-static void intr_event_stray(void *cookie);
-#endif
-
#ifdef SMP
static int assign_cpu;
@@ -81,6 +75,10 @@ static void intr_assign_next_cpu(struct
#endif
static int intr_assign_cpu(void *arg, u_char cpu);
+static void intr_disable_src(void *arg);
+#ifdef INTR_FILTER
+static void intr_event_stray(void *cookie);
+#endif
static void intr_init(void *__dummy);
static int intr_pic_registered(struct pic *pic);
static void intrcnt_setname(const char *name, int index);
@@ -135,16 +133,10 @@ intr_register_source(struct intsrc *isrc
vector = isrc->is_pic->pic_vector(isrc);
if (interrupt_sources[vector] != NULL)
return (EEXIST);
-#ifdef INTR_FILTER
- error = intr_event_create(&isrc->is_event, isrc, 0,
- (mask_fn)isrc->is_pic->pic_enable_source,
- intr_eoi_src, intr_disab_eoi_src, intr_assign_cpu, "irq%d:",
- vector);
-#else
error = intr_event_create(&isrc->is_event, isrc, 0,
- (mask_fn)isrc->is_pic->pic_enable_source, intr_assign_cpu, "irq%d:",
+ intr_disable_src, (mask_fn)isrc->is_pic->pic_enable_source,
+ (mask_fn)isrc->is_pic->pic_eoi_source, intr_assign_cpu, "irq%d:",
vector);
-#endif
if (error)
return (error);
sx_xlock(&intr_table_lock);
@@ -228,6 +220,15 @@ intr_config_intr(int vector, enum intr_t
return (isrc->is_pic->pic_config_intr(isrc, trig, pol));
}
+static void
+intr_disable_src(void *arg)
+{
+ struct intsrc *isrc;
+
+ isrc = arg;
+ isrc->is_pic->pic_disable_source(isrc, PIC_EOI);
+}
+
#ifdef INTR_FILTER
void
intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame)
@@ -280,24 +281,6 @@ intr_event_stray(void *cookie)
"too many stray irq %d's: not logging anymore\n",
isrc->is_pic->pic_vector(isrc));
}
-
-static void
-intr_eoi_src(void *arg)
-{
- struct intsrc *isrc;
-
- isrc = arg;
- isrc->is_pic->pic_eoi_source(isrc);
-}
-
-static void
-intr_disab_eoi_src(void *arg)
-{
- struct intsrc *isrc;
-
- isrc = arg;
- isrc->is_pic->pic_disable_source(isrc, PIC_EOI);
-}
#else
void
intr_execute_handlers(struct intsrc *isrc, struct trapframe *frame)
Modified: stable/7/sys/ia64/ia64/interrupt.c
==============================================================================
--- stable/7/sys/ia64/ia64/interrupt.c Mon May 18 17:10:26 2009 (r192310)
+++ stable/7/sys/ia64/ia64/interrupt.c Mon May 18 17:14:23 2009 (r192311)
@@ -340,10 +340,7 @@ ia64_setup_intr(const char *name, int ir
return (ENOMEM);
error = intr_event_create(&i->event, (void *)(uintptr_t)vector,
- 0, ia64_intr_unmask,
-#ifdef INTR_FILTER
- ia64_intr_eoi, ia64_intr_mask,
-#endif
+ 0, ia64_intr_mask, ia64_intr_unmask, ia64_intr_eoi,
NULL, "irq%u:", irq);
if (error) {
free(i, M_DEVBUF);
Modified: stable/7/sys/kern/kern_intr.c
==============================================================================
--- stable/7/sys/kern/kern_intr.c Mon May 18 17:10:26 2009 (r192310)
+++ stable/7/sys/kern/kern_intr.c Mon May 18 17:14:23 2009 (r192311)
@@ -238,43 +238,9 @@ intr_event_update(struct intr_event *ie)
CTR2(KTR_INTR, "%s: updated %s", __func__, ie->ie_fullname);
}
-#ifndef INTR_FILTER
-int
-intr_event_create(struct intr_event **event, void *source, int flags,
- void (*enable)(void *), int (*assign_cpu)(void *, u_char), const char *fmt,
- ...)
-{
- struct intr_event *ie;
- va_list ap;
-
- /* The only valid flag during creation is IE_SOFT. */
- if ((flags & ~IE_SOFT) != 0)
- return (EINVAL);
- ie = malloc(sizeof(struct intr_event), M_ITHREAD, M_WAITOK | M_ZERO);
- ie->ie_source = source;
- ie->ie_enable = enable;
- ie->ie_assign_cpu = assign_cpu;
- ie->ie_flags = flags;
- ie->ie_cpu = NOCPU;
- TAILQ_INIT(&ie->ie_handlers);
- mtx_init(&ie->ie_lock, "intr event", NULL, MTX_DEF);
-
- va_start(ap, fmt);
- vsnprintf(ie->ie_name, sizeof(ie->ie_name), fmt, ap);
- va_end(ap);
- strlcpy(ie->ie_fullname, ie->ie_name, sizeof(ie->ie_fullname));
- mtx_pool_lock(mtxpool_sleep, &event_list);
- TAILQ_INSERT_TAIL(&event_list, ie, ie_list);
- mtx_pool_unlock(mtxpool_sleep, &event_list);
- if (event != NULL)
- *event = ie;
- CTR2(KTR_INTR, "%s: created %s", __func__, ie->ie_name);
- return (0);
-}
-#else
int
-intr_event_create(struct intr_event **event, void *source, int flags,
- void (*enable)(void *), void (*eoi)(void *), void (*disab)(void *),
+intr_event_create(struct intr_event **event, void *source,int flags,
+ void (*disable)(void *), void (*enable)(void *), void (*eoi)(void *),
int (*assign_cpu)(void *, u_char), const char *fmt, ...)
{
struct intr_event *ie;
@@ -285,10 +251,10 @@ intr_event_create(struct intr_event **ev
return (EINVAL);
ie = malloc(sizeof(struct intr_event), M_ITHREAD, M_WAITOK | M_ZERO);
ie->ie_source = source;
+ ie->ie_disable = disable;
ie->ie_enable = enable;
- ie->ie_assign_cpu = assign_cpu;
ie->ie_eoi = eoi;
- ie->ie_disab = disab;
+ ie->ie_assign_cpu = assign_cpu;
ie->ie_flags = flags;
ie->ie_cpu = NOCPU;
TAILQ_INIT(&ie->ie_handlers);
@@ -306,7 +272,6 @@ intr_event_create(struct intr_event **ev
CTR2(KTR_INTR, "%s: created %s", __func__, ie->ie_name);
return (0);
}
-#endif
/*
* Bind an interrupt event to the specified CPU. Note that not all
@@ -945,13 +910,8 @@ swi_add(struct intr_event **eventp, cons
if (!(ie->ie_flags & IE_SOFT))
return (EINVAL);
} else {
-#ifdef INTR_FILTER
error = intr_event_create(&ie, NULL, IE_SOFT,
NULL, NULL, NULL, NULL, "swi%d:", pri);
-#else
- error = intr_event_create(&ie, NULL, IE_SOFT,
- NULL, NULL, "swi%d:", pri);
-#endif
if (error)
return (error);
if (eventp != NULL)
@@ -1408,8 +1368,8 @@ intr_event_handle(struct intr_event *ie,
if (ie->ie_eoi != NULL)
ie->ie_eoi(ie->ie_source);
} else {
- if (ie->ie_disab != NULL)
- ie->ie_disab(ie->ie_source);
+ if (ie->ie_disable != NULL)
+ ie->ie_disable(ie->ie_source);
}
critical_exit();
Modified: stable/7/sys/powerpc/powerpc/intr_machdep.c
==============================================================================
--- stable/7/sys/powerpc/powerpc/intr_machdep.c Mon May 18 17:10:26 2009 (r192310)
+++ stable/7/sys/powerpc/powerpc/intr_machdep.c Mon May 18 17:14:23 2009 (r192311)
@@ -105,7 +105,6 @@ intrcnt_setname(const char *name, int in
MAXCOMLEN, name);
}
-#ifdef INTR_FILTER
static void
powerpc_intr_eoi(void *arg)
{
@@ -121,7 +120,6 @@ powerpc_intr_mask(void *arg)
PIC_MASK(pic, irq);
}
-#endif
static void
powerpc_intr_unmask(void *arg)
@@ -187,10 +185,7 @@ powerpc_setup_intr(const char *name, u_i
return (ENOMEM);
}
error = intr_event_create(&i->event, (void *)irq, 0,
- powerpc_intr_unmask,
-#ifdef INTR_FILTER
- powerpc_intr_eoi, powerpc_intr_mask,
-#endif
+ powerpc_intr_mask, powerpc_intr_unmask, powerpc_intr_eoi,
NULL, "irq%u:", irq);
if (error) {
/* XXX unlock */
Modified: stable/7/sys/sparc64/sparc64/intr_machdep.c
==============================================================================
--- stable/7/sys/sparc64/sparc64/intr_machdep.c Mon May 18 17:10:26 2009 (r192310)
+++ stable/7/sys/sparc64/sparc64/intr_machdep.c Mon May 18 17:14:23 2009 (r192311)
@@ -345,12 +345,8 @@ intr_controller_register(int vec, const
sx_xunlock(&intr_table_lock);
if (ie != NULL)
return (EEXIST);
- error = intr_event_create(&ie, iv, 0, ic->ic_clear,
-#ifdef INTR_FILTER
- ic->ic_clear, NULL, intr_assign_cpu, "vec%d:", vec);
-#else
- intr_assign_cpu, "vec%d:", vec);
-#endif
+ error = intr_event_create(&ie, iv, 0, NULL, ic->ic_clear,
+ ic->ic_clear, intr_assign_cpu, "vec%d:", vec);
if (error != 0)
return (error);
sx_xlock(&intr_table_lock);
Modified: stable/7/sys/sys/interrupt.h
==============================================================================
--- stable/7/sys/sys/interrupt.h Mon May 18 17:10:26 2009 (r192310)
+++ stable/7/sys/sys/interrupt.h Mon May 18 17:14:23 2009 (r192311)
@@ -72,12 +72,10 @@ struct intr_event {
struct mtx ie_lock;
void *ie_source; /* Cookie used by MD code. */
struct intr_thread *ie_thread; /* Thread we are connected to. */
+ void (*ie_disable)(void *);
void (*ie_enable)(void *);
- int (*ie_assign_cpu)(void *, u_char);
-#ifdef INTR_FILTER
void (*ie_eoi)(void *);
- void (*ie_disab)(void *);
-#endif
+ int (*ie_assign_cpu)(void *, u_char);
int ie_flags;
int ie_count; /* Loop counter. */
int ie_warncnt; /* Rate-check interrupt storm warns. */
@@ -130,18 +128,11 @@ int intr_event_add_handler(struct intr_e
driver_filter_t filter, driver_intr_t handler, void *arg,
u_char pri, enum intr_type flags, void **cookiep);
int intr_event_bind(struct intr_event *ie, u_char cpu);
-#ifndef INTR_FILTER
-int intr_event_create(struct intr_event **event, void *source,
- int flags, void (*enable)(void *),
- int (*assign_cpu)(void *, u_char), const char *fmt, ...)
- __printflike(6, 7);
-#else
int intr_event_create(struct intr_event **event, void *source,
- int flags, void (*enable)(void *), void (*eoi)(void *),
- void (*disab)(void *), int (*assign_cpu)(void *, u_char),
+ int flags, void (*disable)(void *), void (*enable)(void *),
+ void (*eoi)(void *), int (*assign_cpu)(void *, u_char),
const char *fmt, ...)
__printflike(8, 9);
-#endif
int intr_event_destroy(struct intr_event *ie);
int intr_event_remove_handler(void *cookie);
#ifndef INTR_FILTER
More information about the svn-src-stable
mailing list