03 May, 2007

1 commit

  • set_irq_msi() currently connects an irq_desc to an msi_desc. The archs call
    it at some point in their setup routine, and then the generic code sets up the
    reverse mapping from the msi_desc back to the irq.

    set_irq_msi() should do both connections, making it the one and only call
    required to connect an irq with it's MSI desc and vice versa.

    The arch code MUST call set_irq_msi(), and it must do so only once it's sure
    it's not going to fail the irq allocation.

    Given that there's no need for the arch to return the irq anymore, the return
    value from the arch setup routine just becomes 0 for success and anything else
    for failure.

    Signed-off-by: Michael Ellerman
    Signed-off-by: Greg Kroah-Hartman

    Michael Ellerman
     

17 Feb, 2007

3 commits

  • Use mask_ack_irq() where possible.

    Signed-off-by: Jan Beulich
    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jan Beulich
     
  • Fix kernel-doc warnings in IRQ management.

    Signed-off-by: Randy Dunlap
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Randy Dunlap
     
  • Never mask interrupts immediately upon request. Disabling interrupts in
    high-performance codepaths is rare, and on the other hand this change could
    recover lost edges (or even other types of lost interrupts) by conservatively
    only masking interrupts after they happen. (NOTE: with this change the
    highlevel irq-disable code still soft-disables this IRQ line - and if such an
    interrupt happens then the IRQ flow handler keeps the IRQ masked.)

    Mark i8529A controllers as 'never loses an edge'.

    Signed-off-by: Ingo Molnar
    Cc: Thomas Gleixner
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     

08 Feb, 2007

1 commit

  • We need to be able to get from an irq number to a struct msi_desc.
    The msi_desc array in msi.c had several short comings the big one was
    that it could not be used outside of msi.c. Using irq_data in struct
    irq_desc almost worked except on some architectures irq_data needs to
    be used for something else.

    So this patch adds a msi_desc pointer to irq_desc, adds the appropriate
    wrappers and changes all of the msi code to use them.

    The dynamic_irq_init/cleanup code was tweaked to ensure the new
    field is left in a well defined state.

    Signed-off-by: Eric W. Biederman
    Acked-by: Ingo Molnar
    Signed-off-by: Greg Kroah-Hartman

    Eric W. Biederman
     

23 Dec, 2006

1 commit

  • The sanity check for no_irq_chip in __set_irq_hander() is unconditional on
    both install and uninstall of an handler. This triggers false warnings and
    replaces no_irq_chip by dummy_irq_chip in the uninstall case.

    Check only, when a real handler is installed.

    Signed-off-by: Thomas Gleixner
    Acked-by: Ingo Molnar
    Acked-by: Sylvain Munaut
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Thomas Gleixner
     

21 Dec, 2006

1 commit


17 Nov, 2006

1 commit

  • I got an oops when booting 2.6.19-rc5-mm1 on my ia64 machine.

    Below is the log.

    Oops 11012296146944 [1]
    Modules linked in: binfmt_misc dm_mirror dm_multipath dm_mod thermal processor f
    an container button sg eepro100 e100 mii

    Pid: 0, CPU 0, comm: swapper
    psr : 0000121008022038 ifs : 800000000000040b ip : [] Not
    tainted
    ip is at __do_IRQ+0x371/0x3e0
    unat: 0000000000000000 pfs : 000000000000040b rsc : 0000000000000003
    rnat: 656960155aa56aa5 bsps: a00000010058b890 pr : 656960155aa55a65
    ldrs: 0000000000000000 ccv : 0000000000000000 fpsr: 0009804c0270033f
    csd : 0000000000000000 ssd : 0000000000000000
    b0 : a0000001000e1390 b6 : a0000001005beac0 b7 : e00000007f01aa00
    f6 : 000000000000000000000 f7 : 0ffe69090000000000000
    f8 : 1000a9090000000000000 f9 : 0ffff8000000000000000
    f10 : 1000a908ffffff6f70000 f11 : 1003e0000000000000909
    r1 : a000000100fbbff0 r2 : 0000000000010002 r3 : 0000000000010001
    r8 : fffffffffffbffff r9 : a000000100bd8060 r10 : a000000100dd83b8
    r11 : fffffffffffeffff r12 : a000000100bcbbb0 r13 : a000000100bc4000
    r14 : 0000000000010000 r15 : 0000000000010000 r16 : a000000100c01aa8
    r17 : a000000100d2c350 r18 : 0000000000000000 r19 : a000000100d2c300
    r20 : a000000100c01a88 r21 : 0000000080010100 r22 : a000000100c01ac0
    r23 : a0000001000108e0 r24 : e000000477980004 r25 : 0000000000000000
    r26 : 0000000000000000 r27 : e00000000913400c r28 : e0000004799ee51c
    r29 : e0000004778b87f0 r30 : a000000100d2c300 r31 : a00000010005c7e0

    Call Trace:
    [] show_stack+0x40/0xa0
    sp=a000000100bcb760 bsp=a000000100bc4f40
    [] show_regs+0x840/0x880
    sp=a000000100bcb930 bsp=a000000100bc4ee8
    [] die+0x250/0x320
    sp=a000000100bcb930 bsp=a000000100bc4ea0
    [] ia64_do_page_fault+0x8d0/0xa20
    sp=a000000100bcb950 bsp=a000000100bc4e50
    [] ia64_leave_kernel+0x0/0x290
    sp=a000000100bcb9e0 bsp=a000000100bc4e50
    [] __do_IRQ+0x370/0x3e0
    sp=a000000100bcbbb0 bsp=a000000100bc4df0
    [] ia64_handle_irq+0x170/0x220
    sp=a000000100bcbbb0 bsp=a000000100bc4dc0
    [] ia64_leave_kernel+0x0/0x290
    sp=a000000100bcbbb0 bsp=a000000100bc4dc0
    [] ia64_pal_call_static+0x90/0xc0
    sp=a000000100bcbd80 bsp=a000000100bc4d78
    [] default_idle+0x90/0x160
    sp=a000000100bcbd80 bsp=a000000100bc4d58
    [] cpu_idle+0x1f0/0x440
    sp=a000000100bcbe20 bsp=a000000100bc4d18
    [] rest_init+0xc0/0xe0
    sp=a000000100bcbe20 bsp=a000000100bc4d00
    [] start_kernel+0x6a0/0x6c0
    sp=a000000100bcbe20 bsp=a000000100bc4ca0
    [] __end_ivt_text+0x6d0/0x6f0
    sp=a000000100bcbe30 bsp=a000000100bc4c00
    Kernel panic - not syncing: Aiee, killing interrupt handler!

    The root cause is that some irq_chip variables, especially ia64_msi_chip,
    initiate their memeber end to point to NULL. __do_IRQ doesn't check
    if irq_chip->end is null and just calls it after processing the interrupt.

    As irq_chip->end is called at many places, so I fix it by reinitiating
    irq_chip->end to dummy_irq_chip.end, e.g., a noop function.

    Signed-off-by: Zhang Yanmin
    Cc: Thomas Gleixner
    Cc: Ingo Molnar
    Cc: "Luck, Tony"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Zhang, Yanmin
     

17 Oct, 2006

1 commit

  • Introduce desc->name and eliminate the handle_irq_name() hack. Add
    set_irq_chip_and_handler_name() to set the flow type and name at once.

    Signed-off-by: Ingo Molnar
    Acked-by: Thomas Gleixner
    Cc: "Eric W. Biederman"
    Cc: Matthew Wilcox
    Cc: Kyle McMartin
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     

05 Oct, 2006

2 commits

  • Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
    of passing regs around manually through all ~1800 interrupt handlers in the
    Linux kernel.

    The regs pointer is used in few places, but it potentially costs both stack
    space and code to pass it around. On the FRV arch, removing the regs parameter
    from all the genirq function results in a 20% speed up of the IRQ exit path
    (ie: from leaving timer_interrupt() to leaving do_IRQ()).

    Where appropriate, an arch may override the generic storage facility and do
    something different with the variable. On FRV, for instance, the address is
    maintained in GR28 at all times inside the kernel as part of general exception
    handling.

    Having looked over the code, it appears that the parameter may be handed down
    through up to twenty or so layers of functions. Consider a USB character
    device attached to a USB hub, attached to a USB controller that posts its
    interrupts through a cascaded auxiliary interrupt controller. A character
    device driver may want to pass regs to the sysrq handler through the input
    layer which adds another few layers of parameter passing.

    I've build this code with allyesconfig for x86_64 and i386. I've runtested the
    main part of the code on FRV and i386, though I can't test most of the drivers.
    I've also done partial conversion for powerpc and MIPS - these at least compile
    with minimal configurations.

    This will affect all archs. Mostly the changes should be relatively easy.
    Take do_IRQ(), store the regs pointer at the beginning, saving the old one:

    struct pt_regs *old_regs = set_irq_regs(regs);

    And put the old one back at the end:

    set_irq_regs(old_regs);

    Don't pass regs through to generic_handle_irq() or __do_IRQ().

    In timer_interrupt(), this sort of change will be necessary:

    - update_process_times(user_mode(regs));
    - profile_tick(CPU_PROFILING, regs);
    + update_process_times(user_mode(get_irq_regs()));
    + profile_tick(CPU_PROFILING);

    I'd like to move update_process_times()'s use of get_irq_regs() into itself,
    except that i386, alone of the archs, uses something other than user_mode().

    Some notes on the interrupt handling in the drivers:

    (*) input_dev() is now gone entirely. The regs pointer is no longer stored in
    the input_dev struct.

    (*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking. It does
    something different depending on whether it's been supplied with a regs
    pointer or not.

    (*) Various IRQ handler function pointers have been moved to type
    irq_handler_t.

    Signed-Off-By: David Howells
    (cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)

    David Howells
     
  • Typedef the IRQ flow handler function type.

    Signed-Off-By: David Howells
    (cherry picked from 8e973fbdf5716b93a0a8c0365be33a31ca0fa351 commit)

    David Howells
     

04 Oct, 2006

2 commits

  • Currently msi.c is doing sanity checks that make certain before an irq is
    destroyed it has no more users.

    By adding irq_has_action I can perform the test is a generic way, instead of
    relying on a msi specific data structure.

    By performing the core check in dynamic_irq_cleanup I ensure every user of
    dynamic irqs has a test present and we don't free resources that are in use.

    In msi.c this allows me to kill the attrib.state member of msi_desc and all of
    the assciated code to maintain it.

    To keep from freeing data structures when irq cleanup code is called to soon
    changing dyanamic_irq_cleanup is insufficient because there are msi specific
    data structures that are also not safe to free.

    Signed-off-by: Eric W. Biederman
    Cc: Ingo Molnar
    Cc: Tony Luck
    Cc: Andi Kleen
    Cc: Thomas Gleixner
    Cc: Greg KH
    Cc: Benjamin Herrenschmidt
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric W. Biederman
     
  • With the msi support comes a new concept in irq handling, irqs that are
    created dynamically at run time.

    Currently the msi code allocates irqs backwards. First it allocates a
    platform dependent routing value for an interrupt the ``vector'' and then it
    figures out from the vector which irq you are on.

    This msi backwards allocator suffers from two basic problems. The allocator
    suffers because it is trying to do something that is architecture specific in
    a generic way making it brittle, inflexible, and tied to tightly to the
    architecture implementation. The alloctor also suffers from it's very
    backwards nature as it has tied things together that should have no
    dependencies.

    To solve the basic dynamic irq allocation problem two new architecture
    specific functions are added: create_irq and destroy_irq.

    create_irq takes no input and returns an unused irq number, that won't be
    reused until it is returned to the free poll with destroy_irq. The irq then
    can be used for any purpose although the only initial consumer is the msi
    code.

    destroy_irq takes an irq number allocated with create_irq and returns it to
    the free pool.

    Making this functionality per architecture increases the simplicity of the irq
    allocation code and increases it's flexibility.

    dynamic_irq_init() and dynamic_irq_cleanup() are added to automate the
    irq_desc initializtion that should happen for dynamic irqs.

    Signed-off-by: Eric W. Biederman
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: Benjamin Herrenschmidt
    Cc: Rajesh Shah
    Cc: Andi Kleen
    Cc: "Protasevich, Natalie"
    Cc: "Luck, Tony"
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric W. Biederman
     

30 Sep, 2006

2 commits


19 Sep, 2006

1 commit


03 Jul, 2006

1 commit


02 Jul, 2006

1 commit

  • Patch from Thomas Gleixner

    From: Thomas Gleixner

    ARM has a couple of really dumb interrupt controllers.
    Implement a generic one and fixup the ARM migration. ARM reused
    the no_irq_chip for this purpose, but this does not work out
    for platforms which are not converted to the new interrupt
    type handling model.

    Signed-off-by: Thomas Gleixner
    Signed-off-by: Ingo Molnar
    Signed-off-by: Russell King

    Thomas Gleixner
     

30 Jun, 2006

3 commits

  • 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.

    Signed-off-by: Ingo Molnar
    Cc: Benjamin Herrenschmidt
    Cc: Roland Dreier
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ingo Molnar
     
  • Note when a disable interrupt happened with the fasteoi handler as well so
    that delayed disable can be implemented with fasteoi-type controllers.

    Signed-off-by: Benjamin Herrenschmidt
    Acked-by: Ingo Molnar
    Cc: Thomas Gleixner
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Benjamin Herrenschmidt
     
  • Enable platforms to use the irq-chip and irq-flow abstractions: allow setting
    of the chip, the type and provide highlevel handlers for common irq-flows.

    [rostedt@goodmis.org: misroute-irq: Don't call desc->chip->end because of edge interrupts]
    Signed-off-by: Thomas Gleixner
    Signed-off-by: Ingo Molnar
    Cc: Benjamin Herrenschmidt
    Signed-off-by: Steven Rostedt
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Thomas Gleixner