15 May, 2012

1 commit

  • Export handle_edge_irq() and irq_to_desc() to modules to allow them to
    do things such as

    __irq_set_handler_locked(...., handle_edge_irq);

    This fixes

    ERROR: "handle_edge_irq" [drivers/gpio/gpio-pch.ko] undefined!
    ERROR: "irq_to_desc" [drivers/gpio/gpio-pch.ko] undefined!

    when gpio-pch is being built as a module.

    This was introduced by commit df9541a60af0 ("gpio: pch9: Use proper flow
    type handlers") that added

    __irq_set_handler_locked(d->irq, handle_edge_irq);

    but handle_edge_irq() was not exported for modules (and inlined
    __irq_set_handler_locked() requires irq_to_desc() exported as well)

    Signed-off-by: Jiri Kosina
    Signed-off-by: Linus Torvalds

    Jiri Kosina
     

01 Nov, 2011

1 commit

  • Recent commit "irq: Track the owner of irq descriptor" in
    commit ID b6873807a7143b7 placed module.h into linux/irq.h
    but we are trying to limit module.h inclusion to just C files
    that really need it, due to its size and number of children
    includes. This targets just reversing that include.

    Add in the basic "struct module" since that is all we really need
    to ensure things compile. In theory, b687380 should have added the
    module.h include to the irqdesc.h header as well, but the implicit
    module.h everywhere presence masked this from showing up. So give
    it the "struct module" as well.

    As for the C files, irqdesc.c is only using THIS_MODULE, so it
    does not need module.h - give it export.h instead. The C file
    irq/manage.c is now (as of b687380) using try_module_get and
    module_put and so it needs module.h (which it already has).

    Also convert the irq_alloc_descs variants to macros, since all
    they really do is is call the __irq_alloc_descs primitive.
    This avoids including export.h and no debug info is lost.

    Signed-off-by: Paul Gortmaker

    Paul Gortmaker
     

03 Oct, 2011

1 commit

  • The ARM GIC interrupt controller offers per CPU interrupts (PPIs),
    which are usually used to connect local timers to each core. Each CPU
    has its own private interface to the GIC, and only sees the PPIs that
    are directly connect to it.

    While these timers are separate devices and have a separate interrupt
    line to a core, they all use the same IRQ number.

    For these devices, request_irq() is not the right API as it assumes
    that an IRQ number is visible by a number of CPUs (through the
    affinity setting), but makes it very awkward to express that an IRQ
    number can be handled by all CPUs, and yet be a different interrupt
    line on each CPU, requiring a different dev_id cookie to be passed
    back to the handler.

    The *_percpu_irq() functions is designed to overcome these
    limitations, by providing a per-cpu dev_id vector:

    int request_percpu_irq(unsigned int irq, irq_handler_t handler,
    const char *devname, void __percpu *percpu_dev_id);
    void free_percpu_irq(unsigned int, void __percpu *);
    int setup_percpu_irq(unsigned int irq, struct irqaction *new);
    void remove_percpu_irq(unsigned int irq, struct irqaction *act);
    void enable_percpu_irq(unsigned int irq);
    void disable_percpu_irq(unsigned int irq);

    The API has a number of limitations:
    - no interrupt sharing
    - no threading
    - common handler across all the CPUs

    Once the interrupt is requested using setup_percpu_irq() or
    request_percpu_irq(), it must be enabled by each core that wishes its
    local interrupt to be delivered.

    Based on an initial patch by Thomas Gleixner.

    Signed-off-by: Marc Zyngier
    Cc: linux-arm-kernel@lists.infradead.org
    Link: http://lkml.kernel.org/r/1316793788-14500-2-git-send-email-marc.zyngier@arm.com
    Signed-off-by: Thomas Gleixner

    Marc Zyngier
     

19 Aug, 2011

1 commit


28 Jul, 2011

1 commit

  • Interrupt descriptors can be allocated from modules. The interrupts
    are used by other modules, but we have no refcount on the module which
    provides the interrupts and there is no way to establish one on the
    device level as the interrupt using module is agnostic to the fact
    that the interrupt is provided by a module rather than by some builtin
    interrupt controller.

    To prevent removal of the interrupt providing module, we can track the
    owner of the interrupt descriptor, which also provides the relevant
    irq chip functions in the irq descriptor.

    request/setup_irq() can now acquire a refcount on the owner module to
    prevent unloading. free_irq() drops the refcount.

    Signed-off-by: Sebastian Andrzej Siewior
    Link: http://lkml.kernel.org/r/20110711101731.GA13804@Chamillionaire.breakpoint.cc
    Signed-off-by: Thomas Gleixner

    Sebastian Andrzej Siewior
     

03 Jun, 2011

2 commits

  • When irq_alloc_descs() is called with no base IRQ specified then it will
    search for a range of IRQs starting from a specified base address. In the
    case where an IRQ is specified it still does this search in order to ensure
    that none of the requested range is already allocated and it still uses the
    from parameter to specify the base for the search. This means that in the
    case where a base is specified but from is zero (which is reasonable as
    any IRQ number is in the range specified by a zero from) the function will
    get confused and try to allocate the first suitably sized block of free IRQs
    it finds.

    Instead use a specified IRQ as the base address for the search, and insist
    that any from that is specified can support that IRQ.

    Signed-off-by: Mark Brown
    Link: http://lkml.kernel.org/r/1307037313-15733-1-git-send-email-broonie@opensource.wolfsonmicro.com
    Signed-off-by: Thomas Gleixner

    Mark Brown
     
  • The genirq changes are initializing descriptors for sparse IRQs quite
    differently from how non-sparse (stacked?) IRQs are initialized, with
    the effect that on my platform all IRQs are default-disabled on sparse
    IRQs and default-enabled if non-sparse IRQs are used, crashing some
    GPIO driver.

    Fix this by refactoring the non-sparse IRQs to use the same descriptor
    init function as the sparse IRQs.

    Signed-off: Linus Walleij
    Link: http://lkml.kernel.org/r/1306858479-16622-1-git-send-email-linus.walleij@stericsson.com
    Cc: stable@kernel.org # 2.6.39
    Signed-off-by: Thomas Gleixner

    Linus Walleij
     

18 May, 2011

3 commits

  • Export handle_simple_irq, irq_modify_status, irq_alloc_descs,
    irq_free_descs and generic_handle_irq to allow their usage in
    modules. First user is IIO, which wants to be built modular, but needs
    to be able to create irq chips, allocate and configure interrupt
    descriptors and handle demultiplexing interrupts.

    [ tglx: Moved the uninlinig of generic_handle_irq to a separate patch ]

    Signed-off-by: Jonathan Cameron
    Link: http://lkml.kernel.org/r/%3C1305711544-505-1-git-send-email-jic23%40cam.ac.uk%3E
    Signed-off-by: Thomas Gleixner

    Jonathan Cameron
     
  • generic_handle_irq() is missing a NULL pointer check for the result of
    irq_to_desc. This was a not a big problem, but we want to expose it to
    drivers, so we better have sanity checks in place. Add a return value
    as well, which indicates that the irq number was valid and the handler
    was invoked.

    Based on the pure code move from Jonathan Cameron.

    Signed-off-by: Thomas Gleixner
    Cc: Jonathan Cameron

    Thomas Gleixner
     
  • kernel/irq/ is only built when CONFIG_GENERIC_HARDIRQS=y. So making
    code inside of kernel/irq/ conditional on CONFIG_GENERIC_HARDIRQS is
    pointless.

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     

28 Mar, 2011

1 commit


27 Mar, 2011

1 commit


24 Mar, 2011

1 commit


22 Feb, 2011

1 commit

  • The runtime expansion of nr_irqs does not take into account that
    bitmap_find_next_zero_area() returns "start" + size in case the search
    for an matching zero area fails. That results in a start value which
    can be completely off and is not covered by the following
    expand_nr_irqs() and possibly outside of the absolute limit. But we
    use it without further checking.

    Use IRQ_BITMAP_BITS as the limit for the bitmap search and expand
    nr_irqs when the start bit is beyond nr_irqs. So start is always
    pointing to the correct area in the bitmap. nr_irqs is just the limit
    for irq enumerations, not the real limit for the irq space.

    [ tglx: Let irq_expand_nr_irqs() take the new upper end so we do not
    expand nr_irqs more than necessary. Made changelog readable ]

    Signed-off-by: Yinghai Lu
    LKML-Reference:
    Signed-off-by: Thomas Gleixner

    Yinghai Lu
     

19 Feb, 2011

7 commits

  • Most of the managing functions get the irq descriptor and lock it -
    either with or without buslock. Instead of open coding this over and
    over provide a common function to do that.

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     
  • Force the usage of wrappers by another nasty CPP substitution.

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     
  • Keep status in sync until all abusers are fixed.

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     
  • The irq_desc.status field will either go away or renamed to
    settings. Anyway we need to maintain compatibility to avoid breaking
    the world and some more. While moving bits into the core, I need to
    avoid that I use any of the still existing IRQ_ bits in the core code
    by typos. So that file will hold the inline wrappers and some nasty
    CPP tricks to break the build when typoed.

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     
  • We face more and more the requirement to expand nr_irqs at
    runtime. The reason are irq expanders which can not be detected in the
    early boot stage. So we speculate nr_irqs to have enough room. Further
    Xen needs extra irq numbers and we really want to avoid adding more
    "detection" code into the early boot. There is no real good reason why
    we need to limit nr_irqs at early boot.

    Allow the allocation code to expand nr_irqs. We have already 8k extra
    number space in the allocation bitmap, so lets use it.

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     
  • Reason: Further patches are conflicting with mainline fixes

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     
  • Lars-Peter Clausen pointed out:

    I stumbled upon this while looking through the existing archs using
    SPARSE_IRQ. Even with SPARSE_IRQ the NR_IRQS is still the upper
    limit for the number of IRQs.

    Both PXA and MMP set NR_IRQS to IRQ_BOARD_START, with
    IRQ_BOARD_START being the number of IRQs used by the core.

    In various machine files the nr_irqs field of the ARM machine
    defintion struct is then set to "IRQ_BOARD_START + NR_BOARD_IRQS".

    As a result "nr_irqs" will greater then NR_IRQS which then again
    causes the "allocated_irqs" bitmap in the core irq code to be
    accessed beyond its size overwriting unrelated data.

    The core code really misses a sanity check there.

    This went unnoticed so far as by chance the compiler/linker places
    data behind that bitmap which gets initialized later on those affected
    platforms.

    So the obvious fix would be to add a sanity check in early_irq_init()
    and break all affected platforms. Though that check wants to be
    backported to stable as well, which will require to fix all known
    problematic platforms and probably some more yet not known ones as
    well. Lots of churn.

    A way simpler solution is to allocate a slightly larger bitmap and
    avoid the whole churn w/o breaking anything. Add a few warnings when
    an arch returns utter crap.

    Reported-by: Lars-Peter Clausen
    Signed-off-by: Thomas Gleixner
    Cc: stable@kernel.org # .37
    Cc: Haojian Zhuang
    Cc: Eric Miao
    Cc: Peter Zijlstra

    Thomas Gleixner
     

09 Feb, 2011

1 commit

  • CONFIG_KSTAT_IRQS_ONDEMAND does not exist. It's not worth to implement
    it. Use sparse irqs if you care about memory consumption of the
    interrupt layer.

    Found by undertaker: http://vamos.informatik.uni-erlangen.de/trac/undertaker

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     

14 Jan, 2011

1 commit

  • Use modern per_cpu API to increment {soft|hard}irq counters, and use
    per_cpu allocation for (struct irq_desc)->kstats_irq instead of an array.

    This gives better SMP/NUMA locality and saves few instructions per irq.

    With small nr_cpuids values (8 for example), kstats_irq was a small array
    (less than L1_CACHE_BYTES), potentially source of false sharing.

    In the !CONFIG_SPARSE_IRQ case, remove the huge, NUMA/cache unfriendly
    kstat_irqs_all[NR_IRQS][NR_CPUS] array.

    Note: we still populate kstats_irq for all possible irqs in
    early_irq_init(). We probably could use on-demand allocations. (Code
    included in alloc_descs()). Problem is not all IRQS are used with a prior
    alloc_descs() call.

    kstat_irqs_this_cpu() is not used anymore, remove it.

    Signed-off-by: Eric Dumazet
    Reviewed-by: Christoph Lameter
    Cc: Ingo Molnar
    Cc: Andi Kleen
    Cc: Tejun Heo
    Cc: Thomas Gleixner
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Eric Dumazet
     

28 Oct, 2010

1 commit

  • In /proc/stat, the number of per-IRQ event is shown by making a sum each
    irq's events on all cpus. But we can make use of kstat_irqs().

    kstat_irqs() do the same calculation, If !CONFIG_GENERIC_HARDIRQ,
    it's not a big cost. (Both of the number of cpus and irqs are small.)

    If a system is very big and CONFIG_GENERIC_HARDIRQ, it does

    for_each_irq()
    for_each_cpu()
    - look up a radix tree
    - read desc->irq_stat[cpu]
    This seems not efficient. This patch adds kstat_irqs() for
    CONFIG_GENRIC_HARDIRQ and change the calculation as

    for_each_irq()
    look up radix tree
    for_each_cpu()
    - read desc->irq_stat[cpu]

    This reduces cost.

    A test on (4096cpusp, 256 nodes, 4592 irqs) host (by Jack Steiner)

    %time cat /proc/stat > /dev/null

    Before Patch: 2.459 sec
    After Patch : .561 sec

    [akpm@linux-foundation.org: unexport kstat_irqs, coding-style tweaks]
    [akpm@linux-foundation.org: fix unused variable 'per_irq_sum']
    Signed-off-by: KAMEZAWA Hiroyuki
    Tested-by: Jack Steiner
    Acked-by: Jack Steiner
    Cc: Yinghai Lu
    Cc: Ingo Molnar
    Cc: Thomas Gleixner
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    KAMEZAWA Hiroyuki
     

13 Oct, 2010

1 commit


12 Oct, 2010

15 commits

  • The allocator functions are now called outside of preempt disabled
    regions. Switch to GFP_KERNEL.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • No callers from atomic regions.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • The move_irq_desc() function was only used due to the problem that the
    allocator did not free the old descriptors. So the descriptors had to
    be moved in create_irq_nr(). That's history.

    The code would have never been able to move active interrupt
    descriptors on affinity settings. That can be done in a completely
    different way w/o all this horror.

    Remove all of it.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • Use the cleanup functions of the dynamic allocator. No need to have
    separate implementations.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • This function should have not been there in the first place.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • sparse irq sets up NR_IRQS_LEGACY irq descriptors and archs then go
    ahead and allocate more.

    Use the unused return value of arch_probe_nr_irqs() to let the
    architecture return the number of early allocations. Fix up all users.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • Make irq_to_desc_alloc_node() a wrapper around the new allocator.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • Mark a range of interrupts as allocated. In the SPARSE_IRQ=n case we
    need this to update the bitmap for the legacy irqs so the enumerator
    via irq_get_next_irq() works.

    Signed-off-by: Thomas Gleixner

    Thomas Gleixner
     
  • Use the allocator bitmap to lookup active interrupts.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • /proc/irq never removes any entries, but when irq descriptors can be
    freed for real this is necessary. Otherwise we'd reference a freed
    descriptor in /proc/irq/N

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • The current sparse_irq allocator has several short comings due to
    failures in the design or the lack of it:

    - Requires iteration over the number of active irqs to find a free slot
    (Some architectures have grown their own workarounds for this)
    - Removal of entries is not possible
    - Racy between create_irq_nr and destroy_irq (plugged by horrible
    callbacks)
    - Migration of active irq descriptors is not possible
    - No bulk allocation of irq ranges
    - Sprinkeled irq_desc references all over the place outside of kernel/irq/
    (The previous chip functions series is addressing this issue)

    Implement a sane allocator which fixes the above short comings (though
    migration of active descriptors needs a full tree wide cleanup of the
    direct and mostly unlocked access to irq_desc).

    The new allocator still uses a radix_tree, but uses a bitmap for
    keeping track of allocated irq numbers. That allows:

    - Fast lookup of a free slot
    - Allows the removal of descriptors
    - Prevents the create/destroy race
    - Bulk allocation of consecutive irq ranges
    - Basic design is ready for migration of life descriptors after
    further cleanups

    The bitmap is also used in the SPARSE_IRQ=n case for lookup and
    raceless (de)allocation of irq numbers. So it removes the requirement
    for looping through the descriptor array to find slots.

    Right now it uses sparse_irq_lock to protect the bitmap and the radix
    tree, but after cleaning up all users we should be able convert that
    to a mutex and to switch the radix_tree and decriptor allocations to
    GFP_KERNEL.

    [ Folded in a bugfix from Yinghai Lu ]

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • Arch code sets it's own irq_desc.status flags right after boot and for
    dynamically allocated interrupts. That might involve iterating over a
    huge array.

    Allow ARCH_IRQ_INIT_FLAGS to set separate flags aside of IRQ_DISABLED
    which is the default.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • The statistics accessor is only used by proc/stats and
    show_interrupts(). Both are compiled in.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • early_init_irq_lock_class() is called way before anything touches the
    irq descriptors. In case of SPARSE_IRQ=y this is a NOP operation
    because the radix tree is empty at this point. For the SPARSE_IRQ=n
    case it's sufficient to set the lock class in early_init_irq().

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner
     
  • kernel/irq/handle.c has become a dumpground for random code in random
    order. Split out the irq descriptor management and the dummy irq_chip
    implementation into separate files. Cleanup the include maze while at
    it.

    No code change.

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Ingo Molnar

    Thomas Gleixner