lkml.org 
[lkml]   [2008]   [Aug]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 37/42] x86_64: introduce irq_desc_with_new
    Date
    So could only call that one time

    Singed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
    ---
    arch/x86/kernel/io_apic_64.c | 18 ++++++++++++------
    arch/x86/kernel/irq_64.c | 4 ++--
    arch/x86/kernel/irqinit_64.c | 3 ++-
    fs/proc/proc_misc.c | 2 +-
    include/linux/irq.h | 2 +-
    kernel/irq/chip.c | 5 +++++
    kernel/irq/handle.c | 23 +++++------------------
    7 files changed, 28 insertions(+), 29 deletions(-)

    diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c
    index 1466e4b..f8baf58 100644
    --- a/arch/x86/kernel/io_apic_64.c
    +++ b/arch/x86/kernel/io_apic_64.c
    @@ -1117,7 +1117,12 @@ static void ioapic_register_intr(int irq, unsigned long trigger)
    {
    struct irq_desc *desc;

    - desc = irq_desc(irq);
    + /* first time to use this irq_desc */
    + if (irq < 16)
    + desc = irq_desc(irq);
    + else
    + desc = irq_desc_with_new(irq);
    +
    if (trigger)
    desc->status |= IRQ_LEVEL;
    else
    @@ -3086,8 +3091,6 @@ void __init setup_ioapic_dest(void)
    continue;
    irq = pin_2_irq(irq_entry, ioapic, pin);

    - desc = irq_desc(irq);
    -
    /* setup_IO_APIC_irqs could fail to get vector for some device
    * when you have too many devices, because at that time only boot
    * cpu is online.
    @@ -3098,13 +3101,16 @@ void __init setup_ioapic_dest(void)
    irq_trigger(irq_entry),
    irq_polarity(irq_entry));
    #ifdef CONFIG_INTR_REMAP
    - else if (intr_remapping_enabled)
    + else if (intr_remapping_enabled) {
    + desc = irq_desc(irq);
    set_ir_ioapic_affinity_irq(irq, desc, TARGET_CPUS);
    + }
    #endif
    - else
    + else {
    + desc = irq_desc(irq);
    set_ioapic_affinity_irq(irq, desc, TARGET_CPUS);
    + }
    }
    -
    }
    }
    #endif
    diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c
    index 42b2c12..7db6843 100644
    --- a/arch/x86/kernel/irq_64.c
    +++ b/arch/x86/kernel/irq_64.c
    @@ -83,7 +83,7 @@ int show_interrupts(struct seq_file *p, void *v)

    if (i < nr_irqs) {
    unsigned any_count = 0;
    - struct irq_desc *desc = irq_desc_without_new(i);
    + struct irq_desc *desc = irq_desc(i);

    if (!desc)
    return 0;
    @@ -206,7 +206,7 @@ asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
    stack_overflow_check(regs);
    #endif

    - desc = irq_desc_without_new(irq);
    + desc = irq_desc(irq);
    if (likely(desc))
    generic_handle_irq(irq, desc);
    else {
    diff --git a/arch/x86/kernel/irqinit_64.c b/arch/x86/kernel/irqinit_64.c
    index 4c55edf..45fca9d 100644
    --- a/arch/x86/kernel/irqinit_64.c
    +++ b/arch/x86/kernel/irqinit_64.c
    @@ -143,7 +143,8 @@ static void __init init_ISA_irqs (void)
    init_8259A(0);

    for (i = 0; i < 16; i++) {
    - struct irq_desc *desc = irq_desc(i);
    + /* first time call this irq_desc */
    + struct irq_desc *desc = irq_desc_with_new(i);

    desc->status = IRQ_DISABLED;
    desc->action = NULL;
    diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
    index e16c20a..c9ee1f7 100644
    --- a/fs/proc/proc_misc.c
    +++ b/fs/proc/proc_misc.c
    @@ -570,7 +570,7 @@ static int show_stat(struct seq_file *p, void *v)
    /* sum again ? it could be updated? have another field in irq_desc?*/
    for (j = 0; j < nr_irqs; j++) {
    per_irq_sum = 0;
    - desc = irq_desc_without_new(j);
    + desc = irq_desc(j);

    if (desc)
    for_each_possible_cpu(i) {
    diff --git a/include/linux/irq.h b/include/linux/irq.h
    index d04182a..0d9578e 100644
    --- a/include/linux/irq.h
    +++ b/include/linux/irq.h
    @@ -205,7 +205,7 @@ struct irq_desc {
    } ____cacheline_internodealigned_in_smp;

    extern struct irq_desc *irq_desc(unsigned int irq);
    -extern struct irq_desc *irq_desc_without_new(unsigned int irq);
    +extern struct irq_desc *irq_desc_with_new(unsigned int irq);

    #ifndef CONFIG_HAVE_SPARSE_IRQ

    diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
    index dcac270..bfd02f7 100644
    --- a/kernel/irq/chip.c
    +++ b/kernel/irq/chip.c
    @@ -36,6 +36,11 @@ void dynamic_irq_init(unsigned int irq)

    /* Ensure we don't have left over values from a previous use of this irq */
    desc = irq_desc(irq);
    + if (!desc) {
    + /* first time to use this irq_desc */
    + desc = irq_desc_with_new(irq);
    + return;
    + }
    spin_lock_irqsave(&desc->lock, flags);
    desc->status = IRQ_DISABLED;
    desc->chip = &no_irq_chip;
    diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
    index e9b54a5..194d815 100644
    --- a/kernel/irq/handle.c
    +++ b/kernel/irq/handle.c
    @@ -150,7 +150,7 @@ early_param("nr_irq_desc", parse_nr_irq_desc);
    struct irq_desc *irq_descX;
    DEFINE_DYN_ARRAY(irq_descX, sizeof(struct irq_desc), nr_irq_desc, PAGE_SIZE, init_work);

    -struct irq_desc *irq_desc_without_new(unsigned int irq)
    +struct irq_desc *irq_desc(unsigned int irq)
    {
    struct irq_desc *desc;

    @@ -168,7 +168,7 @@ struct irq_desc *irq_desc_without_new(unsigned int irq)
    }
    return NULL;
    }
    -struct irq_desc *irq_desc(unsigned int irq)
    +struct irq_desc *irq_desc_with_new(unsigned int irq)
    {
    struct irq_desc *desc, *desc_pri;
    int i;
    @@ -185,6 +185,7 @@ struct irq_desc *irq_desc(unsigned int irq)

    if (desc->irq == -1U) {
    desc->irq = irq;
    + printk("found new irq_desc for irq %d\n", desc->irq);
    return desc;
    }
    desc_pri = desc;
    @@ -235,21 +236,7 @@ struct irq_desc *irq_desc(unsigned int irq)

    desc->irq = irq;
    desc_pri->next = desc;
    - {
    - /* double check if some one mess up the list */
    - struct irq_desc *desc;
    - int count = 0;
    -
    - desc = &irq_descX[0];
    - while (desc) {
    - printk("1 found irq_desc for irq %d\n", desc->irq);
    - if (desc->next)
    - printk("1 found irq_desc for irq %d and next will be irq %d\n", desc->irq, desc->next->irq);
    - desc = desc->next;
    - count++;
    - }
    - printk("1 all preallocted %d\n", count);
    - }
    + printk("1 found new irq_desc for irq %d and pri will be irq %d\n", desc->irq, desc_pri->irq);

    return desc;
    }
    @@ -285,7 +272,7 @@ struct irq_desc *irq_desc(unsigned int irq)

    return NULL;
    }
    -struct irq_desc *irq_desc_without_new(unsigned int irq)
    +struct irq_desc *irq_desc_with_new(unsigned int irq)
    {
    return irq_desc(irq);
    }
    --
    1.5.4.5


    \
     
     \ /
      Last update: 2008-08-09 00:13    [W:0.091 / U:0.848 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site