diff options
author | jhb <jhb@FreeBSD.org> | 2008-04-05 19:58:30 +0000 |
---|---|---|
committer | jhb <jhb@FreeBSD.org> | 2008-04-05 19:58:30 +0000 |
commit | 79918c45a6cb0f1be2a1f4a98b4db650b3e3ec66 (patch) | |
tree | 3473dbfbaef8cf04d0d7e8cc250d98a1d866650b /sys/powerpc | |
parent | bcf7984652af778a74311520173661bcd19d3326 (diff) | |
download | FreeBSD-src-79918c45a6cb0f1be2a1f4a98b4db650b3e3ec66.zip FreeBSD-src-79918c45a6cb0f1be2a1f4a98b4db650b3e3ec66.tar.gz |
Add a MI intr_event_handle() routine for the non-INTR_FILTER case. This
allows all the INTR_FILTER #ifdef's to be removed from the MD interrupt
code.
- Rename the intr_event 'eoi', 'disable', and 'enable' hooks to
'post_filter', 'pre_ithread', and 'post_ithread' to be less x86-centric.
Also, add a comment describe what the MI code expects them to do.
- On amd64, i386, and powerpc this is effectively a NOP.
- On arm, don't bother masking the interrupt unless the ithread is
scheduled in the non-INTR_FILTER case to match what INTR_FILTER did.
Also, don't bother unmasking the interrupt in the post_filter case if
we never masked it. The INTR_FILTER case had been doing this by having
arm_unmask_irq for the post_filter (formerly 'eoi') hook.
- On ia64, stray interrupts are now masked for the non-INTR_FILTER case.
They were already masked in the INTR_FILTER case.
- On sparc64, use the a NULL pre_ithread hook and use intr_enable_eoi() for
both the 'post_filter' and 'post_ithread' hooks to match what the
non-INTR_FILTER code did.
- On sun4v, retire the ithread wrapper hack by using an appropriate
'post_ithread' hook instead (it's what 'post_ithread'/'enable' was
designed to do even in 5.x).
Glanced at by: piso
Reviewed by: marius
Requested by: marius [1], [5]
Tested on: amd64, i386, arm, sparc64
Diffstat (limited to 'sys/powerpc')
-rw-r--r-- | sys/powerpc/powerpc/intr_machdep.c | 46 |
1 files changed, 1 insertions, 45 deletions
diff --git a/sys/powerpc/powerpc/intr_machdep.c b/sys/powerpc/powerpc/intr_machdep.c index 990ba51..5f1a651 100644 --- a/sys/powerpc/powerpc/intr_machdep.c +++ b/sys/powerpc/powerpc/intr_machdep.c @@ -277,10 +277,6 @@ powerpc_dispatch_intr(u_int vector, struct trapframe *tf) { struct powerpc_intr *i; struct intr_event *ie; -#ifndef INTR_FILTER - struct intr_handler *ih; - int error, sched, ret; -#endif i = powerpc_intrs[vector]; if (i == NULL) @@ -291,55 +287,15 @@ powerpc_dispatch_intr(u_int vector, struct trapframe *tf) ie = i->event; KASSERT(ie != NULL, ("%s: interrupt without an event", __func__)); -#ifdef INTR_FILTER if (intr_event_handle(ie, tf) != 0) { - PIC_MASK(pic, i->irq); - log(LOG_ERR, "stray irq%u\n", i->irq); - } -#else - if (TAILQ_EMPTY(&ie->ie_handlers)) goto stray; - - /* - * Execute all fast interrupt handlers directly without Giant. Note - * that this means that any fast interrupt handler must be MP safe. - */ - ret = 0; - sched = 0; - critical_enter(); - TAILQ_FOREACH(ih, &ie->ie_handlers, ih_next) { - if (ih->ih_filter == NULL) { - sched = 1; - continue; - } - CTR4(KTR_INTR, "%s: exec %p(%p) for %s", __func__, - ih->ih_filter, ih->ih_argument, ih->ih_name); - ret = ih->ih_filter(ih->ih_argument); - /* - * Wrapper handler special case: see - * i386/intr_machdep.c::intr_execute_handlers() - */ - if (!sched) { - if (ret == FILTER_SCHEDULE_THREAD) - sched = 1; - } } - - if (sched) { - PIC_MASK(pic, i->irq); - error = intr_event_schedule_thread(ie); - KASSERT(error == 0, ("%s: impossible stray interrupt", - __func__)); - } else - PIC_EOI(pic, i->irq); - critical_exit(); -#endif return; stray: stray_count++; if (stray_count <= MAX_STRAY_LOG) { - printf("stray irq %d\n", i->irq); + printf("stray irq %d\n", i ? i->irq : -1); if (stray_count >= MAX_STRAY_LOG) { printf("got %d stray interrupts, not logging anymore\n", MAX_STRAY_LOG); |