• Y
    generic: add dyn_array support · 3ddfda11
    Yinghai Lu 提交于
    Allow crazy big arrays via bootmem at init stage.
    Architectures use CONFIG_HAVE_DYN_ARRAY to enable it.
    
    usage:
    
    | 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->lock),
    | #ifdef CONFIG_SMP
    |        .affinity = CPU_MASK_ALL
    | #endif
    | };
    |
    | static void __init init_work(void *data)
    | {
    |        struct dyn_array *da = data;
    |        struct  irq_desc *desc;
    |        int i;
    |
    |        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);
    
    after pre_alloc_dyn_array() after setup_arch(), the array is ready to be
    used.
    
    Via this facility we can replace irq_desc[NR_IRQS] array with dyn_array
    irq_desc[nr_irqs].
    
    v2: remove _nopanic in pre_alloc_dyn_array()
    Signed-off-by: NYinghai Lu <yhlu.kernel@gmail.com>
    Signed-off-by: NIngo Molnar <mingo@elte.hu>
    3ddfda11
init.h 11.6 KB