aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/hw_breakpoint.c
diff options
context:
space:
mode:
authorK.Prasad <prasad@linux.vnet.ibm.com>2010-01-28 06:14:15 -0500
committerFrederic Weisbecker <fweisbec@gmail.com>2010-01-28 20:44:30 -0500
commite0e53db6133c32964fd17f20b17073a402f07ed3 (patch)
tree72daeb1abb53901a0c8c10cbff234b5c4f9521c0 /arch/x86/kernel/hw_breakpoint.c
parent40f9249a73f6c251adea492b1c3d19d39e2a9bda (diff)
x86/hw-breakpoints: Optimize return code from notifier chain in hw_breakpoint_handler
Processing of debug exceptions in do_debug() can stop if it originated from a hw-breakpoint exception by returning NOTIFY_STOP in most cases. But for certain cases such as: a) user-space breakpoints with pending SIGTRAP signal delivery (as in the case of ptrace induced breakpoints). b) exceptions due to other causes than breakpoints We will continue to process the exception by returning NOTIFY_DONE. Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com> Cc: Ingo Molnar <mingo@elte.hu> Cc: Roland McGrath <roland@redhat.com> Cc: Alan Stern <stern@rowland.harvard.edu> Cc: Jan Kiszka <jan.kiszka@siemens.com> LKML-Reference: <20100128111415.GC13935@in.ibm.com> Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Diffstat (limited to 'arch/x86/kernel/hw_breakpoint.c')
-rw-r--r--arch/x86/kernel/hw_breakpoint.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/arch/x86/kernel/hw_breakpoint.c b/arch/x86/kernel/hw_breakpoint.c
index 05d5fec64a94..ae90b4739435 100644
--- a/arch/x86/kernel/hw_breakpoint.c
+++ b/arch/x86/kernel/hw_breakpoint.c
@@ -502,8 +502,6 @@ static int __kprobes hw_breakpoint_handler(struct die_args *args)
502 rcu_read_lock(); 502 rcu_read_lock();
503 503
504 bp = per_cpu(bp_per_reg[i], cpu); 504 bp = per_cpu(bp_per_reg[i], cpu);
505 if (bp)
506 rc = NOTIFY_DONE;
507 /* 505 /*
508 * Reset the 'i'th TRAP bit in dr6 to denote completion of 506 * Reset the 'i'th TRAP bit in dr6 to denote completion of
509 * exception handling 507 * exception handling
@@ -522,7 +520,13 @@ static int __kprobes hw_breakpoint_handler(struct die_args *args)
522 520
523 rcu_read_unlock(); 521 rcu_read_unlock();
524 } 522 }
525 if (dr6 & (~DR_TRAP_BITS)) 523 /*
524 * Further processing in do_debug() is needed for a) user-space
525 * breakpoints (to generate signals) and b) when the system has
526 * taken exception due to multiple causes
527 */
528 if ((current->thread.debugreg6 & DR_TRAP_BITS) ||
529 (dr6 & (~DR_TRAP_BITS)))
526 rc = NOTIFY_DONE; 530 rc = NOTIFY_DONE;
527 531
528 set_debugreg(dr7, 7); 532 set_debugreg(dr7, 7);