On Mon, 8 Jun 2015 14:13:17 -0400 (EDT)
Dave Anderson <anderson(a)redhat.com> wrote:
----- Original Message -----
> The kernel commit 2f859d0dad8 ("s390/smp: reduce size of struct pcpu")
> for linux-4.0 removed the "async_stack" and "panic_stack"
members from
> "struct pcpu".
>
> So now the only option to find out the stack address is using "struct
> lowcore" (again). Unfortunately we don't get the exact address because
> since commit dc7ee00d477 ("s390: lowcore stack pointer offsets") the
stack
> frame overhead is already subtracted from the addresses. Therefore we
> have to roundup the stack address to PAGE_SIZE.
>
> Signed-off-by: Michael Holzheu <holzheu(a)linux.vnet.ibm.com>
Hi Michael,
For the changelog -- what's the symptom of the failure?
Hi Dave,
Here the symptom description:
Backtraces (e.g. bt -a) for active tasks that execute I/O or machine check
interrupts are not printed and for "normal" task backtraces ugly messages like
"bt: invalid kernel virtual address: 100000180000088 type:
"readmem_ul""
are shown.
Michael
Dave
> ---
> s390x.c | 7 +++----
> 1 file changed, 3 insertions(+), 4 deletions(-)
>
> --- a/s390x.c
> +++ b/s390x.c
> @@ -1027,8 +1027,6 @@ static unsigned long get_int_stack_pcpu(
> {
> unsigned long addr;
>
> - if (!MEMBER_EXISTS("pcpu", stack_name))
> - return 0;
> addr = symbol_value("pcpu_devices") +
> cpu * STRUCT_SIZE("pcpu") + MEMBER_OFFSET("pcpu",
stack_name);
> return readmem_ul(addr) + INT_STACK_SIZE;
> @@ -1041,7 +1039,8 @@ static unsigned long get_int_stack_lc(ch
> {
> if (!MEMBER_EXISTS(lc_struct, stack_name))
> return 0;
> - return ULONG(lc + MEMBER_OFFSET(lc_struct, stack_name));
> + return roundup(ULONG(lc + MEMBER_OFFSET(lc_struct, stack_name)),
> + PAGESIZE());
> }
>
> /*
> @@ -1057,7 +1056,7 @@ static void get_int_stack(char *stack_na
> stack_addr = symbol_value("restart_stack");
> stack_addr = readmem_ul(stack_addr);
> } else {
> - if (symbol_exists("pcpu_devices"))
> + if (symbol_exists("pcpu_devices") &&
MEMBER_EXISTS("pcpu", stack_name))
> stack_addr = get_int_stack_pcpu(stack_name, cpu);
> else
> stack_addr = get_int_stack_lc(stack_name, lc);
>