[Crash-utility] [PATCH] s390x: fix interrupt stack address calculation

Dave Anderson anderson at redhat.com
Tue Jun 9 14:15:36 UTC 2015



----- Original Message -----
> On Mon, 8 Jun 2015 14:13:17 -0400 (EDT)
> Dave Anderson <anderson at 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 at 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
> 

Thanks Michael -- queued for crash-7.1.2:

  https://github.com/crash-utility/crash/commit/cefda9be11001c3f09f6f118ab9454509f967fee

Dave


> > 
> > 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);
> > > 
> > 
> 
> 




More information about the Crash-utility mailing list