----- "Ken'ichi Ohmichi" <oomichi(a)mxs.nes.nec.co.jp> 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(a)mxs.nes.nec.co.jp>
---
--- 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(a)redhat.com
https://www.redhat.com/mailman/listinfo/crash-utility