Hello Daisuke,
I merged your patch with mine, and have things working relatively well.
One other issue comes up -- when the percpu data areas are set up, they
are done with a "for_each_possible_cpu(cpu)", so your new x86_64_per_cpu_init()
function (may) return more cpus than are actually online. At least that's
the case with Mike's vmcore -- it's running with 2 cpus online, but the
percpu data area was set up for 4. Prior to 2.6.30, it appears that only online
cpus initialized their x8664_pda structures. Anyway, I guess we'll just
have to scale back the cpu count based upon the contents of the cpu_online_map.
I changed the x86_64_verify_symbol() function to look like this so as to only
collect the __per_cpu_start/end and per_cpu__xxx symbols:
/*
* Accept or reject a symbol from the kernel namelist.
*/
static int
x86_64_verify_symbol(const char *name, ulong value, char type)
{
if (!name || !strlen(name))
return FALSE;
if (!(machdep->flags & KSYMS_START)) {
if (STREQ(name, "_text") || STREQ(name, "_stext"))
{
machdep->flags |= KSYMS_START;
if (!st->first_ksymbol)
st->first_ksymbol = value;
return TRUE;
} else if (STREQ(name, "__per_cpu_start")) {
st->flags |= PERCPU_SYMS;
return TRUE;
} else if ((st->flags & PERCPU_SYMS) &&
(STRNEQ(name, "per_cpu") || STRNEQ(name,
"__per_cpu")))
return TRUE;
else
return FALSE;
}
return TRUE;
}
where the PERCPU_SYMS flag is held in the global symbol_table_data flags
field, and where it gets used like this in symbols.c:in_ksymbol_range():
/*
* Determine whether an address falls within the kernel's, or any module's,
* address space.
*/
int
in_ksymbol_range(ulong value)
{
if ((value >= st->symtable[0].value) &&
(value <= st->symtable[st->symcnt-1].value)) {
if ((st->flags & PERCPU_SYMS) && (value <
st->first_ksymbol))
return FALSE;
else
return TRUE;
}
if (module_symbol(value, NULL, NULL, NULL, output_radix))
return TRUE;
if (machdep->value_to_symbol(value, NULL))
return TRUE;
return FALSE;
}
This seems to (so far) clear up the inadvertent dumping of "false"
value-to-symbol
translations in situations like "rd -s", but allows that usage of the
per_cpu_xxx
symbols are arguments to symbol_value(), symbol_exists(), symbol_search(), etc.
Other than that, so far I've left the rest of your patch intact, and I wanted
to thank you again for the contribution.
Dave
Show replies by date