Kamalesh Babulal wrote: > * Ingo Molnar <mingo@xxxxxxx> [2008-12-28 13:55:10]: > >> * Kamalesh Babulal <kamalesh@xxxxxxxxxxxxxxxxxx> wrote: >> >>> Hi Ingo, >>> >>> kernel still crashes, with the updated patch. >> hm, i thought we got all bugs fixed - could you try latest tip/master: >> >> http://people.redhat.com/mingo/tip.git/README >> >> does it still crash in the same way? (if yes then please attach the new >> crashlog if it's easy to do) >> >> Thanks, >> >> Ingo > > Hi Ingo/Yinghai, > > I tried today's tip/master against 2.6.28, the kernel still crashes > at boot up. please try following patch on top of tip/master YH --- [PATCH] sparseirq: change arch_init_chip_data to pointer Impact: fix panic some gcc compiler will remove the weak global blank function try to workaround it: 1. one time path: add printk 2. multi time path: change to function pointer Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx> --- arch/x86/kernel/io_apic.c | 7 ++++++- include/linux/irq.h | 2 +- init/main.c | 4 ++++ kernel/irq/handle.c | 5 ++++- 4 files changed, 15 insertions(+), 3 deletions(-) Index: linux-2.6/arch/x86/kernel/io_apic.c =================================================================== --- linux-2.6.orig/arch/x86/kernel/io_apic.c +++ linux-2.6/arch/x86/kernel/io_apic.c @@ -170,6 +170,8 @@ static struct irq_cfg irq_cfgx[NR_IRQS] [15] = { .vector = IRQ15_VECTOR, }, }; +static int real_arch_init_chip_data(struct irq_desc *desc, int cpu); + int __init arch_early_irq_init(void) { struct irq_cfg *cfg; @@ -189,6 +191,9 @@ int __init arch_early_irq_init(void) cpumask_setall(cfg[i].domain); } +#ifdef CONFIG_SPARSE_IRQ + arch_init_chip_data = real_arch_init_chip_data; +#endif return 0; } @@ -232,7 +237,7 @@ static struct irq_cfg *get_one_free_irq_ return cfg; } -int arch_init_chip_data(struct irq_desc *desc, int cpu) +static int real_arch_init_chip_data(struct irq_desc *desc, int cpu) { struct irq_cfg *cfg; Index: linux-2.6/include/linux/irq.h =================================================================== --- linux-2.6.orig/include/linux/irq.h +++ linux-2.6/include/linux/irq.h @@ -196,7 +196,7 @@ struct irq_desc { extern int early_irq_init(void); extern int arch_early_irq_init(void); -extern int arch_init_chip_data(struct irq_desc *desc, int cpu); +extern int (*arch_init_chip_data)(struct irq_desc *desc, int cpu); extern void arch_init_copy_chip_data(struct irq_desc *old_desc, struct irq_desc *desc, int cpu); extern void arch_free_chip_data(struct irq_desc *old_desc, struct irq_desc *desc); Index: linux-2.6/init/main.c =================================================================== --- linux-2.6.orig/init/main.c +++ linux-2.6/init/main.c @@ -544,11 +544,15 @@ void __init __weak thread_info_cache_ini int __init __weak arch_early_irq_init(void) { + printk(KERN_DEBUG "calling __weak arch_early_irq_init()\n"); + return 0; } int __init __weak early_irq_init(void) { + printk(KERN_DEBUG "calling __weak early_irq_init()\n"); + return arch_early_irq_init(); } Index: linux-2.6/kernel/irq/handle.c =================================================================== --- linux-2.6.orig/kernel/irq/handle.c +++ linux-2.6/kernel/irq/handle.c @@ -86,11 +86,14 @@ void init_kstat_irqs(struct irq_desc *de desc->kstat_irqs = (unsigned int *)ptr; } -int __weak arch_init_chip_data(struct irq_desc *desc, int cpu) +static int weak_arch_init_chip_data(struct irq_desc *desc, int cpu) { return 0; } +int (*arch_init_chip_data)(struct irq_desc *desc, int cpu) = + weak_arch_init_chip_data; + static void init_one_irq_desc(int irq, struct irq_desc *desc, int cpu) { memcpy(desc, &irq_desc_init, sizeof(struct irq_desc)); -- To unsubscribe from this list: send the line "unsubscribe linux-next" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html