Re: [patch 1/5] powerpc: fix for OProfile callgraph for Power 64 bit user apps

2008-06-10 Thread Carl Love

On Tue, 2008-06-10 at 10:30 +1000, Michael Ellerman wrote:
 On Tue, 2008-06-10 at 09:41 +1000, Benjamin Herrenschmidt wrote:
  On Mon, 2008-06-09 at 16:26 -0700, [EMAIL PROTECTED] wrote:
   From: Carl Love [EMAIL PROTECTED]
   
   Fix the 64 bit user code backtrace which currently may hang the system.
   
   Signed-off-by: Carl Love [EMAIL PROTECTED]
   Cc: Maynard Johnson [EMAIL PROTECTED]
  
  That looks weird. I doubt it's the right fix for the problem. Paul,
  I remember this was discussed earlier, did we come up with a proper fix
  already ?
 
 We decided there probably wasn't a bug there at all:
 
 http://ozlabs.org/pipermail/linuxppc-dev/2008-May/056449.html
 
 Haven't heard from Carl if he reproduced the hang and traced it to
 something else.
 
 cheers
 

After a discussion of this patch, the general consensus was that the
issue is with the underlying copy from user call.  After developing and
posting the patch, I had tried to go back and reproduce it again and was
not able to. My system had changed slightly and I could get it to fail.
I still have this on my to do list to get back to working on the Powerpc
callgraph support as there are some other fundamental issues with the
code.  Specifically the call back traces are not always correct for leaf
nodes.  This was actually the issue I was working on when I found the
issue with the 64 bit applications hanging the system.  

The patch should be dropped.

Carl Love


___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


[patch 1/5] powerpc: fix for OProfile callgraph for Power 64 bit user apps

2008-06-09 Thread akpm
From: Carl Love [EMAIL PROTECTED]

Fix the 64 bit user code backtrace which currently may hang the system.

Signed-off-by: Carl Love [EMAIL PROTECTED]
Cc: Maynard Johnson [EMAIL PROTECTED]

On Thu, 15 May 2008 10:20:44 +1000
Michael Ellerman [EMAIL PROTECTED] wrote:

 __copy_from_user_inatomic() accepts any value for n, it just has a
 special case for 1, 2, 4 and 8 - but it should still work for other
 values.
 
 The old code copied 24 bytes from sp, and the new code copies 8 bytes
 from sp and 8 bytes from sp + 16 - so I don't see where the 48 bytes
 comes in to it?
 
 \ufeffAlso the comment is a little hard to parse, I think you mean Issue:
 the .., but I read Issue as a verb in that sentence. And Don't read
 more then should be than.

Signed-off-by: Andrew Morton [EMAIL PROTECTED]
---

 arch/powerpc/oprofile/backtrace.c |   33 ++--
 1 file changed, 27 insertions(+), 6 deletions(-)

diff -puN 
arch/powerpc/oprofile/backtrace.c~powerpc-fix-for-oprofile-callgraph-for-power-64-bit-user-apps
 arch/powerpc/oprofile/backtrace.c
