Re: [PATCH] dump_stack() based on prologue code analysis

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi, Franck.  Thank you for detailed review.

On Thu, 27 Jul 2006 16:33:08 +0200, Franck Bui-Huu <vagabon.xyz@xxxxxxxxx> wrote:
> > +		if (info->pc_offset < 0 || info->frame_size == 0) {
> > +			if (info->func == schedule)
> 
> This can't happen since "schedule" is not a leaf function. Something I'm
> missing here but I would have said:
> 
> 			if (func != schedule)
> 
> instead, no ?

This "if (info->func == schedule)" condition is originally in current
get_frame_info().  And it was added to report "Can't analyze" message
only for schedule() function.  This is because we can get at least
somewhat worth results for thread_saved_pc() and get_wchan() if the
frame information for the schedule() could be analyzed.  The frame
information for other functions just make get_wchan()'s result better.

> > +	if (info.pc_offset < 0 || !info.frame_size) {
> > +		/* leaf? */
> 
> for leaf case, can't we simply do this test:
> 
> 	if (info.pc_offset < 0) {
> 
> IOW, can a leaf function move sp ? I would say yes...

Normally, we can omit "!info.frame_size".  But as I wrote in other
mail, I think it is hard to make perfect get_frame_info().  We should
handle any wired result from get_frame_info().

> BTW why not let this logic inside get_frame_info() ? Hence this function
> could return:
> 
> 	if (info.frame_size && info.pc_offset > 0) /* nested */
> 		return 0;
> 	if (info.pc_offset < 0) /* leaf */
> 		return 1;
> 	/* prologue seems boggus... */
> 	printk("Can't analyze prologue code at %p\n", info->func);
> 	return -1;

Indeed.  I'll make new patch.  But I think put printk() in
get_frame_info() not good because now I want to use it for
show_trace().  I don't want to see the "Can't analyze" message in oops
log.

> > +		*sp += info.frame_size / sizeof(long);
> > +		return 0;
> 
> why not returning:
> 		return regs->regs[31];
> 
> and removes the leaf detection logic in show_frametrace() ?

Because unwind_stack() does not have "regs" argument.  The RA
information is only needed for leaf (i.e. top on stack trace) and
unwind_stack() is used for any level of stack, so I think it is better
to handle the leaf case in show_frametrace().

> > +	pc = (*sp)[info.pc_offset];
> > +	*sp += info.frame_size / sizeof(long);
> > +	return pc;
> 
> why not directly doing:
> 
> 	return (*sp)[info.pc_offset];
> 
> and remove:
> 
> 	pc = (*sp)[info.pc_offset];

This is wrong.  The *sp must be modified before return.

> > +	unsigned long *stack = (long *)regs->regs[29];
> 
> why not calling that "sp" ?

Just because show_trace() named it "stack" :-)

---
Atsushi Nemoto


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux