----- "Ken'ichi Ohmichi" <oomichi@xxxxxxxxxxxxxxxxx> wrote: > Hi, > > The latest crash (version 4.0-8.11) fails on i386 linux-2.6.30: > > # crash -s vmlinux vmcore > > crash: cannot resolve: "hardirq_ctx" > > # > > The reason is that both hardirq_ctx and softirq_ctx have been defined > by DEFINE_PER_CPU() since linux-2.6.30. This change is the following: > > --- a/arch/x86/kernel/irq_32.c > +++ b/arch/x86/kernel/irq_32.c > [snip] > -static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly; > -static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly; > +static DEFINE_PER_CPU(union irq_ctx *, hardirq_ctx); > +static DEFINE_PER_CPU(union irq_ctx *, softirq_ctx); > > By this patch, the crash utility can read the dumpfile of i386 > linux-2.6.30. Hi Ken'ichi, I appreciate the patch -- queued for the next release. Thanks, Dave > > > Thanks > Ken'ichi Ohmichi > > Signed-off-by: Ken'ichi Ohmichi <oomichi@xxxxxxxxxxxxxxxxx> > --- > --- a/task.c 2009-07-01 00:31:20.000000000 +0900 > +++ b/task.c 2009-07-06 15:37:35.000000000 +0900 > @@ -488,10 +488,27 @@ irqstacks_init(void) > > thread_info_buf = GETBUF(SIZE(irq_ctx)); > > - i = get_array_length("hardirq_ctx", NULL, 0); > - get_symbol_data("hardirq_ctx", > - sizeof(long)*(i <= NR_CPUS ? i : NR_CPUS), > - &tt->hardirq_ctx[0]); > + if (symbol_exists("hardirq_ctx")) { > + i = get_array_length("hardirq_ctx", NULL, 0); > + get_symbol_data("hardirq_ctx", > + sizeof(long)*(i <= NR_CPUS ? i : NR_CPUS), > + &tt->hardirq_ctx[0]); > + } else if (symbol_exists("per_cpu__hardirq_ctx")) { > + if ((kt->flags & SMP) && (kt->flags & PER_CPU_OFF)) { > + for (i = 0; i < NR_CPUS; i++) { > + if (!kt->__per_cpu_offset[i]) > + continue; > + tt->hardirq_ctx[i] = > + symbol_value("per_cpu__hardirq_ctx") + > + kt->__per_cpu_offset[i]; > + } > + } else { > + tt->hardirq_ctx[0] = > + symbol_value("per_cpu__hardirq_ctx"); > + } > + } else { > + error(FATAL, "cannot get hardirq_ctx."); > + } > > for (i = 0; i < NR_CPUS; i++) { > if (!(tt->hardirq_ctx[i])) > @@ -509,10 +526,27 @@ irqstacks_init(void) > ULONG(thread_info_buf+OFFSET(thread_info_task)); > } > > - i = get_array_length("softirq_ctx", NULL, 0); > - get_symbol_data("softirq_ctx", > - sizeof(long)*(i <= NR_CPUS ? i : NR_CPUS), > - &tt->softirq_ctx[0]); > + if (symbol_exists("softirq_ctx")) { > + i = get_array_length("softirq_ctx", NULL, 0); > + get_symbol_data("softirq_ctx", > + sizeof(long)*(i <= NR_CPUS ? i : NR_CPUS), > + &tt->softirq_ctx[0]); > + } else if (symbol_exists("per_cpu__softirq_ctx")) { > + if ((kt->flags & SMP) && (kt->flags & PER_CPU_OFF)) { > + for (i = 0; i < NR_CPUS; i++) { > + if (!kt->__per_cpu_offset[i]) > + continue; > + tt->softirq_ctx[i] = > + symbol_value("per_cpu__softirq_ctx") + > + kt->__per_cpu_offset[i]; > + } > + } else { > + tt->softirq_ctx[0] = > + symbol_value("per_cpu__softirq_ctx"); > + } > + } else { > + error(FATAL, "cannot get softirq_ctx."); > + } > > for (i = 0; i < NR_CPUS; i++) { > if (!(tt->softirq_ctx[i])) > > -- > Crash-utility mailing list > Crash-utility@xxxxxxxxxx > https://www.redhat.com/mailman/listinfo/crash-utility -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/crash-utility