--- 
a/arch/powerpc/oprofile/backtrace.c~powerpc-fix-for-oprofile-callgraph-for-power-64-bit-user-apps
+++ a/arch/powerpc/oprofile/backtrace.c
@@ -53,19 +53,40 @@ static unsigned int user_getsp32(unsigne
 #ifdef CONFIG_PPC64
 static unsigned long user_getsp64(unsigned long sp, int is_first)
 {
-   unsigned long stack_frame[3];
+   unsigned long stk_frm_lr;
+   unsigned long stk_frm_sp;
+   unsigned long size;
+
+   /* Issue the __copy_from_user_inatomic() third argument currently
+* only takes sizes 1, 2, 4 or 8 bytes.  Don't read more then the
+* first 48 bytes of the stack frame.  That is all that is
+* guaranteed to exist.  Reading more may cause the system to hang.
+*
+* 64 bit stack frame layout:
+* 0-7   bytes is the pointer to previous stack
+* 8-15  bytes condition register save area
+* 16-23 bytes link register save area
+*/
+   size = sizeof(unsigned long);
+   if (!access_ok(VERIFY_READ, (void __user *)sp, size))
+   return 0;
 
-   if (!access_ok(VERIFY_READ, (void __user *)sp, sizeof(stack_frame)))
+   if (__copy_from_user_inatomic(stk_frm_sp, (void __user *)sp,
+   size))
return 0;
 
-   if (__copy_from_user_inatomic(stack_frame, (void __user *)sp,
-   sizeof(stack_frame)))
+   /* get the LR from the user stack */
+   if (!access_ok(VERIFY_READ, (void __user *)(sp+16), size))
+   return 0;
+
+   if (__copy_from_user_inatomic(stk_frm_lr, (void __user *)(sp+16),
+   size))
return 0;
 
if (!is_first)
-   oprofile_add_trace(STACK_LR64(stack_frame));
+   oprofile_add_trace(stk_frm_lr);
 
-   return STACK_SP(stack_frame);
+   return stk_frm_sp;
 }
 #endif
 
_
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


Re: [patch 1/5] powerpc: fix for OProfile callgraph for Power 64 bit user apps

2008-06-09 Thread Benjamin Herrenschmidt
On Mon, 2008-06-09 at 16:26 -0700, [EMAIL PROTECTED] wrote:
 From: Carl Love [EMAIL PROTECTED]
 
 Fix the 64 bit user code backtrace which currently may hang the system.
 
 Signed-off-by: Carl Love [EMAIL PROTECTED]
 Cc: Maynard Johnson [EMAIL PROTECTED]

That looks weird. I doubt it's the right fix for the problem. Paul,
I remember this was discussed earlier, did we come up with a proper fix
already ?

Cheers,
Ben.

 On Thu, 15 May 2008 10:20:44 +1000
 Michael Ellerman [EMAIL PROTECTED] wrote:
 
  __copy_from_user_inatomic() accepts any value for n, it just has a
  special case for 1, 2, 4 and 8 - but it should still work for other
  values.
  
  The old code copied 24 bytes from sp, and the new code copies 8 bytes
  from sp and 8 bytes from sp + 16 - so I don't see where the 48 bytes
  comes in to it?
  
  \ufeffAlso the comment is a little hard to parse, I think you mean Issue:
  the .., but I read Issue as a verb in that sentence. And Don't read
  more then should be than.
 
 Signed-off-by: Andrew Morton [EMAIL PROTECTED]
 ---
 
  arch/powerpc/oprofile/backtrace.c |   33 ++--
  1 file changed, 27 insertions(+), 6 deletions(-)
 
 diff -puN 
 arch/powerpc/oprofile/backtrace.c~powerpc-fix-for-oprofile-callgraph-for-power-64-bit-user-apps
  arch/powerpc/oprofile/backtrace.c
 --- 
 a/arch/powerpc/oprofile/backtrace.c~powerpc-fix-for-oprofile-callgraph-for-power-64-bit-user-apps
 +++ a/arch/powerpc/oprofile/backtrace.c
 @@ -53,19 +53,40 @@ static unsigned int user_getsp32(unsigne
  #ifdef CONFIG_PPC64
  static unsigned long user_getsp64(unsigned long sp, int is_first)
  {
 - unsigned long stack_frame[3];
 + unsigned long stk_frm_lr;
 + unsigned long stk_frm_sp;
 + unsigned long size;
 +
 + /* Issue the __copy_from_user_inatomic() third argument currently
 +  * only takes sizes 1, 2, 4 or 8 bytes.  Don't read more then the
 +  * first 48 bytes of the stack frame.  That is all that is
 +  * guaranteed to exist.  Reading more may cause the system to hang.
 +  *
 +  * 64 bit stack frame layout:
 +  * 0-7   bytes is the pointer to previous stack
 +  * 8-15  bytes condition register save area
 +  * 16-23 bytes link register save area
 +  */
 + size = sizeof(unsigned long);
 + if (!access_ok(VERIFY_READ, (void __user *)sp, size))
 + return 0;
  
 - if (!access_ok(VERIFY_READ, (void __user *)sp, sizeof(stack_frame)))
 + if (__copy_from_user_inatomic(stk_frm_sp, (void __user *)sp,
 + size))
   return 0;
  
 - if (__copy_from_user_inatomic(stack_frame, (void __user *)sp,
 - sizeof(stack_frame)))
 + /* get the LR from the user stack */
 + if (!access_ok(VERIFY_READ, (void __user *)(sp+16), size))
 + return 0;
 +
 + if (__copy_from_user_inatomic(stk_frm_lr, (void __user *)(sp+16),
 + size))
   return 0;
  
   if (!is_first)
 - oprofile_add_trace(STACK_LR64(stack_frame));
 + oprofile_add_trace(stk_frm_lr);
  
 - return STACK_SP(stack_frame);
 + return stk_frm_sp;
  }
  #endif
  
 _
 ___
 Linuxppc-dev mailing list
 Linuxppc-dev@ozlabs.org
 https://ozlabs.org/mailman/listinfo/linuxppc-dev

___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev


Re: [patch 1/5] powerpc: fix for OProfile callgraph for Power 64 bit user apps

2008-06-09 Thread Michael Ellerman
On Tue, 2008-06-10 at 09:41 +1000, Benjamin Herrenschmidt wrote:
 On Mon, 2008-06-09 at 16:26 -0700, [EMAIL PROTECTED] wrote:
  From: Carl Love [EMAIL PROTECTED]
  
  Fix the 64 bit user code backtrace which currently may hang the system.
  
  Signed-off-by: Carl Love [EMAIL PROTECTED]
  Cc: Maynard Johnson [EMAIL PROTECTED]
 
 That looks weird. I doubt it's the right fix for the problem. Paul,
 I remember this was discussed earlier, did we come up with a proper fix
 already ?

We decided there probably wasn't a bug there at all:

http://ozlabs.org/pipermail/linuxppc-dev/2008-May/056449.html

Haven't heard from Carl if he reproduced the hang and traced it to
something else.

cheers

-- 
Michael Ellerman
OzLabs, IBM Australia Development Lab

wwweb: http://michael.ellerman.id.au
phone: +61 2 6212 1183 (tie line 70 21183)

We do not inherit the earth from our ancestors,
we borrow it from our children. - S.M.A.R.T Person


signature.asc
Description: This is a digitally signed message part
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Re: [patch 1/5] powerpc: fix for OProfile callgraph for Power 64 bit user apps

2008-06-09 Thread Paul Mackerras
[EMAIL PROTECTED] writes:

 From: Carl Love [EMAIL PROTECTED]
 
 Fix the 64 bit user code backtrace which currently may hang the system.

NAK - Carl withdrew this patch ages ago.

Paul.
___
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev