arch/tile: clean up tile-specific PTRACE_SETOPTIONS
authorChris Metcalf <cmetcalf@tilera.com>
Thu, 13 Dec 2012 16:34:45 +0000 (11:34 -0500)
committerChris Metcalf <cmetcalf@tilera.com>
Fri, 14 Dec 2012 17:56:54 +0000 (12:56 -0500)
Use the newer idioms for setting PTRACE_O_xxx and PT_TRACE_xxx flags.
Only set/clear tile-specific flags if the generic routine returns
success, since otherwise we want to avoid setting any flags at all.
Atomically update the ptrace flags with the new values.  Eliminate
the PT_TRACE_MASK_TILE bitmask and just shift PTRACE_O_MASK_TILE.
Add a BUILD_BUG_ON to avoid overlapping with generic bits.

Acked-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
arch/tile/include/asm/ptrace.h
arch/tile/include/uapi/asm/ptrace.h
arch/tile/kernel/ptrace.c

index 1a4fd9ab0ee1663ce4a4bdb86584be442c345dad..5ce052e16b7b1ca84c6b65af38362e14d4ea3bbf 100644 (file)
@@ -24,8 +24,7 @@ typedef unsigned long pt_reg_t;
 #include <uapi/asm/ptrace.h>
 
 #define PTRACE_O_MASK_TILE     (PTRACE_O_TRACEMIGRATE)
-#define PT_TRACE_MIGRATE       0x00080000
-#define PT_TRACE_MASK_TILE     (PT_TRACE_MIGRATE)
+#define PT_TRACE_MIGRATE       PT_EVENT_FLAG(PTRACE_EVENT_MIGRATE)
 
 /* Flag bits in pt_regs.flags */
 #define PT_FLAGS_DISABLE_IRQ    1  /* on return to kernel, disable irqs */
index 0d2208803b2958220ea0427c86ad7e316ef454b0..7757e1985fb65314f9a3cda3dd00f3414cafc486 100644 (file)
@@ -81,8 +81,8 @@ struct pt_regs {
 #define PTRACE_SETFPREGS       15
 
 /* Support TILE-specific ptrace options, with events starting at 16. */
-#define PTRACE_O_TRACEMIGRATE  0x00010000
 #define PTRACE_EVENT_MIGRATE   16
+#define PTRACE_O_TRACEMIGRATE  (1 << PTRACE_EVENT_MIGRATE)
 
 /*
  * Flag bits in pt_regs.flags that are part of the ptrace API.
index 64ba102c59649da83888895cd4110718cfeda58a..b32bc3f9d631b5ad23ae85d980e610b21333d0f3 100644 (file)
@@ -151,12 +151,16 @@ long arch_ptrace(struct task_struct *child, long request,
 
        case PTRACE_SETOPTIONS:
                /* Support TILE-specific ptrace options. */
-               child->ptrace &= ~PT_TRACE_MASK_TILE;
+               BUILD_BUG_ON(PTRACE_O_MASK_TILE & PTRACE_O_MASK);
                tmp = data & PTRACE_O_MASK_TILE;
                data &= ~PTRACE_O_MASK_TILE;
                ret = ptrace_request(child, request, addr, data);
-               if (tmp & PTRACE_O_TRACEMIGRATE)
-                       child->ptrace |= PT_TRACE_MIGRATE;
+               if (ret == 0) {
+                       unsigned int flags = child->ptrace;
+                       flags &= ~(PTRACE_O_MASK_TILE << PT_OPT_FLAG_SHIFT);
+                       flags |= (tmp << PT_OPT_FLAG_SHIFT);
+                       child->ptrace = flags;
+               }
                break;
 
        default: