Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ptrace: revert "Prepare to fix racy accesses on task breakpoints"

This reverts commit bf26c018490c ("Prepare to fix racy accesses on task
breakpoints").

The patch was fine but we can no longer race with SIGKILL after commit
9899d11f6544 ("ptrace: ensure arch_ptrace/ptrace_request can never race
with SIGKILL"), the __TASK_TRACED tracee can't be woken up and
->ptrace_bps[] can't go away.

Now that ptrace_get_breakpoints/ptrace_put_breakpoints have no callers,
we can kill them and remove task->ptrace_bp_refcnt.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Acked-by: Michael Neuling <mikey@neuling.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jan Kratochvil <jan.kratochvil@redhat.com>
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>

authored by

Oleg Nesterov and committed by
Linus Torvalds
7c8df286 e8c073c4

+1 -30
-10
include/linux/ptrace.h
··· 142 142 { 143 143 INIT_LIST_HEAD(&child->ptrace_entry); 144 144 INIT_LIST_HEAD(&child->ptraced); 145 - #ifdef CONFIG_HAVE_HW_BREAKPOINT 146 - atomic_set(&child->ptrace_bp_refcnt, 1); 147 - #endif 148 145 child->jobctl = 0; 149 146 child->ptrace = 0; 150 147 child->parent = child->real_parent; ··· 347 350 extern int task_current_syscall(struct task_struct *target, long *callno, 348 351 unsigned long args[6], unsigned int maxargs, 349 352 unsigned long *sp, unsigned long *pc); 350 - 351 - #ifdef CONFIG_HAVE_HW_BREAKPOINT 352 - extern int ptrace_get_breakpoints(struct task_struct *tsk); 353 - extern void ptrace_put_breakpoints(struct task_struct *tsk); 354 - #else 355 - static inline void ptrace_put_breakpoints(struct task_struct *tsk) { } 356 - #endif /* CONFIG_HAVE_HW_BREAKPOINT */ 357 353 358 354 #endif
-3
include/linux/sched.h
··· 1401 1401 } memcg_batch; 1402 1402 unsigned int memcg_kmem_skip_account; 1403 1403 #endif 1404 - #ifdef CONFIG_HAVE_HW_BREAKPOINT 1405 - atomic_t ptrace_bp_refcnt; 1406 - #endif 1407 1404 #ifdef CONFIG_UPROBES 1408 1405 struct uprobe_task *utask; 1409 1406 #endif
+1 -1
kernel/exit.c
··· 808 808 /* 809 809 * FIXME: do that only when needed, using sched_exit tracepoint 810 810 */ 811 - ptrace_put_breakpoints(tsk); 811 + flush_ptrace_hw_breakpoint(tsk); 812 812 813 813 exit_notify(tsk, group_dead); 814 814 #ifdef CONFIG_NUMA
-16
kernel/ptrace.c
··· 1221 1221 return ret; 1222 1222 } 1223 1223 #endif /* CONFIG_COMPAT */ 1224 - 1225 - #ifdef CONFIG_HAVE_HW_BREAKPOINT 1226 - int ptrace_get_breakpoints(struct task_struct *tsk) 1227 - { 1228 - if (atomic_inc_not_zero(&tsk->ptrace_bp_refcnt)) 1229 - return 0; 1230 - 1231 - return -1; 1232 - } 1233 - 1234 - void ptrace_put_breakpoints(struct task_struct *tsk) 1235 - { 1236 - if (atomic_dec_and_test(&tsk->ptrace_bp_refcnt)) 1237 - flush_ptrace_hw_breakpoint(tsk); 1238 - } 1239 - #endif /* CONFIG_HAVE_HW_BREAKPOINT */