The patch titled genirq: add chip->eoi(), fastack -> fasteoi has been added to the -mm tree. Its filename is genirq-add-chip-eoi-fastack-fasteoi.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: genirq: add chip->eoi(), fastack -> fasteoi From: Ingo Molnar <mingo@xxxxxxx> Clean up the fastack concept by turning it into fasteoi and introducing the ->eoi() method for chips. This also allows the cleanup of an i386 EOI quirk - now the quirk is cleanly separated from the pure ACK implementation. The patch also enables the fasteoi handler for i386 level-triggered IO-APIC irqs. Tested on i386 and x86_64 with MSI on and off as well. Signed-off-by: Ingo Molnar <mingo@xxxxxxx> Cc: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> Cc: Roland Dreier <rolandd@xxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- arch/i386/kernel/io_apic.c | 28 +++++++++++++++++++--------- arch/x86_64/kernel/io_apic.c | 9 +++++---- include/linux/irq.h | 6 ++++-- kernel/irq/chip.c | 25 ++++++++++++------------- 4 files changed, 40 insertions(+), 28 deletions(-) diff -puN arch/i386/kernel/io_apic.c~genirq-add-chip-eoi-fastack-fasteoi arch/i386/kernel/io_apic.c --- devel/arch/i386/kernel/io_apic.c~genirq-add-chip-eoi-fastack-fasteoi 2006-05-31 11:24:33.000000000 -0700 +++ devel-akpm/arch/i386/kernel/io_apic.c 2006-05-31 11:24:33.000000000 -0700 @@ -1214,7 +1214,7 @@ static void ioapic_register_intr(int irq if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || trigger == IOAPIC_LEVEL) set_irq_chip_and_handler(idx, &ioapic_chip, - handle_level_irq); + handle_fasteoi_irq); else set_irq_chip_and_handler(idx, &ioapic_chip, handle_edge_irq); @@ -1946,6 +1946,12 @@ static unsigned int startup_ioapic_irq(u return was_pending; } +static void ack_ioapic_irq(unsigned int irq) +{ + move_irq(irq); + ack_APIC_irq(); +} + static void ack_ioapic_quirk_irq(unsigned int irq) { unsigned long v; @@ -1971,11 +1977,6 @@ static void ack_ioapic_quirk_irq(unsigne * operation to prevent an edge-triggered interrupt escaping meanwhile. * The idea is from Manfred Spraul. --macro */ - if (irq_desc[irq].handle_irq == handle_edge_irq) { - ack_APIC_irq(); - return; - } - i = IO_APIC_VECTOR(irq); v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1)); @@ -1998,6 +1999,14 @@ static unsigned int startup_ioapic_vecto return startup_ioapic_irq(irq); } +static void ack_ioapic_vector(unsigned int vector) +{ + int irq = vector_to_irq(vector); + + move_native_irq(vector); + ack_ioapic_irq(irq); +} + static void ack_ioapic_quirk_vector(unsigned int vector) { int irq = vector_to_irq(vector); @@ -2050,7 +2059,8 @@ static struct irq_chip ioapic_chip __rea .startup = startup_ioapic_vector, .mask = mask_IO_APIC_vector, .unmask = unmask_IO_APIC_vector, - .ack = ack_ioapic_quirk_vector, + .ack = ack_ioapic_vector, + .eoi = ack_ioapic_quirk_vector, #ifdef CONFIG_SMP .set_affinity = set_ioapic_affinity, #endif @@ -2124,7 +2134,7 @@ static struct irq_chip lapic_chip __read .name = "local-APIC-edge", .mask = mask_lapic_irq, .unmask = unmask_lapic_irq, - .ack = ack_apic, + .eoi = ack_apic, }; static void setup_nmi (void) @@ -2305,7 +2315,7 @@ static inline void check_timer(void) printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ..."); disable_8259A_irq(0); - set_irq_chip_and_handler(0, &lapic_chip, handle_fastack_irq); + set_irq_chip_and_handler(0, &lapic_chip, handle_fasteoi_irq); apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */ enable_8259A_irq(0); diff -puN arch/x86_64/kernel/io_apic.c~genirq-add-chip-eoi-fastack-fasteoi arch/x86_64/kernel/io_apic.c --- devel/arch/x86_64/kernel/io_apic.c~genirq-add-chip-eoi-fastack-fasteoi 2006-05-31 11:24:33.000000000 -0700 +++ devel-akpm/arch/x86_64/kernel/io_apic.c 2006-05-31 11:24:33.000000000 -0700 @@ -865,7 +865,7 @@ static void ioapic_register_intr(int irq if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) || trigger == IOAPIC_LEVEL) set_irq_chip_and_handler(idx, &ioapic_chip, - handle_fastack_irq); + handle_fasteoi_irq); else set_irq_chip_and_handler(idx, &ioapic_chip, handle_edge_irq); @@ -970,7 +970,7 @@ static void __init setup_ExtINT_IRQ0_pin * The timer IRQ doesn't have to know that behind the * scene we have a 8259A-master in AEOI mode ... */ - set_irq_chip_and_handler(0, &ioapic_chip, handle_fastack_irq); + set_irq_chip_and_handler(0, &ioapic_chip, handle_fasteoi_irq); /* * Add it to the IO-APIC irq-routing table: @@ -1563,6 +1563,7 @@ static struct irq_chip ioapic_chip __rea .mask = mask_ioapic_vector, .unmask = unmask_ioapic_vector, .ack = ack_apic, + .eoi = ack_apic, #ifdef CONFIG_SMP .set_affinity = set_ioapic_affinity_vector, #endif @@ -1626,7 +1627,7 @@ static struct irq_chip lapic_chip __read .name = "local-APIC-edge", .mask = mask_lapic_irq, .unmask = unmask_lapic_irq, - .ack = ack_apic, + .eoi = ack_apic, }; static void setup_nmi (void) @@ -1808,7 +1809,7 @@ static inline void check_timer(void) apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as Virtual Wire IRQ..."); disable_8259A_irq(0); - set_irq_chip_and_handler(0, &lapic_chip, handle_fastack_irq); + set_irq_chip_and_handler(0, &lapic_chip, handle_fasteoi_irq); apic_write(APIC_LVT0, APIC_DM_FIXED | vector); /* Fixed mode */ enable_8259A_irq(0); diff -puN include/linux/irq.h~genirq-add-chip-eoi-fastack-fasteoi include/linux/irq.h --- devel/include/linux/irq.h~genirq-add-chip-eoi-fastack-fasteoi 2006-05-31 11:24:33.000000000 -0700 +++ devel-akpm/include/linux/irq.h 2006-05-31 11:25:01.000000000 -0700 @@ -73,7 +73,8 @@ struct proc_dir_entry; * @mask: mask an interrupt source * @mask_ack: ack and mask an interrupt source * @unmask: unmask an interrupt source - * @end: end of interrupt + * @eoi: end of interrupt - chip level + * @end: end of interrupt - flow level * @set_affinity: set the CPU affinity on SMP machines * @retrigger: resend an IRQ to the CPU * @set_type: set the flow type (IRQ_TYPE_LEVEL/etc.) of an IRQ @@ -93,6 +94,7 @@ struct irq_chip { void (*mask)(unsigned int irq); void (*mask_ack)(unsigned int irq); void (*unmask)(unsigned int irq); + void (*eoi)(unsigned int irq); void (*end)(unsigned int irq); void (*set_affinity)(unsigned int irq, cpumask_t dest); @@ -297,7 +299,7 @@ extern int handle_IRQ_event(unsigned int extern void fastcall handle_level_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); extern void fastcall -handle_fastack_irq(unsigned int irq, struct irq_desc *desc, +handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); extern void fastcall handle_edge_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs); diff -puN kernel/irq/chip.c~genirq-add-chip-eoi-fastack-fasteoi kernel/irq/chip.c --- devel/kernel/irq/chip.c~genirq-add-chip-eoi-fastack-fasteoi 2006-05-31 11:24:33.000000000 -0700 +++ devel-akpm/kernel/irq/chip.c 2006-05-31 11:24:33.000000000 -0700 @@ -280,18 +280,18 @@ out: } /** - * handle_fastack_irq - irq handler for transparent controllers + * handle_fasteoi_irq - irq handler for transparent controllers * @irq: the interrupt number * @desc: the interrupt description structure for this irq * @regs: pointer to a register structure * - * Only a single callback will be issued to the chip: an ->ack() + * Only a single callback will be issued to the chip: an ->eoi() * call when the interrupt has been serviced. This enables support * for modern forms of interrupt handlers, which handle the flow * details in hardware, transparently. */ void fastcall -handle_fastack_irq(unsigned int irq, struct irq_desc *desc, +handle_fasteoi_irq(unsigned int irq, struct irq_desc *desc, struct pt_regs *regs) { unsigned int cpu = smp_processor_id(); @@ -324,10 +324,9 @@ handle_fastack_irq(unsigned int irq, str spin_lock(&desc->lock); desc->status &= ~IRQ_INPROGRESS; out: - if (!(desc->status & IRQ_DISABLED)) - desc->chip->ack(irq); - else + if (unlikely(desc->status & IRQ_DISABLED)) desc->chip->mask(irq); + desc->chip->eoi(irq); spin_unlock(&desc->lock); } @@ -507,19 +506,19 @@ handle_irq_name(void fastcall (*handle)( struct pt_regs *)) { if (handle == handle_level_irq) - return "level "; - if (handle == handle_fastack_irq) - return "level "; + return "level "; + if (handle == handle_fasteoi_irq) + return "fasteoi"; if (handle == handle_edge_irq) - return "edge "; + return "edge "; if (handle == handle_simple_irq) - return "simple"; + return "simple "; #ifdef CONFIG_SMP if (handle == handle_percpu_irq) - return "percpu"; + return "percpu "; #endif if (handle == handle_bad_irq) - return "bad "; + return "bad "; return NULL; } _ Patches currently in -mm which might be from mingo@xxxxxxx are origin.patch hrtimer-export-symbols.patch git-acpi.patch fix-drivers-mfd-ucb1x00-corec-irq-probing-bug.patch git-infiniband.patch git-netdev-all.patch fix-for-serial-uart-lockup.patch lock-validator-lockdep-small-xfs-init_rwsem-cleanup.patch swapless-pm-add-r-w-migration-entries.patch i386-break-out-of-recursion-in-stackframe-walk.patch x86-re-enable-generic-numa.patch vdso-randomize-the-i386-vdso-by-moving-it-into-a-vma.patch vdso-randomize-the-i386-vdso-by-moving-it-into-a-vma-tidy.patch vdso-randomize-the-i386-vdso-by-moving-it-into-a-vma-arch_vma_name-fix.patch vdso-randomize-the-i386-vdso-by-moving-it-into-a-vma-vs-x86_64-mm-reliable-stack-trace-support-i386.patch vdso-randomize-the-i386-vdso-by-moving-it-into-a-vma-vs-x86_64-mm-reliable-stack-trace-support-i386-2.patch work-around-ppc64-bootup-bug-by-making-mutex-debugging-save-restore-irqs.patch kernel-kernel-cpuc-to-mutexes.patch cond-resched-might-sleep-fix.patch define-__raw_get_cpu_var-and-use-it.patch ide-cd-end-of-media-error-fix.patch spin-rwlock-init-cleanups.patch lock-validator-introduce-warn_on_oncecond.patch emu10k1-mark-midi_spinlock-as-used.patch time-clocksource-infrastructure.patch sched-comment-bitmap-size-accounting.patch sched-fix-interactive-ceiling-code.patch sched-implement-smpnice.patch sched-protect-calculation-of-max_pull-from-integer-wrap.patch sched-store-weighted-load-on-up.patch sched-add-discrete-weighted-cpu-load-function.patch sched-prevent-high-load-weight-tasks-suppressing-balancing.patch sched-improve-stability-of-smpnice-load-balancing.patch sched-improve-smpnice-load-balancing-when-load-per-task.patch smpnice-dont-consider-sched-groups-which-are-lightly-loaded-for-balancing.patch smpnice-dont-consider-sched-groups-which-are-lightly-loaded-for-balancing-fix.patch sched-modify-move_tasks-to-improve-load-balancing-outcomes.patch sched-avoid-unnecessarily-moving-highest-priority-task-move_tasks.patch sched-avoid-unnecessarily-moving-highest-priority-task-move_tasks-fix-2.patch sched_domain-handle-kmalloc-failure.patch sched_domain-handle-kmalloc-failure-fix.patch sched_domain-dont-use-gfp_atomic.patch sched_domain-use-kmalloc_node.patch sched_domain-allocate-sched_group-structures-dynamically.patch sched-add-above-background-load-function.patch mm-implement-swap-prefetching-fix.patch pi-futex-futex-code-cleanups.patch pi-futex-robust-futex-docs-fix.patch pi-futex-introduce-debug_check_no_locks_freed.patch pi-futex-introduce-warn_on_smp.patch pi-futex-add-plist-implementation.patch pi-futex-scheduler-support-for-pi.patch pi-futex-rt-mutex-core.patch pi-futex-rt-mutex-docs.patch pi-futex-rt-mutex-docs-update.patch pi-futex-rt-mutex-debug.patch pi-futex-rt-mutex-tester.patch pi-futex-rt-mutex-futex-api.patch pi-futex-futex_lock_pi-futex_unlock_pi-support.patch futex_requeue-optimization.patch genirq-rename-desc-handler-to-desc-chip.patch genirq-rename-desc-handler-to-desc-chip-power-fix.patch genirq-rename-desc-handler-to-desc-chip-ia64-fix.patch genirq-rename-desc-handler-to-desc-chip-ia64-fix-2.patch genirq-sem2mutex-probe_sem-probing_active.patch genirq-cleanup-merge-irq_affinity-into-irq_desc.patch genirq-cleanup-remove-irq_descp.patch genirq-cleanup-remove-irq_descp-fix.patch genirq-cleanup-remove-fastcall.patch genirq-cleanup-misc-code-cleanups.patch genirq-cleanup-reduce-irq_desc_t-use-mark-it-obsolete.patch genirq-cleanup-include-linux-irqh.patch genirq-cleanup-merge-irq_dir-smp_affinity_entry-into-irq_desc.patch genirq-cleanup-merge-pending_irq_cpumask-into-irq_desc.patch genirq-cleanup-turn-arch_has_irq_per_cpu-into-config_irq_per_cpu.patch genirq-debug-better-debug-printout-in-enable_irq.patch genirq-add-retrigger-irq-op-to-consolidate-hw_irq_resend.patch genirq-doc-comment-include-linux-irqh-structures.patch genirq-doc-handle_irq_event-and-__do_irq-comments.patch genirq-cleanup-no_irq_type-cleanups.patch genirq-doc-add-design-documentation.patch genirq-add-genirq-sw-irq-retrigger.patch genirq-add-irq_noprobe-support.patch genirq-add-irq_norequest-support.patch genirq-add-irq_noautoen-support.patch genirq-update-copyrights.patch genirq-core.patch genirq-add-irq-chip-support.patch genirq-add-handle_bad_irq.patch genirq-add-irq-wake-power-management-support.patch genirq-add-sa_trigger-support.patch genirq-cleanup-no_irq_type-no_irq_chip-rename.patch genirq-convert-the-x86_64-architecture-to-irq-chips.patch genirq-convert-the-i386-architecture-to-irq-chips.patch genirq-convert-the-i386-architecture-to-irq-chips-fix-2.patch genirq-more-verbose-debugging-on-unexpected-irq-vectors.patch genirq-add-chip-eoi-fastack-fasteoi.patch lock-validator-floppyc-irq-release-fix.patch lock-validator-forcedethc-fix.patch lock-validator-mutex-section-binutils-workaround.patch lock-validator-add-__module_address-method.patch lock-validator-better-lock-debugging.patch lock-validator-locking-api-self-tests.patch lock-validator-locking-init-debugging-improvement.patch lock-validator-beautify-x86_64-stacktraces.patch lock-validator-beautify-x86_64-stacktraces-fix.patch lock-validator-x86_64-document-stack-frame-internals.patch lock-validator-stacktrace.patch lock-validator-stacktrace-build-fix.patch lock-validator-stacktrace-warning-fix.patch lock-validator-fown-locking-workaround.patch lock-validator-sk_callback_lock-workaround.patch lock-validator-irqtrace-core.patch lock-validator-irqtrace-core-powerpc-fix-1.patch lock-validator-irqtrace-core-non-x86-fix.patch lock-validator-irqtrace-core-non-x86-fix-2.patch lock-validator-irqtrace-core-non-x86-fix-3.patch lock-validator-irqtrace-core-remove-softirqc-warn_on.patch lock-validator-irqtrace-cleanup-include-asm-i386-irqflagsh.patch lock-validator-irqtrace-cleanup-include-asm-x86_64-irqflagsh.patch lock-validator-lockdep-add-local_irq_enable_in_hardirq-api.patch lock-validator-add-per_cpu_offset.patch lock-validator-add-per_cpu_offset-fix.patch lock-validator-core.patch lock-validator-procfs.patch lock-validator-core-multichar-fix.patch lock-validator-core-count_matching_names-fix.patch lock-validator-design-docs.patch lock-validator-prove-rwsem-locking-correctness.patch lock-validator-prove-rwsem-locking-correctness-fix.patch lock-validator-prove-rwsem-locking-correctness-powerpc-fix.patch lock-validator-prove-spinlock-rwlock-locking-correctness.patch lock-validator-prove-mutex-locking-correctness.patch lock-validator-prove-mutex-locking-correctness-fix-null-type-name-bug.patch lock-validator-print-all-lock-types-on-sysrq-d.patch lock-validator-x86_64-early-init.patch lock-validator-smp-alternatives-workaround.patch lock-validator-do-not-recurse-in-printk.patch lock-validator-disable-nmi-watchdog-if-config_lockdep.patch lock-validator-disable-nmi-watchdog-if-config_lockdep-i386.patch lock-validator-disable-nmi-watchdog-if-config_lockdep-x86_64.patch lock-validator-special-locking-bdev.patch lock-validator-special-locking-direct-io.patch lock-validator-special-locking-serial.patch lock-validator-special-locking-serial-fix.patch lock-validator-special-locking-dcache.patch lock-validator-special-locking-i_mutex.patch lock-validator-special-locking-s_lock.patch lock-validator-special-locking-futex.patch lock-validator-special-locking-genirq.patch lock-validator-special-locking-completions.patch lock-validator-special-locking-waitqueues.patch lock-validator-special-locking-mm.patch lock-validator-special-locking-slab.patch lock-validator-special-locking-skb_queue_head_init.patch lock-validator-special-locking-net-ipv4-igmpcpatch.patch lock-validator-special-locking-timerc.patch lock-validator-special-locking-schedc.patch lock-validator-special-locking-hrtimerc.patch lock-validator-special-locking-sock_lock_init.patch lock-validator-special-locking-af_unix.patch lock-validator-special-locking-bh_lock_sock.patch lock-validator-special-locking-mmap_sem.patch lock-validator-special-locking-sb-s_umount.patch lock-validator-special-locking-sb-s_umount-fix.patch lock-validator-special-locking-sb-s_umount-2.patch lock-validator-special-locking-sb-s_umount-2-fix.patch lockdep-annotate-rpc_populate-for.patch lock-validator-special-locking-jbd.patch lock-validator-special-locking-posix-timers.patch lock-validator-special-locking-sch_genericc.patch lock-validator-special-locking-xfrm.patch lock-validator-special-locking-sound-core-seq-seq_portsc.patch lock-validator-special-locking-sound-core-seq-seq_devicec.patch lock-validator-special-locking-sound-core-seq-seq_devicec-fix.patch lock-validator-enable-lock-validator-in-kconfig.patch lock-validator-enable-lock-validator-in-kconfig-require-trace_irqflags_support.patch lock-validator-enable-lock-validator-in-kconfig-not-yet.patch lockdep-one-stacktrace-column-if-config_lockdep=y.patch lockdep-further-improve-stacktrace-output.patch lock-validator-irqtrace-support-non-x86-architectures.patch lockdep-stacktrace-oops-workaround.patch lock-validator-fix-rt_hash_lock_sz.patch lock-validator-disable-oprofile-if-lockdep=y.patch lock-validator-select-kallsyms_all.patch lock-validator-special-locking-kgdb.patch detect-atomic-counter-underflows.patch debug-shared-irqs.patch make-frame_pointer-default=y.patch mutex-subsystem-synchro-test-module.patch vdso-print-fatal-signals.patch vdso-improve-print_fatal_signals-support-by-adding-memory-maps.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html