ptrace_write_dr7() looks unnecessarily overcomplicated. We can
factor out ptrace_modify_breakpoint() and do not do "continue"
twice, just we need to pass the proper "disabled" argument to
ptrace_modify_breakpoint().

Signed-off-by: Oleg Nesterov <o...@redhat.com>
---
 arch/x86/kernel/ptrace.c |   40 +++++++++++++++-------------------------
 1 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index 7a98b21..0649f16 100644
--- a/arch/x86/kernel/ptrace.c
+++ b/arch/x86/kernel/ptrace.c
@@ -637,9 +637,7 @@ static int ptrace_write_dr7(struct task_struct *tsk, 
unsigned long data)
        struct thread_struct *thread = &(tsk->thread);
        unsigned long old_dr7;
        int i, orig_ret = 0, rc = 0;
-       int enabled, second_pass = 0;
-       unsigned len, type;
-       struct perf_event *bp;
+       int second_pass = 0;
 
        data &= ~DR_CONTROL_RESERVED;
        old_dr7 = ptrace_get_dr7(thread->ptrace_bps);
@@ -649,30 +647,22 @@ restore:
         * appropriate changes to each.
         */
        for (i = 0; i < HBP_NUM; i++) {
-               enabled = decode_dr7(data, i, &len, &type);
-               bp = thread->ptrace_bps[i];
-
-               if (!enabled) {
-                       if (bp) {
-                               /*
-                                * Don't unregister the breakpoints right-away,
-                                * unless all register_user_hw_breakpoint()
-                                * requests have succeeded. This prevents
-                                * any window of opportunity for debug
-                                * register grabbing by other users.
-                                */
-                               if (!second_pass)
-                                       continue;
-
-                               rc = ptrace_modify_breakpoint(bp, len, type,
-                                                             tsk, 1);
-                               if (rc)
-                                       break;
-                       }
-                       continue;
+               unsigned len, type;
+               bool disabled = !decode_dr7(data, i, &len, &type);
+               struct perf_event *bp = thread->ptrace_bps[i];
+
+               if (disabled) {
+                       /*
+                        * Don't unregister the breakpoints right-away, unless
+                        * all register_user_hw_breakpoint() requests have
+                        * succeeded. This prevents any window of opportunity
+                        * for debug register grabbing by other users.
+                        */
+                       if (!bp || !second_pass)
+                               continue;
                }
 
-               rc = ptrace_modify_breakpoint(bp, len, type, tsk, 0);
+               rc = ptrace_modify_breakpoint(bp, len, type, tsk, disabled);
                if (rc)
                        break;
        }
-- 
1.5.5.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to