------------------------------------------------------------------------
--- crash-4.0-4.12/defs.h.kirshil 2008-01-15 18:52:34.000000000 +0300
+++ crash-4.0-4.12/defs.h 2008-01-15 18:52:42.000000000 +0300
@@ -1429,6 +1429,9 @@ struct offset_table {
long kmem_cache_cpu_freelist;
long kmem_cache_cpu_page;
long kmem_cache_cpu_node;
+ long pcpu_info_vcpu;
+ long pcpu_info_idle;
+ long vcpu_struct_rq;
};
struct size_table { /* stash of commonly-used sizes */
@@ -1532,6 +1535,8 @@ struct size_table { /* stash of
long upid;
long kmem_cache_cpu;
long cfs_rq;
+ long pcpu_info;
+ long vcpu_struct;
};
struct array_table {
--- crash-4.0-4.12/kernel.c.kirshil 2008-01-15 18:52:38.000000000
+0300
+++ crash-4.0-4.12/kernel.c 2008-01-15 18:52:42.000000000 +0300
@@ -475,6 +475,14 @@ kernel_init()
if (!(kt->flags & DWARF_UNWIND))
kt->flags |= NO_DWARF_UNWIND;
+ if(STRUCT_EXISTS("pcpu_info")) {
+ MEMBER_OFFSET_INIT(pcpu_info_vcpu, "pcpu_info", "vcpu");
+ MEMBER_OFFSET_INIT(pcpu_info_idle, "pcpu_info", "idle");
+ MEMBER_OFFSET_INIT(vcpu_struct_rq, "vcpu_struct", "rq");
+ STRUCT_SIZE_INIT(pcpu_info, "pcpu_info");
+ STRUCT_SIZE_INIT(vcpu_struct, "vcpu_struct");
+ }
+
BUG_bytes_init();
}
--- crash-4.0-4.12/task.c.kirshil 2008-01-15 18:52:39.000000000 +0300
+++ crash-4.0-4.12/task.c 2008-01-15 18:53:56.000000000 +0300
@@ -5696,6 +5696,14 @@ get_idle_threads(ulong *tasklist, int nr
cnt++;
else
BZERO(tasklist, sizeof(ulong) * NR_CPUS);
+ } else if (symbol_exists("pcpu_info") ){
+ runq=symbol_value("pcpu_info"); /* vzk */
+ runqbuf=GETBUF(SIZE(pcpu_info));
+ for (i = 0; i < nr_cpus; i++, runq += SIZE(pcpu_info)) {
+ readmem(runq,KVADDR,runqbuf,SIZE(pcpu_info),"pcpu
info",FAULT_ON_ERROR);
+ tasklist[i] = ULONG(runqbuf + OFFSET(pcpu_info_idle));
+ if (IS_KVADDR(tasklist[i])) cnt++;
+ }
}
if (runqbuf)
@@ -5777,13 +5785,15 @@ int
get_active_set(void)
{
int i, cnt, per_cpu;
- ulong runq, runqaddr;
+ ulong runq, runqaddr, pcpu_info = 0;
char *runqbuf;
if (tt->flags & ACTIVE_SET)
return TRUE;
- if (symbol_exists("runqueues")) {
+ if (symbol_exists("pcpu_info") && VALID_MEMBER(pcpu_info_vcpu)) {
+ pcpu_info = symbol_value("pcpu_info");
+ } else if (symbol_exists("runqueues")) {
runq = symbol_value("runqueues");
per_cpu = FALSE;
} else if (symbol_exists("per_cpu__runqueues")) {
@@ -5796,7 +5806,23 @@ get_active_set(void)
runqbuf = GETBUF(SIZE(runqueue));
cnt = 0;
- if (VALID_MEMBER(runqueue_curr) && per_cpu) {
+ if (pcpu_info != 0) {
+ ulong vcpu_struct; + char *pcpu_info_buf,
*vcpu_struct_buf;
+
+ pcpu_info_buf = GETBUF(SIZE(pcpu_info));
+ vcpu_struct_buf = GETBUF(SIZE(vcpu_struct));
+ for (i = 0; i < kt->cpus; i++, pcpu_info += SIZE(pcpu_info)) {
+ readmem(pcpu_info,KVADDR,pcpu_info_buf,SIZE(pcpu_info),
"pcpu_info",FAULT_ON_ERROR);
+ vcpu_struct= ULONG(pcpu_info_buf +OFFSET(pcpu_info_vcpu));
+
readmem(vcpu_struct,KVADDR,vcpu_struct_buf,SIZE(vcpu_struct),"pcpu_info->vcpu",FAULT_ON_ERROR);
+ tt->active_set[i] =
ULONG(vcpu_struct_buf+OFFSET(vcpu_struct_rq)+OFFSET(runqueue_curr));
+ if (IS_KVADDR(tt->active_set[i]))
+ cnt++;
+ }
+ FREEBUF(pcpu_info_buf);
+ FREEBUF(vcpu_struct_buf);
+ } else if (VALID_MEMBER(runqueue_curr) && per_cpu) {
for (i = 0; i < kt->cpus; i++) {
if ((kt->flags & SMP) && (kt->flags &
PER_CPU_OFF)) {
runq =
symbol_value("per_cpu__runqueues") +