lkml.org 
[lkml]   [2008]   [Aug]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 22/43] make irq_desc to use dyn_array
    Date
    Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com>
    ---
    include/linux/irq.h | 4 ++++
    kernel/irq/handle.c | 31 +++++++++++++++++++++++++++++++
    2 files changed, 35 insertions(+), 0 deletions(-)

    diff --git a/include/linux/irq.h b/include/linux/irq.h
    index 1d73d1a..5f4b013 100644
    --- a/include/linux/irq.h
    +++ b/include/linux/irq.h
    @@ -179,7 +179,11 @@ struct irq_desc {
    const char *name;
    } ____cacheline_internodealigned_in_smp;

    +#ifdef CONFIG_HAVE_DYN_ARRAY
    +extern struct irq_desc *irq_desc;
    +#else
    extern struct irq_desc irq_desc[NR_IRQS];
    +#endif

    /*
    * Migration helpers for obsolete names, they will go away:
    diff --git a/kernel/irq/handle.c b/kernel/irq/handle.c
    index e9d022c..e94eeca 100644
    --- a/kernel/irq/handle.c
    +++ b/kernel/irq/handle.c
    @@ -48,6 +48,36 @@ handle_bad_irq(unsigned int irq, struct irq_desc *desc)
    * Controller mappings for all interrupt sources:
    */
    int nr_irqs = NR_IRQS;
    +
    +#ifdef CONFIG_HAVE_DYN_ARRAY
    +static struct irq_desc irq_desc_init __initdata = {
    + .status = IRQ_DISABLED,
    + .chip = &no_irq_chip,
    + .handle_irq = handle_bad_irq,
    + .depth = 1,
    + .lock = __SPIN_LOCK_UNLOCKED(irq_desc_init.lock),
    +#ifdef CONFIG_SMP
    + .affinity = CPU_MASK_ALL
    +#endif
    +};
    +
    +static void __init init_work(void *data)
    +{
    + struct dyn_array *da = data;
    + int i;
    + struct irq_desc *desc;
    +
    + desc = *da->name;
    +
    + for (i = 0; i < *da->nr; i++)
    + memcpy(&desc[i], &irq_desc_init, sizeof(struct irq_desc));
    +}
    +
    +struct irq_desc *irq_desc;
    +DEFINE_DYN_ARRAY(irq_desc, sizeof(struct irq_desc), nr_irqs, PAGE_SIZE, init_work);
    +
    +#else
    +
    struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
    [0 ... NR_IRQS-1] = {
    .status = IRQ_DISABLED,
    @@ -60,6 +90,7 @@ struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
    #endif
    }
    };
    +#endif

    /*
    * What should we do if we get a hw irq event on an illegal vector?
    --
    1.5.4.5


    \
     
     \ /
      Last update: 2008-08-10 09:47    [W:0.023 / U:0.796 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site