ptrace/x86: simplify the "disable" logic in ptrace_write_dr7()
authorOleg Nesterov <oleg@redhat.com>
Mon, 8 Jul 2013 23:00:56 +0000 (16:00 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 9 Jul 2013 17:33:26 +0000 (10:33 -0700)
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 <oleg@redhat.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
Cc: Michael Neuling <mikey@neuling.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Will Deacon <will.deacon@arm.com>
Cc: Prasad <prasad@linux.vnet.ibm.com>
Cc: Russell King <linux@arm.linux.org.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
arch/x86/kernel/ptrace.c

index 7a98b21..0649f16 100644 (file)
@@ -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;
        }