lkml.org 
[lkml]   [2008]   [Mar]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 15/76] IRQ_NOPROBE helper functions
    -stable review patch.  If anyone has any objections, please let us know.
    ---------------------

    From: Ralf Baechle <ralf@linux-mips.org>

    Probing non-ISA interrupts using the handle_percpu_irq as their handle_irq
    method may crash the system because handle_percpu_irq does not check
    IRQ_WAITING. This for example hits the MIPS Qemu configuration.

    This patch provides two helper functions set_irq_noprobe and set_irq_probe to
    set rsp. clear the IRQ_NOPROBE flag. The only current caller is MIPS code
    but this really belongs into generic code.

    As an aside, interrupt probing these days has become a mostly obsolete if not
    dangerous art. I think Linux interrupts should be changed to default to
    non-probing but that's subject of this patch.

    Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
    Acked-and-tested-by: Rob Landley <rob@landley.net>
    Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
    Cc: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Chris Wright <chrisw@sous-sol.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    ---
    include/linux/irq.h | 3 +++
    kernel/irq/chip.c | 36 ++++++++++++++++++++++++++++++++++++
    2 files changed, 39 insertions(+)

    --- linux-2.6.24.3.orig/include/linux/irq.h
    +++ linux-2.6.24.3/include/linux/irq.h
    @@ -367,6 +367,9 @@ set_irq_chained_handler(unsigned int irq
    __set_irq_handler(irq, handle, 1, NULL);
    }

    +extern void set_irq_noprobe(unsigned int irq);
    +extern void set_irq_probe(unsigned int irq);
    +
    /* Handle dynamic irq creation and destruction */
    extern int create_irq(void);
    extern void destroy_irq(unsigned int irq);
    --- linux-2.6.24.3.orig/kernel/irq/chip.c
    +++ linux-2.6.24.3/kernel/irq/chip.c
    @@ -607,3 +607,39 @@ set_irq_chip_and_handler_name(unsigned i
    set_irq_chip(irq, chip);
    __set_irq_handler(irq, handle, 0, name);
    }
    +
    +void __init set_irq_noprobe(unsigned int irq)
    +{
    + struct irq_desc *desc;
    + unsigned long flags;
    +
    + if (irq >= NR_IRQS) {
    + printk(KERN_ERR "Trying to mark IRQ%d non-probeable\n", irq);
    +
    + return;
    + }
    +
    + desc = irq_desc + irq;
    +
    + spin_lock_irqsave(&desc->lock, flags);
    + desc->status |= IRQ_NOPROBE;
    + spin_unlock_irqrestore(&desc->lock, flags);
    +}
    +
    +void __init set_irq_probe(unsigned int irq)
    +{
    + struct irq_desc *desc;
    + unsigned long flags;
    +
    + if (irq >= NR_IRQS) {
    + printk(KERN_ERR "Trying to mark IRQ%d probeable\n", irq);
    +
    + return;
    + }
    +
    + desc = irq_desc + irq;
    +
    + spin_lock_irqsave(&desc->lock, flags);
    + desc->status &= ~IRQ_NOPROBE;
    + spin_unlock_irqrestore(&desc->lock, flags);
    +}
    --


    \
     
     \ /
      Last update: 2008-03-21 23:57    [W:0.023 / U:0.296 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site