Haren Myneni wrote:
'struct runqueue' is changed to 'rq' in 2.6.18-rc1
and it causes
failure when invoking the crash tool - noticed on powerpc, but should
see even on other archs. The attached patch has been created against the
latest crach sources (crash-4.0-2.33).
Thanks
Haren
Haren,
Thanks for catching this. I'll test it now in conjunction with a new
"cannot determine idle task addresses from init_tasks[] or runqueues[]"
init-time error that's popped up in later Fedora kernels.
Dave
------------------------------------------------------------------------------------------------------------------------
--- crash-4.0-2.33/kernel.c.orig 2006-07-18 19:09:29.000000000 -0700
+++ crash-4.0-2.33/kernel.c 2006-07-19 17:53:39.000000000 -0700
@@ -54,6 +54,7 @@ kernel_init(int when)
int i;
char *p1, *p2, buf[BUFSIZE];
struct syment *sp1, *sp2;
+ char *rqstruct;
if (pc->flags & KERNEL_DEBUG_QUERY)
return;
@@ -157,7 +158,15 @@ kernel_init(int when)
&kt->__per_cpu_offset[0]);
kt->flags |= PER_CPU_OFF;
}
- MEMBER_OFFSET_INIT(runqueue_cpu, "runqueue", "cpu");
+ if (STRUCT_EXISTS("runqueue"))
+ rqstruct = "runqueue";
+ else if (STRUCT_EXISTS("rq"))
+ rqstruct = "rq";
+
+ MEMBER_OFFSET_INIT(runqueue_cpu, rqstruct, "cpu");
+ /*
+ * 'cpu' does not exist in 'struct rq'.
+ */
if (VALID_MEMBER(runqueue_cpu) &&
(get_array_length("runqueue.cpu", NULL, 0) > 0)) {
MEMBER_OFFSET_INIT(cpu_s_curr, "cpu_s",
"curr");
@@ -182,17 +191,17 @@ kernel_init(int when)
"runq_siblings: %d: __cpu_idx and __rq_idx arrays don't
exist?\n",
kt->runq_siblings);
} else {
- MEMBER_OFFSET_INIT(runqueue_idle, "runqueue",
"idle");
- MEMBER_OFFSET_INIT(runqueue_curr, "runqueue",
"curr");
+ MEMBER_OFFSET_INIT(runqueue_idle, rqstruct, "idle");
+ MEMBER_OFFSET_INIT(runqueue_curr, rqstruct, "curr");
ASSIGN_OFFSET(runqueue_cpu) = INVALID_OFFSET;
}
- MEMBER_OFFSET_INIT(runqueue_active, "runqueue",
"active");
- MEMBER_OFFSET_INIT(runqueue_expired, "runqueue",
"expired");
- MEMBER_OFFSET_INIT(runqueue_arrays, "runqueue",
"arrays");
+ MEMBER_OFFSET_INIT(runqueue_active, rqstruct, "active");
+ MEMBER_OFFSET_INIT(runqueue_expired, rqstruct, "expired");
+ MEMBER_OFFSET_INIT(runqueue_arrays, rqstruct, "arrays");
MEMBER_OFFSET_INIT(prio_array_queue, "prio_array",
"queue");
MEMBER_OFFSET_INIT(prio_array_nr_active, "prio_array",
"nr_active");
- STRUCT_SIZE_INIT(runqueue, "runqueue");
+ STRUCT_SIZE_INIT(runqueue, rqstruct);
STRUCT_SIZE_INIT(prio_array, "prio_array");
/*