linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFC Patch 1/2][Bugfix][x86][hw-breakpoint] Clear reserved bits of DR6 in do_debug()
       [not found] <20091226175533.149765731@linux.vnet.ibm.com>
@ 2009-12-26 18:27 ` K.Prasad
  2009-12-30 23:45   ` Frederic Weisbecker
  2009-12-26 18:28 ` [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler K.Prasad
  1 sibling, 1 reply; 20+ messages in thread
From: K.Prasad @ 2009-12-26 18:27 UTC (permalink / raw)
  To: LKML
  Cc: Ingo Molnar, Frederic Weisbecker, Roland McGrath, Alan Stern,
	Ananth N Mavinakayanahalli, Pekka Enberg, Vegard Nossum,
	Oleg Nesterov

[-- Attachment #1: fix_dr6_reserved_01 --]
[-- Type: text/plain, Size: 1362 bytes --]

Clear the reserved bits from the stored copy of debug status register (DR6).
This will help easy bitwise operations.

Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
---
 arch/x86/include/asm/debugreg.h |    3 +++
 arch/x86/kernel/traps.c         |    3 +++
 2 files changed, 6 insertions(+)

Index: linux-2.6-tip/arch/x86/include/asm/debugreg.h
===================================================================
--- linux-2.6-tip.orig/arch/x86/include/asm/debugreg.h
+++ linux-2.6-tip/arch/x86/include/asm/debugreg.h
@@ -14,6 +14,9 @@
    which debugging register was responsible for the trap.  The other bits
    are either reserved or not of interest to us. */
 
+/* Define reserved bits in DR6 which are always set to 1 */
+#define DR6_RESERVED	(0xFFFF0FF0)
+
 #define DR_TRAP0	(0x1)		/* db0 */
 #define DR_TRAP1	(0x2)		/* db1 */
 #define DR_TRAP2	(0x4)		/* db2 */
Index: linux-2.6-tip/arch/x86/kernel/traps.c
===================================================================
--- linux-2.6-tip.orig/arch/x86/kernel/traps.c
+++ linux-2.6-tip/arch/x86/kernel/traps.c
@@ -534,6 +534,9 @@ dotraplinkage void __kprobes do_debug(st
 
 	get_debugreg(dr6, 6);
 
+	/* Filter out all the reserved bits which are preset to 1 */
+	dr6 &= ~DR6_RESERVED;
+
 	/* Catch kmemcheck conditions first of all! */
 	if ((dr6 & DR_STEP) && kmemcheck_trap(regs))
 		return;


^ permalink raw reply	[flat|nested] 20+ messages in thread

* [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
       [not found] <20091226175533.149765731@linux.vnet.ibm.com>
  2009-12-26 18:27 ` [RFC Patch 1/2][Bugfix][x86][hw-breakpoint] Clear reserved bits of DR6 in do_debug() K.Prasad
@ 2009-12-26 18:28 ` K.Prasad
  2009-12-31  0:33   ` Frederic Weisbecker
                     ` (3 more replies)
  1 sibling, 4 replies; 20+ messages in thread
From: K.Prasad @ 2009-12-26 18:28 UTC (permalink / raw)
  To: LKML; +Cc: Ingo Molnar, Frederic Weisbecker, Alan Stern, K.Prasad

[-- Attachment #1: fix_notify_code_02 --]
[-- Type: text/plain, Size: 1163 bytes --]

The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
to generate SIGTRAP signal (and not for kernel-space addresses). 

Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
---
 arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
===================================================================
--- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
+++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
@@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
 		rcu_read_lock();
 
 		bp = per_cpu(bp_per_reg[i], cpu);
-		if (bp)
-			rc = NOTIFY_DONE;
 		/*
 		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
 		 * exception handling
@@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
 			rcu_read_unlock();
 			break;
 		}
+		/*
+		 * Further processing in do_debug() is needed for a) user-space
+		 * breakpoints (to generate signals) and b) when the system has
+		 * taken exception due to multiple causes
+		 */
+		if (bp->attr.bp_addr < TASK_SIZE)
+			rc = NOTIFY_DONE;
 
 		perf_bp_event(bp, args->regs);
 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 1/2][Bugfix][x86][hw-breakpoint] Clear reserved bits of DR6 in do_debug()
  2009-12-26 18:27 ` [RFC Patch 1/2][Bugfix][x86][hw-breakpoint] Clear reserved bits of DR6 in do_debug() K.Prasad
@ 2009-12-30 23:45   ` Frederic Weisbecker
  2009-12-31 18:49     ` K.Prasad
  0 siblings, 1 reply; 20+ messages in thread
From: Frederic Weisbecker @ 2009-12-30 23:45 UTC (permalink / raw)
  To: K.Prasad
  Cc: LKML, Ingo Molnar, Roland McGrath, Alan Stern,
	Ananth N Mavinakayanahalli, Pekka Enberg, Vegard Nossum,
	Oleg Nesterov

On Sat, Dec 26, 2009 at 11:57:25PM +0530, K.Prasad wrote:
> Clear the reserved bits from the stored copy of debug status register (DR6).
> This will help easy bitwise operations.
> 
> Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> ---
>  arch/x86/include/asm/debugreg.h |    3 +++
>  arch/x86/kernel/traps.c         |    3 +++
>  2 files changed, 6 insertions(+)
> 
> Index: linux-2.6-tip/arch/x86/include/asm/debugreg.h
> ===================================================================
> --- linux-2.6-tip.orig/arch/x86/include/asm/debugreg.h
> +++ linux-2.6-tip/arch/x86/include/asm/debugreg.h
> @@ -14,6 +14,9 @@
>     which debugging register was responsible for the trap.  The other bits
>     are either reserved or not of interest to us. */
>  
> +/* Define reserved bits in DR6 which are always set to 1 */
> +#define DR6_RESERVED	(0xFFFF0FF0)
> +


The 12th bit seems to be also reserved.
Shouldn't it be 0xffff1ff0 ?

What kind of bitwise operations do you think it could help?

All of the operations I can find on dr6 are simple masks
test/set/clear.



>  #define DR_TRAP0	(0x1)		/* db0 */
>  #define DR_TRAP1	(0x2)		/* db1 */
>  #define DR_TRAP2	(0x4)		/* db2 */
> Index: linux-2.6-tip/arch/x86/kernel/traps.c
> ===================================================================
> --- linux-2.6-tip.orig/arch/x86/kernel/traps.c
> +++ linux-2.6-tip/arch/x86/kernel/traps.c
> @@ -534,6 +534,9 @@ dotraplinkage void __kprobes do_debug(st
>  
>  	get_debugreg(dr6, 6);
>  
> +	/* Filter out all the reserved bits which are preset to 1 */
> +	dr6 &= ~DR6_RESERVED;
> +
>  	/* Catch kmemcheck conditions first of all! */
>  	if ((dr6 & DR_STEP) && kmemcheck_trap(regs))
>  		return;
> 


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2009-12-26 18:28 ` [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler K.Prasad
@ 2009-12-31  0:33   ` Frederic Weisbecker
  2009-12-31  0:38   ` Frederic Weisbecker
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 20+ messages in thread
From: Frederic Weisbecker @ 2009-12-31  0:33 UTC (permalink / raw)
  To: K.Prasad; +Cc: LKML, Ingo Molnar, Alan Stern

On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
> to generate SIGTRAP signal (and not for kernel-space addresses). 
> 
> Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> ---
>  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> ===================================================================
> --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
> +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
>  		rcu_read_lock();
>  
>  		bp = per_cpu(bp_per_reg[i], cpu);
> -		if (bp)
> -			rc = NOTIFY_DONE;
>  		/*
>  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
>  		 * exception handling
> @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
>  			rcu_read_unlock();
>  			break;
>  		}
> +		/*
> +		 * Further processing in do_debug() is needed for a) user-space
> +		 * breakpoints (to generate signals) and b) when the system has
> +		 * taken exception due to multiple causes
> +		 */
> +		if (bp->attr.bp_addr < TASK_SIZE)
> +			rc = NOTIFY_DONE;
>  
>  		perf_bp_event(bp, args->regs);
>  
> 


Looks good. This stops any further checks though. This
is fine in case we have the DR_STEP bit as we will
toggle to NOTIFY_DONE. But what about vm86 case? Is it
possible we might still have something to handle in this
side? (although I don't quite understand how we can have
a breakpoint triggered in vm86 mode).


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2009-12-26 18:28 ` [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler K.Prasad
  2009-12-31  0:33   ` Frederic Weisbecker
@ 2009-12-31  0:38   ` Frederic Weisbecker
  2009-12-31 19:02     ` K.Prasad
  2009-12-31  0:44   ` Frederic Weisbecker
  2010-01-25 22:11   ` Frederic Weisbecker
  3 siblings, 1 reply; 20+ messages in thread
From: Frederic Weisbecker @ 2009-12-31  0:38 UTC (permalink / raw)
  To: K.Prasad; +Cc: LKML, Ingo Molnar, Alan Stern

On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
> to generate SIGTRAP signal (and not for kernel-space addresses). 
> 
> Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> ---
>  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> ===================================================================
> --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
> +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
>  		rcu_read_lock();
>  
>  		bp = per_cpu(bp_per_reg[i], cpu);
> -		if (bp)
> -			rc = NOTIFY_DONE;
>  		/*
>  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
>  		 * exception handling
> @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
>  			rcu_read_unlock();
>  			break;
>  		}
> +		/*
> +		 * Further processing in do_debug() is needed for a) user-space
> +		 * breakpoints (to generate signals) and b) when the system has
> +		 * taken exception due to multiple causes
> +		 */
> +		if (bp->attr.bp_addr < TASK_SIZE)
> +			rc = NOTIFY_DONE;
>  
>  		perf_bp_event(bp, args->regs);
>  
> 


Oh and now that I see this patch, the previous one indeed makes sense
with this check:

if (dr6 & (~DR_TRAP_BITS))
	rc = NOTIFY_DONE;

That said, it means thread.debugreg6 won't get the reserved bits anymore.
I see some use of them from kvm (it restores the reserved bits on guest<->host
switch). Not sure if this inconsistency could affect kvm...


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2009-12-26 18:28 ` [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler K.Prasad
  2009-12-31  0:33   ` Frederic Weisbecker
  2009-12-31  0:38   ` Frederic Weisbecker
@ 2009-12-31  0:44   ` Frederic Weisbecker
  2010-01-25 22:11   ` Frederic Weisbecker
  3 siblings, 0 replies; 20+ messages in thread
From: Frederic Weisbecker @ 2009-12-31  0:44 UTC (permalink / raw)
  To: K.Prasad; +Cc: LKML, Ingo Molnar, Alan Stern, Peter Zijlstra

On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> +		/*
> +		 * Further processing in do_debug() is needed for a) user-space
> +		 * breakpoints (to generate signals) and b) when the system has
> +		 * taken exception due to multiple causes
> +		 */
> +		if (bp->attr.bp_addr < TASK_SIZE)
> +			rc = NOTIFY_DONE;



BTW, I'm not sure this is the right way to check if we want to send
a signal or not. Although it's not yet supported, we'll probably
bring the support for userspace breakpoints by perf.

May be we should put a "ptrace" flag in struct hw_perf_event instead.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 1/2][Bugfix][x86][hw-breakpoint] Clear reserved bits of DR6 in do_debug()
  2009-12-30 23:45   ` Frederic Weisbecker
@ 2009-12-31 18:49     ` K.Prasad
  2010-01-10  3:22       ` Frederic Weisbecker
  0 siblings, 1 reply; 20+ messages in thread
From: K.Prasad @ 2009-12-31 18:49 UTC (permalink / raw)
  To: Frederic Weisbecker
  Cc: LKML, Ingo Molnar, Roland McGrath, Alan Stern,
	Ananth N Mavinakayanahalli, Pekka Enberg, Vegard Nossum,
	Oleg Nesterov

On Thu, Dec 31, 2009 at 12:45:00AM +0100, Frederic Weisbecker wrote:
> On Sat, Dec 26, 2009 at 11:57:25PM +0530, K.Prasad wrote:
> > Clear the reserved bits from the stored copy of debug status register (DR6).
> > This will help easy bitwise operations.
> > 
> > Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> > ---
> >  arch/x86/include/asm/debugreg.h |    3 +++
> >  arch/x86/kernel/traps.c         |    3 +++
> >  2 files changed, 6 insertions(+)
> > 
> > Index: linux-2.6-tip/arch/x86/include/asm/debugreg.h
> > ===================================================================
> > --- linux-2.6-tip.orig/arch/x86/include/asm/debugreg.h
> > +++ linux-2.6-tip/arch/x86/include/asm/debugreg.h
> > @@ -14,6 +14,9 @@
> >     which debugging register was responsible for the trap.  The other bits
> >     are either reserved or not of interest to us. */
> >  
> > +/* Define reserved bits in DR6 which are always set to 1 */
> > +#define DR6_RESERVED	(0xFFFF0FF0)
> > +
> 
> 
> The 12th bit seems to be also reserved.
> Shouldn't it be 0xffff1ff0 ?
> 

The 12th bit is reserved to be 0 always.

> What kind of bitwise operations do you think it could help?
> 
> All of the operations I can find on dr6 are simple masks
> test/set/clear.
> 

As you found out later, this bitmask helps us in
hw_breakpoint_handler().

Thanks,
K.Prasad


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2009-12-31  0:38   ` Frederic Weisbecker
@ 2009-12-31 19:02     ` K.Prasad
  2010-01-10  3:18       ` Frederic Weisbecker
  0 siblings, 1 reply; 20+ messages in thread
From: K.Prasad @ 2009-12-31 19:02 UTC (permalink / raw)
  To: Frederic Weisbecker; +Cc: LKML, Ingo Molnar, Alan Stern

On Thu, Dec 31, 2009 at 01:38:09AM +0100, Frederic Weisbecker wrote:
> On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> > The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
> > to generate SIGTRAP signal (and not for kernel-space addresses). 
> > 
> > Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> > ---
> >  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
> >  1 file changed, 7 insertions(+), 2 deletions(-)
> > 
> > Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> > ===================================================================
> > --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
> > +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> > @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
> >  		rcu_read_lock();
> >  
> >  		bp = per_cpu(bp_per_reg[i], cpu);
> > -		if (bp)
> > -			rc = NOTIFY_DONE;
> >  		/*
> >  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
> >  		 * exception handling
> > @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
> >  			rcu_read_unlock();
> >  			break;
> >  		}
> > +		/*
> > +		 * Further processing in do_debug() is needed for a) user-space
> > +		 * breakpoints (to generate signals) and b) when the system has
> > +		 * taken exception due to multiple causes
> > +		 */
> > +		if (bp->attr.bp_addr < TASK_SIZE)
> > +			rc = NOTIFY_DONE;
> >  
> >  		perf_bp_event(bp, args->regs);
> >  
> > 
> 
> 
> Oh and now that I see this patch, the previous one indeed makes sense
> with this check:
> 
> if (dr6 & (~DR_TRAP_BITS))
> 	rc = NOTIFY_DONE;
> 
> That said, it means thread.debugreg6 won't get the reserved bits anymore.
> I see some use of them from kvm (it restores the reserved bits on guest<->host
> switch). Not sure if this inconsistency could affect kvm...
> 

Can you point me to the relevant code?
Anyway will copy this to Jan Kiszka <jan.kiszka@web.de> to hear what
this change means to KVM...on a similar note, will be happy to be
re-assured by Roland/Oleg about the patch's harmlessness to the
user-space (ptrace/utrace).

Hi Jan,
	Patch 20091226182725.GB9494@in.ibm.com introduces a change that

Patch 1/2: Clears the arch-reserved bits from debug status register.
This helps easy bitwise operations - such as the check for non-trap bits in
hw_breakpoint_handler. A check for the same using
"if (dr6 & (~DR_TRAP_BITS))" throws incorrect results due to the
presence of preset reserved bits.

Let us know if you foresee any harm from the said change to the
behaviour seen under KVM.

Thanks,
K.Prasad


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2009-12-31 19:02     ` K.Prasad
@ 2010-01-10  3:18       ` Frederic Weisbecker
  2010-01-11 19:15         ` Jan Kiszka
  0 siblings, 1 reply; 20+ messages in thread
From: Frederic Weisbecker @ 2010-01-10  3:18 UTC (permalink / raw)
  To: K.Prasad; +Cc: LKML, Ingo Molnar, Alan Stern

On Fri, Jan 01, 2010 at 12:32:17AM +0530, K.Prasad wrote:
> On Thu, Dec 31, 2009 at 01:38:09AM +0100, Frederic Weisbecker wrote:
> > On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> > > The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
> > > to generate SIGTRAP signal (and not for kernel-space addresses). 
> > > 
> > > Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> > > ---
> > >  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
> > >  1 file changed, 7 insertions(+), 2 deletions(-)
> > > 
> > > Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> > > ===================================================================
> > > --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
> > > +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> > > @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
> > >  		rcu_read_lock();
> > >  
> > >  		bp = per_cpu(bp_per_reg[i], cpu);
> > > -		if (bp)
> > > -			rc = NOTIFY_DONE;
> > >  		/*
> > >  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
> > >  		 * exception handling
> > > @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
> > >  			rcu_read_unlock();
> > >  			break;
> > >  		}
> > > +		/*
> > > +		 * Further processing in do_debug() is needed for a) user-space
> > > +		 * breakpoints (to generate signals) and b) when the system has
> > > +		 * taken exception due to multiple causes
> > > +		 */
> > > +		if (bp->attr.bp_addr < TASK_SIZE)
> > > +			rc = NOTIFY_DONE;
> > >  
> > >  		perf_bp_event(bp, args->regs);
> > >  
> > > 
> > 
> > 
> > Oh and now that I see this patch, the previous one indeed makes sense
> > with this check:
> > 
> > if (dr6 & (~DR_TRAP_BITS))
> > 	rc = NOTIFY_DONE;
> > 
> > That said, it means thread.debugreg6 won't get the reserved bits anymore.
> > I see some use of them from kvm (it restores the reserved bits on guest<->host
> > switch). Not sure if this inconsistency could affect kvm...
> > 
> 
> Can you point me to the relevant code?


I see various uses of DR6_VOLATILE and DR6_FIXED_1 in arch/x86/kvm/,
DR6_FIXED_1 being the fixed unused bits in dr6. Not sure how
this patch would affect what's set there.

I'll wait for Jan's answer.

Thanks.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 1/2][Bugfix][x86][hw-breakpoint] Clear reserved bits of DR6 in do_debug()
  2009-12-31 18:49     ` K.Prasad
@ 2010-01-10  3:22       ` Frederic Weisbecker
  0 siblings, 0 replies; 20+ messages in thread
From: Frederic Weisbecker @ 2010-01-10  3:22 UTC (permalink / raw)
  To: K.Prasad
  Cc: LKML, Ingo Molnar, Roland McGrath, Alan Stern,
	Ananth N Mavinakayanahalli, Pekka Enberg, Vegard Nossum,
	Oleg Nesterov

On Fri, Jan 01, 2010 at 12:19:49AM +0530, K.Prasad wrote:
> On Thu, Dec 31, 2009 at 12:45:00AM +0100, Frederic Weisbecker wrote:
> > On Sat, Dec 26, 2009 at 11:57:25PM +0530, K.Prasad wrote:
> > > Clear the reserved bits from the stored copy of debug status register (DR6).
> > > This will help easy bitwise operations.
> > > 
> > > Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> > > ---
> > >  arch/x86/include/asm/debugreg.h |    3 +++
> > >  arch/x86/kernel/traps.c         |    3 +++
> > >  2 files changed, 6 insertions(+)
> > > 
> > > Index: linux-2.6-tip/arch/x86/include/asm/debugreg.h
> > > ===================================================================
> > > --- linux-2.6-tip.orig/arch/x86/include/asm/debugreg.h
> > > +++ linux-2.6-tip/arch/x86/include/asm/debugreg.h
> > > @@ -14,6 +14,9 @@
> > >     which debugging register was responsible for the trap.  The other bits
> > >     are either reserved or not of interest to us. */
> > >  
> > > +/* Define reserved bits in DR6 which are always set to 1 */
> > > +#define DR6_RESERVED	(0xFFFF0FF0)
> > > +
> > 
> > 
> > The 12th bit seems to be also reserved.
> > Shouldn't it be 0xffff1ff0 ?
> > 
> 
> The 12th bit is reserved to be 0 always.


Ah, ok.

 
> > What kind of bitwise operations do you think it could help?
> > 
> > All of the operations I can find on dr6 are simple masks
> > test/set/clear.
> > 
> 
> As you found out later, this bitmask helps us in
> hw_breakpoint_handler().


Yeah, ok. Just waiting for Jan's answer to be sure it has
not side effects :)

Thanks.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2010-01-10  3:18       ` Frederic Weisbecker
@ 2010-01-11 19:15         ` Jan Kiszka
  2010-01-16 19:41           ` K.Prasad
  0 siblings, 1 reply; 20+ messages in thread
From: Jan Kiszka @ 2010-01-11 19:15 UTC (permalink / raw)
  To: Frederic Weisbecker; +Cc: K.Prasad, LKML, Ingo Molnar, Alan Stern

Frederic Weisbecker wrote:
> On Fri, Jan 01, 2010 at 12:32:17AM +0530, K.Prasad wrote:
>> On Thu, Dec 31, 2009 at 01:38:09AM +0100, Frederic Weisbecker wrote:
>>> On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
>>>> The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
>>>> to generate SIGTRAP signal (and not for kernel-space addresses). 
>>>>
>>>> Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
>>>> ---
>>>>  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
>>>>  1 file changed, 7 insertions(+), 2 deletions(-)
>>>>
>>>> Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
>>>> ===================================================================
>>>> --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
>>>> +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
>>>> @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
>>>>  		rcu_read_lock();
>>>>  
>>>>  		bp = per_cpu(bp_per_reg[i], cpu);
>>>> -		if (bp)
>>>> -			rc = NOTIFY_DONE;
>>>>  		/*
>>>>  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
>>>>  		 * exception handling
>>>> @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
>>>>  			rcu_read_unlock();
>>>>  			break;
>>>>  		}
>>>> +		/*
>>>> +		 * Further processing in do_debug() is needed for a) user-space
>>>> +		 * breakpoints (to generate signals) and b) when the system has
>>>> +		 * taken exception due to multiple causes
>>>> +		 */
>>>> +		if (bp->attr.bp_addr < TASK_SIZE)
>>>> +			rc = NOTIFY_DONE;
>>>>  
>>>>  		perf_bp_event(bp, args->regs);
>>>>  
>>>>
>>>
>>> Oh and now that I see this patch, the previous one indeed makes sense
>>> with this check:
>>>
>>> if (dr6 & (~DR_TRAP_BITS))
>>> 	rc = NOTIFY_DONE;
>>>
>>> That said, it means thread.debugreg6 won't get the reserved bits anymore.
>>> I see some use of them from kvm (it restores the reserved bits on guest<->host
>>> switch). Not sure if this inconsistency could affect kvm...
>>>
>> Can you point me to the relevant code?
> 
> 
> I see various uses of DR6_VOLATILE and DR6_FIXED_1 in arch/x86/kvm/,
> DR6_FIXED_1 being the fixed unused bits in dr6. Not sure how
> this patch would affect what's set there.
> 
> I'll wait for Jan's answer.
> 

You may need to synchronize me: What does the patch change, the shadow
register KVM will restore into DR6 on return to the host? Or the
register content KVM finds on guest entry?

The rules are simple: On entry, KVM assumes nothing about the register
state, just overwrites it (on demand) with the guest state. On exit, it
calls into hw_breakpoint_restore to ensure the host sees a proper state
(if required). But there is at no time an architecturally invalid state
loaded into the real register (that's basically what DR6_VOLATILE and
DR6_FIXED_1 are used for while in guest mode).

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2010-01-11 19:15         ` Jan Kiszka
@ 2010-01-16 19:41           ` K.Prasad
  2010-01-20  6:01             ` K.Prasad
  0 siblings, 1 reply; 20+ messages in thread
From: K.Prasad @ 2010-01-16 19:41 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Frederic Weisbecker, LKML, Ingo Molnar, Alan Stern

On Mon, Jan 11, 2010 at 08:15:29PM +0100, Jan Kiszka wrote:
> Frederic Weisbecker wrote:
> > On Fri, Jan 01, 2010 at 12:32:17AM +0530, K.Prasad wrote:
> >> On Thu, Dec 31, 2009 at 01:38:09AM +0100, Frederic Weisbecker wrote:
> >>> On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> >>>> The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
> >>>> to generate SIGTRAP signal (and not for kernel-space addresses). 
> >>>>
> >>>> Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> >>>> ---
> >>>>  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
> >>>>  1 file changed, 7 insertions(+), 2 deletions(-)
> >>>>
> >>>> Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> >>>> ===================================================================
> >>>> --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
> >>>> +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> >>>> @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
> >>>>  		rcu_read_lock();
> >>>>  
> >>>>  		bp = per_cpu(bp_per_reg[i], cpu);
> >>>> -		if (bp)
> >>>> -			rc = NOTIFY_DONE;
> >>>>  		/*
> >>>>  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
> >>>>  		 * exception handling
> >>>> @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
> >>>>  			rcu_read_unlock();
> >>>>  			break;
> >>>>  		}
> >>>> +		/*
> >>>> +		 * Further processing in do_debug() is needed for a) user-space
> >>>> +		 * breakpoints (to generate signals) and b) when the system has
> >>>> +		 * taken exception due to multiple causes
> >>>> +		 */
> >>>> +		if (bp->attr.bp_addr < TASK_SIZE)
> >>>> +			rc = NOTIFY_DONE;
> >>>>  
> >>>>  		perf_bp_event(bp, args->regs);
> >>>>  
> >>>>
> >>>
> >>> Oh and now that I see this patch, the previous one indeed makes sense
> >>> with this check:
> >>>
> >>> if (dr6 & (~DR_TRAP_BITS))
> >>> 	rc = NOTIFY_DONE;
> >>>
> >>> That said, it means thread.debugreg6 won't get the reserved bits anymore.
> >>> I see some use of them from kvm (it restores the reserved bits on guest<->host
> >>> switch). Not sure if this inconsistency could affect kvm...
> >>>
> >> Can you point me to the relevant code?
> > 
> > 
> > I see various uses of DR6_VOLATILE and DR6_FIXED_1 in arch/x86/kvm/,
> > DR6_FIXED_1 being the fixed unused bits in dr6. Not sure how
> > this patch would affect what's set there.
> > 
> > I'll wait for Jan's answer.
> > 
> 
> You may need to synchronize me: What does the patch change, the shadow
> register KVM will restore into DR6 on return to the host? Or the
> register content KVM finds on guest entry?
> 

Sorry, this mail got buried deeply in my mailbox (hence the delay).

Basically, this patch tries to remove DR6 from its reserved bits to help
easy checks for certain status bits (such as DR_STEP). For instance, in
order to verify if DR_STEP (Bit 14) is set we must now do
if ((DR6 & ~DR6_RESERVED) & DR_STEP) {}
or
if (DR6 & (DR_STEP | DR6_RESERVED)) {}
which is redundant.

Instead this patch would expunge all reserved bits in DR6 before checks
for various status bits (to detect the cause of exception) are made in
do_debug().

At the outset, I don't think changes in the way the value of DR6 is used
for comparison in do_debug() would affect exception handling for either
KVM's guest or host OS (given that there are no hooks for the same in
do_debug()).

> The rules are simple: On entry, KVM assumes nothing about the register
> state, just overwrites it (on demand) with the guest state. On exit, it
> calls into hw_breakpoint_restore to ensure the host sees a proper state
> (if required). But there is at no time an architecturally invalid state
> loaded into the real register (that's basically what DR6_VOLATILE and
> DR6_FIXED_1 are used for while in guest mode).
> 

Such a behaviour shouldn't be affected by the above change...your
confirmation would help!

Thanks,
K.Prasad


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2010-01-16 19:41           ` K.Prasad
@ 2010-01-20  6:01             ` K.Prasad
  2010-01-22  9:14               ` Jan Kiszka
  0 siblings, 1 reply; 20+ messages in thread
From: K.Prasad @ 2010-01-20  6:01 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: Frederic Weisbecker, LKML, Ingo Molnar, Alan Stern

On Sun, Jan 17, 2010 at 01:10:58AM +0530, K.Prasad wrote:
> On Mon, Jan 11, 2010 at 08:15:29PM +0100, Jan Kiszka wrote:
> > Frederic Weisbecker wrote:
> > > On Fri, Jan 01, 2010 at 12:32:17AM +0530, K.Prasad wrote:
> > >> On Thu, Dec 31, 2009 at 01:38:09AM +0100, Frederic Weisbecker wrote:
> > >>> On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> > >>>> The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
> > >>>> to generate SIGTRAP signal (and not for kernel-space addresses). 
> > >>>>
> > >>>> Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> > >>>> ---
> > >>>>  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
> > >>>>  1 file changed, 7 insertions(+), 2 deletions(-)
> > >>>>
> > >>>> Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> > >>>> ===================================================================
> > >>>> --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
> > >>>> +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> > >>>> @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
> > >>>>  		rcu_read_lock();
> > >>>>  
> > >>>>  		bp = per_cpu(bp_per_reg[i], cpu);
> > >>>> -		if (bp)
> > >>>> -			rc = NOTIFY_DONE;
> > >>>>  		/*
> > >>>>  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
> > >>>>  		 * exception handling
> > >>>> @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
> > >>>>  			rcu_read_unlock();
> > >>>>  			break;
> > >>>>  		}
> > >>>> +		/*
> > >>>> +		 * Further processing in do_debug() is needed for a) user-space
> > >>>> +		 * breakpoints (to generate signals) and b) when the system has
> > >>>> +		 * taken exception due to multiple causes
> > >>>> +		 */
> > >>>> +		if (bp->attr.bp_addr < TASK_SIZE)
> > >>>> +			rc = NOTIFY_DONE;
> > >>>>  
> > >>>>  		perf_bp_event(bp, args->regs);
> > >>>>  
> > >>>>
> > >>>
> > >>> Oh and now that I see this patch, the previous one indeed makes sense
> > >>> with this check:
> > >>>
> > >>> if (dr6 & (~DR_TRAP_BITS))
> > >>> 	rc = NOTIFY_DONE;
> > >>>
> > >>> That said, it means thread.debugreg6 won't get the reserved bits anymore.
> > >>> I see some use of them from kvm (it restores the reserved bits on guest<->host
> > >>> switch). Not sure if this inconsistency could affect kvm...
> > >>>
> > >> Can you point me to the relevant code?
> > > 
> > > 
> > > I see various uses of DR6_VOLATILE and DR6_FIXED_1 in arch/x86/kvm/,
> > > DR6_FIXED_1 being the fixed unused bits in dr6. Not sure how
> > > this patch would affect what's set there.
> > > 
> > > I'll wait for Jan's answer.
> > > 
> > 
> > You may need to synchronize me: What does the patch change, the shadow
> > register KVM will restore into DR6 on return to the host? Or the
> > register content KVM finds on guest entry?
> > 
> 
> Sorry, this mail got buried deeply in my mailbox (hence the delay).
> 
> Basically, this patch tries to remove DR6 from its reserved bits to help
> easy checks for certain status bits (such as DR_STEP). For instance, in
> order to verify if DR_STEP (Bit 14) is set we must now do
> if ((DR6 & ~DR6_RESERVED) & DR_STEP) {}
> or
> if (DR6 & (DR_STEP | DR6_RESERVED)) {}
> which is redundant.
> 
> Instead this patch would expunge all reserved bits in DR6 before checks
> for various status bits (to detect the cause of exception) are made in
> do_debug().
> 
> At the outset, I don't think changes in the way the value of DR6 is used
> for comparison in do_debug() would affect exception handling for either
> KVM's guest or host OS (given that there are no hooks for the same in
> do_debug()).
> 
> > The rules are simple: On entry, KVM assumes nothing about the register
> > state, just overwrites it (on demand) with the guest state. On exit, it
> > calls into hw_breakpoint_restore to ensure the host sees a proper state
> > (if required). But there is at no time an architecturally invalid state
> > loaded into the real register (that's basically what DR6_VOLATILE and
> > DR6_FIXED_1 are used for while in guest mode).
> > 
> 
> Such a behaviour shouldn't be affected by the above change...your
> confirmation would help!
> 

Hi Jan,
	I presume that the above explanation makes the role of this
patch/bugfix clear.

Kindly let me know if you have any further queries.

Thanks,
K.Prasad


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2010-01-20  6:01             ` K.Prasad
@ 2010-01-22  9:14               ` Jan Kiszka
  2010-01-22  9:21                 ` K.Prasad
  0 siblings, 1 reply; 20+ messages in thread
From: Jan Kiszka @ 2010-01-22  9:14 UTC (permalink / raw)
  To: prasad; +Cc: Frederic Weisbecker, LKML, Ingo Molnar, Alan Stern

K.Prasad wrote:
> On Sun, Jan 17, 2010 at 01:10:58AM +0530, K.Prasad wrote:
>> On Mon, Jan 11, 2010 at 08:15:29PM +0100, Jan Kiszka wrote:
>>> Frederic Weisbecker wrote:
>>>> On Fri, Jan 01, 2010 at 12:32:17AM +0530, K.Prasad wrote:
>>>>> On Thu, Dec 31, 2009 at 01:38:09AM +0100, Frederic Weisbecker wrote:
>>>>>> On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
>>>>>>> The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
>>>>>>> to generate SIGTRAP signal (and not for kernel-space addresses). 
>>>>>>>
>>>>>>> Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
>>>>>>> ---
>>>>>>>  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
>>>>>>>  1 file changed, 7 insertions(+), 2 deletions(-)
>>>>>>>
>>>>>>> Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
>>>>>>> ===================================================================
>>>>>>> --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
>>>>>>> +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
>>>>>>> @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
>>>>>>>  		rcu_read_lock();
>>>>>>>  
>>>>>>>  		bp = per_cpu(bp_per_reg[i], cpu);
>>>>>>> -		if (bp)
>>>>>>> -			rc = NOTIFY_DONE;
>>>>>>>  		/*
>>>>>>>  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
>>>>>>>  		 * exception handling
>>>>>>> @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
>>>>>>>  			rcu_read_unlock();
>>>>>>>  			break;
>>>>>>>  		}
>>>>>>> +		/*
>>>>>>> +		 * Further processing in do_debug() is needed for a) user-space
>>>>>>> +		 * breakpoints (to generate signals) and b) when the system has
>>>>>>> +		 * taken exception due to multiple causes
>>>>>>> +		 */
>>>>>>> +		if (bp->attr.bp_addr < TASK_SIZE)
>>>>>>> +			rc = NOTIFY_DONE;
>>>>>>>  
>>>>>>>  		perf_bp_event(bp, args->regs);
>>>>>>>  
>>>>>>>
>>>>>> Oh and now that I see this patch, the previous one indeed makes sense
>>>>>> with this check:
>>>>>>
>>>>>> if (dr6 & (~DR_TRAP_BITS))
>>>>>> 	rc = NOTIFY_DONE;
>>>>>>
>>>>>> That said, it means thread.debugreg6 won't get the reserved bits anymore.
>>>>>> I see some use of them from kvm (it restores the reserved bits on guest<->host
>>>>>> switch). Not sure if this inconsistency could affect kvm...
>>>>>>
>>>>> Can you point me to the relevant code?
>>>>
>>>> I see various uses of DR6_VOLATILE and DR6_FIXED_1 in arch/x86/kvm/,
>>>> DR6_FIXED_1 being the fixed unused bits in dr6. Not sure how
>>>> this patch would affect what's set there.
>>>>
>>>> I'll wait for Jan's answer.
>>>>
>>> You may need to synchronize me: What does the patch change, the shadow
>>> register KVM will restore into DR6 on return to the host? Or the
>>> register content KVM finds on guest entry?
>>>
>> Sorry, this mail got buried deeply in my mailbox (hence the delay).
>>
>> Basically, this patch tries to remove DR6 from its reserved bits to help
>> easy checks for certain status bits (such as DR_STEP). For instance, in
>> order to verify if DR_STEP (Bit 14) is set we must now do
>> if ((DR6 & ~DR6_RESERVED) & DR_STEP) {}
>> or
>> if (DR6 & (DR_STEP | DR6_RESERVED)) {}
>> which is redundant.
>>
>> Instead this patch would expunge all reserved bits in DR6 before checks
>> for various status bits (to detect the cause of exception) are made in
>> do_debug().
>>
>> At the outset, I don't think changes in the way the value of DR6 is used
>> for comparison in do_debug() would affect exception handling for either
>> KVM's guest or host OS (given that there are no hooks for the same in
>> do_debug()).
>>
>>> The rules are simple: On entry, KVM assumes nothing about the register
>>> state, just overwrites it (on demand) with the guest state. On exit, it
>>> calls into hw_breakpoint_restore to ensure the host sees a proper state
>>> (if required). But there is at no time an architecturally invalid state
>>> loaded into the real register (that's basically what DR6_VOLATILE and
>>> DR6_FIXED_1 are used for while in guest mode).
>>>
>> Such a behaviour shouldn't be affected by the above change...your
>> confirmation would help!
>>
> 
> Hi Jan,
> 	I presume that the above explanation makes the role of this
> patch/bugfix clear.
> 
> Kindly let me know if you have any further queries.
> 

Nope. There should be really no conflicts of your optimization with kvm.

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2010-01-22  9:14               ` Jan Kiszka
@ 2010-01-22  9:21                 ` K.Prasad
  2010-01-25 22:21                   ` Frederic Weisbecker
  0 siblings, 1 reply; 20+ messages in thread
From: K.Prasad @ 2010-01-22  9:21 UTC (permalink / raw)
  To: Jan Kiszka, Frederic Weisbecker; +Cc: LKML, Ingo Molnar, Alan Stern

On Fri, Jan 22, 2010 at 10:14:54AM +0100, Jan Kiszka wrote:
> K.Prasad wrote:
> > On Sun, Jan 17, 2010 at 01:10:58AM +0530, K.Prasad wrote:
> >> On Mon, Jan 11, 2010 at 08:15:29PM +0100, Jan Kiszka wrote:
> >>> Frederic Weisbecker wrote:
> >>>> On Fri, Jan 01, 2010 at 12:32:17AM +0530, K.Prasad wrote:
> >>>>> On Thu, Dec 31, 2009 at 01:38:09AM +0100, Frederic Weisbecker wrote:
> >>>>>> On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> >>>>>>> The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
> >>>>>>> to generate SIGTRAP signal (and not for kernel-space addresses). 
> >>>>>>>
<snipped>
> >> Such a behaviour shouldn't be affected by the above change...your
> >> confirmation would help!
> >>
> > 
> > Hi Jan,
> > 	I presume that the above explanation makes the role of this
> > patch/bugfix clear.
> > 
> > Kindly let me know if you have any further queries.
> > 
> 
> Nope. There should be really no conflicts of your optimization with kvm.
> 
> Jan
> 
> -- 

Hi Jan,
	Thanks for the confirmation.

Hi Frederic,
	Can you pull these fixes in? (LKML references:
20091226182725.GB9494@in.ibm.com and 20091226182833.GC9494@in.ibm.com).

Thanks,
K.Prasad


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2009-12-26 18:28 ` [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler K.Prasad
                     ` (2 preceding siblings ...)
  2009-12-31  0:44   ` Frederic Weisbecker
@ 2010-01-25 22:11   ` Frederic Weisbecker
  2010-01-27 10:28     ` K.Prasad
  3 siblings, 1 reply; 20+ messages in thread
From: Frederic Weisbecker @ 2010-01-25 22:11 UTC (permalink / raw)
  To: K.Prasad; +Cc: LKML, Ingo Molnar, Alan Stern

On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
> to generate SIGTRAP signal (and not for kernel-space addresses). 


Please tell a bit more in your changelogs. It took me some time
to guess whether this is a fix or not.

And this is not a fix but an optimization because SIGTRAP
is only sent if needed.

Here is what happens in do_debug() after handling the
breakpoint:

	if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS))
		send_sigtrap(tsk, regs, error_code, si_code);

This can only happen if we took the ptrace handler path.

Also:


> Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> ---
>  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> ===================================================================
> --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
> +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
>  		rcu_read_lock();
>  
>  		bp = per_cpu(bp_per_reg[i], cpu);
> -		if (bp)
> -			rc = NOTIFY_DONE;
>  		/*
>  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
>  		 * exception handling
> @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
>  			rcu_read_unlock();
>  			break;
>  		}
> +		/*
> +		 * Further processing in do_debug() is needed for a) user-space
> +		 * breakpoints (to generate signals) and b) when the system has
> +		 * taken exception due to multiple causes
> +		 */
> +		if (bp->attr.bp_addr < TASK_SIZE)
> +			rc = NOTIFY_DONE;



Is that < TASK_SIZE an accurate check? We want support for
userspace breakpoints on perf tools later, and those don't want
signals.

We do this cleanup in the beginning of the breakpoint handler:

	current->thread.debugreg6 &= ~DR_TRAP_BITS;

And from ptrace.c:ptrace_triggered():

	thread->debugreg6 |= (DR_TRAP0 << i);

This is called on perf_bp_event().
Instead of checking if this is a userspace thread, we should actually
check if this is a ptrace breakpoint by looking at this
in the end of hw_breakpoint_handler().


	current->thread.debugreg6 & DR_TRAP_BITS


Only ptrace breakpoints require signals.

Thanks.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2010-01-22  9:21                 ` K.Prasad
@ 2010-01-25 22:21                   ` Frederic Weisbecker
  2010-01-27 10:29                     ` K.Prasad
  0 siblings, 1 reply; 20+ messages in thread
From: Frederic Weisbecker @ 2010-01-25 22:21 UTC (permalink / raw)
  To: K.Prasad; +Cc: Jan Kiszka, LKML, Ingo Molnar, Alan Stern

On Fri, Jan 22, 2010 at 02:51:27PM +0530, K.Prasad wrote:
> > >> Such a behaviour shouldn't be affected by the above change...your
> > >> confirmation would help!
> > >>
> > > 
> > > Hi Jan,
> > > 	I presume that the above explanation makes the role of this
> > > patch/bugfix clear.
> > > 
> > > Kindly let me know if you have any further queries.
> > > 
> > 
> > Nope. There should be really no conflicts of your optimization with kvm.
> > 
> > Jan
> > 
> > -- 
> 
> Hi Jan,
> 	Thanks for the confirmation.
> 
> Hi Frederic,
> 	Can you pull these fixes in? (LKML references:
> 20091226182725.GB9494@in.ibm.com and 20091226182833.GC9494@in.ibm.com).


I got a deeper look at these patches and answered with some comments.

If you address these, I can apply for .34 (because it's about optimizations
and not fixes).

Thanks.


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2010-01-25 22:11   ` Frederic Weisbecker
@ 2010-01-27 10:28     ` K.Prasad
  2010-01-27 16:11       ` Frederic Weisbecker
  0 siblings, 1 reply; 20+ messages in thread
From: K.Prasad @ 2010-01-27 10:28 UTC (permalink / raw)
  To: Frederic Weisbecker; +Cc: LKML, Ingo Molnar, Alan Stern

On Mon, Jan 25, 2010 at 11:11:04PM +0100, Frederic Weisbecker wrote:
> On Sat, Dec 26, 2009 at 11:58:33PM +0530, K.Prasad wrote:
> > The hw-breakpoint handler will return NOTIFY_DONE for user-space breakpoints
> > to generate SIGTRAP signal (and not for kernel-space addresses). 
> 
> 
> Please tell a bit more in your changelogs. It took me some time
> to guess whether this is a fix or not.
> 

Sorry about that...will add a descriptive changelog.

> And this is not a fix but an optimization because SIGTRAP
> is only sent if needed.
> 
> Here is what happens in do_debug() after handling the
> breakpoint:
> 
> 	if (tsk->thread.debugreg6 & (DR_STEP | DR_TRAP_BITS))
> 		send_sigtrap(tsk, regs, error_code, si_code);
> 
> This can only happen if we took the ptrace handler path.
>

Agreed...signals are prevented as above...except that the notifier
semantics aren't properly used (NOTIFY_DONE vs NOTIFY_STOP).

> Also:
> 
> 
> > Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
> > ---
> >  arch/x86/kernel/hw_breakpoint.c |    9 +++++++--
> >  1 file changed, 7 insertions(+), 2 deletions(-)
> > 
> > Index: linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> > ===================================================================
> > --- linux-2.6-tip.orig/arch/x86/kernel/hw_breakpoint.c
> > +++ linux-2.6-tip/arch/x86/kernel/hw_breakpoint.c
> > @@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handl
> >  		rcu_read_lock();
> >  
> >  		bp = per_cpu(bp_per_reg[i], cpu);
> > -		if (bp)
> > -			rc = NOTIFY_DONE;
> >  		/*
> >  		 * Reset the 'i'th TRAP bit in dr6 to denote completion of
> >  		 * exception handling
> > @@ -517,6 +515,13 @@ static int __kprobes hw_breakpoint_handl
> >  			rcu_read_unlock();
> >  			break;
> >  		}
> > +		/*
> > +		 * Further processing in do_debug() is needed for a) user-space
> > +		 * breakpoints (to generate signals) and b) when the system has
> > +		 * taken exception due to multiple causes
> > +		 */
> > +		if (bp->attr.bp_addr < TASK_SIZE)
> > +			rc = NOTIFY_DONE;
> 
> Is that < TASK_SIZE an accurate check? We want support for
> userspace breakpoints on perf tools later, and those don't want
> signals.
> 

Well, signal generation for user-space breakpoints happened
unconditionally for 'historical' reasons (guess that Alan Stern's
original patch had it that way).

We could change that into a 'ptrace-only' signal generation now.

> We do this cleanup in the beginning of the breakpoint handler:
> 
> 	current->thread.debugreg6 &= ~DR_TRAP_BITS;
> 
> And from ptrace.c:ptrace_triggered():
> 
> 	thread->debugreg6 |= (DR_TRAP0 << i);
> 
> This is called on perf_bp_event().
> Instead of checking if this is a userspace thread, we should actually
> check if this is a ptrace breakpoint by looking at this
> in the end of hw_breakpoint_handler().
> 
> 	current->thread.debugreg6 & DR_TRAP_BITS
> 
> Only ptrace breakpoints require signals.
>

Yes, this does look like a clean way to limit signals to those requests
that are interested (I was looking at round-about ways like doing a
lookup based on callback functions).

I will send the next version of the patch with the above changes.

Thanks,
K.Prasad


^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2010-01-25 22:21                   ` Frederic Weisbecker
@ 2010-01-27 10:29                     ` K.Prasad
  0 siblings, 0 replies; 20+ messages in thread
From: K.Prasad @ 2010-01-27 10:29 UTC (permalink / raw)
  To: Frederic Weisbecker; +Cc: Jan Kiszka, LKML, Ingo Molnar, Alan Stern

On Mon, Jan 25, 2010 at 11:21:41PM +0100, Frederic Weisbecker wrote:
> On Fri, Jan 22, 2010 at 02:51:27PM +0530, K.Prasad wrote:
> > > >> Such a behaviour shouldn't be affected by the above change...your
> > > >> confirmation would help!
> > > >>
> > > > 
> > > > Hi Jan,
> > > > 	I presume that the above explanation makes the role of this
> > > > patch/bugfix clear.
> > > > 
> > > > Kindly let me know if you have any further queries.
> > > > 
> > > 
> > > Nope. There should be really no conflicts of your optimization with kvm.
> > > 
> > > Jan
> > > 
> > > -- 
> > 
> > Hi Jan,
> > 	Thanks for the confirmation.
> > 
> > Hi Frederic,
> > 	Can you pull these fixes in? (LKML references:
> > 20091226182725.GB9494@in.ibm.com and 20091226182833.GC9494@in.ibm.com).
> 
> 
> I got a deeper look at these patches and answered with some comments.
> 
> If you address these, I can apply for .34 (because it's about optimizations
> and not fixes).
>

Sure, please apply them against a version that you deem appropriate.

Thanks,
K.Prasad
 

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler
  2010-01-27 10:28     ` K.Prasad
@ 2010-01-27 16:11       ` Frederic Weisbecker
  0 siblings, 0 replies; 20+ messages in thread
From: Frederic Weisbecker @ 2010-01-27 16:11 UTC (permalink / raw)
  To: K.Prasad; +Cc: LKML, Ingo Molnar, Alan Stern

On Wed, Jan 27, 2010 at 03:58:26PM +0530, K.Prasad wrote:
> On Mon, Jan 25, 2010 at 11:11:04PM +0100, Frederic Weisbecker wrote:
> > Is that < TASK_SIZE an accurate check? We want support for
> > userspace breakpoints on perf tools later, and those don't want
> > signals.
> > 
> 
> Well, signal generation for user-space breakpoints happened
> unconditionally for 'historical' reasons (guess that Alan Stern's
> original patch had it that way).
> 
> We could change that into a 'ptrace-only' signal generation now.



Yeah, now that we can have multiple-purpose concurrent breakpoints,
this is necessary.


 
> > We do this cleanup in the beginning of the breakpoint handler:
> > 
> > 	current->thread.debugreg6 &= ~DR_TRAP_BITS;
> > 
> > And from ptrace.c:ptrace_triggered():
> > 
> > 	thread->debugreg6 |= (DR_TRAP0 << i);
> > 
> > This is called on perf_bp_event().
> > Instead of checking if this is a userspace thread, we should actually
> > check if this is a ptrace breakpoint by looking at this
> > in the end of hw_breakpoint_handler().
> > 
> > 	current->thread.debugreg6 & DR_TRAP_BITS
> > 
> > Only ptrace breakpoints require signals.
> >
> 
> Yes, this does look like a clean way to limit signals to those requests
> that are interested (I was looking at round-about ways like doing a
> lookup based on callback functions).
> 
> I will send the next version of the patch with the above changes.


Thanks.


^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2010-01-27 16:11 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20091226175533.149765731@linux.vnet.ibm.com>
2009-12-26 18:27 ` [RFC Patch 1/2][Bugfix][x86][hw-breakpoint] Clear reserved bits of DR6 in do_debug() K.Prasad
2009-12-30 23:45   ` Frederic Weisbecker
2009-12-31 18:49     ` K.Prasad
2010-01-10  3:22       ` Frederic Weisbecker
2009-12-26 18:28 ` [RFC Patch 2/2][Bugfix][x86][hw-breakpoint] Fix return-code to notifier chain in hw_breakpoint_handler K.Prasad
2009-12-31  0:33   ` Frederic Weisbecker
2009-12-31  0:38   ` Frederic Weisbecker
2009-12-31 19:02     ` K.Prasad
2010-01-10  3:18       ` Frederic Weisbecker
2010-01-11 19:15         ` Jan Kiszka
2010-01-16 19:41           ` K.Prasad
2010-01-20  6:01             ` K.Prasad
2010-01-22  9:14               ` Jan Kiszka
2010-01-22  9:21                 ` K.Prasad
2010-01-25 22:21                   ` Frederic Weisbecker
2010-01-27 10:29                     ` K.Prasad
2009-12-31  0:44   ` Frederic Weisbecker
2010-01-25 22:11   ` Frederic Weisbecker
2010-01-27 10:28     ` K.Prasad
2010-01-27 16:11       ` Frederic Weisbecker

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).