From: Greg Kroah-Hartman Date: Fri, 4 Jul 2014 22:11:34 +0000 (-0700) Subject: 3.4-stable patches X-Git-Tag: v3.4.97~2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f478e809e641ebfef08f1ae4c6843f86a82aeaec;p=thirdparty%2Fkernel%2Fstable-queue.git 3.4-stable patches added patches: tracing-fix-syscall_-regfunc-vs-copy_process-race.patch --- diff --git a/queue-3.4/series b/queue-3.4/series index 7130e8ddbf3..de6b7d8b224 100644 --- a/queue-3.4/series +++ b/queue-3.4/series @@ -16,3 +16,4 @@ powerpc-pseries-fix-overwritten-pe-state.patch powerpc-fix-typo-config_pmac.patch powerpc-fix-typo-config_ppc_cpu.patch ptrace-x86-force-iret-path-after-a-ptrace_stop.patch +tracing-fix-syscall_-regfunc-vs-copy_process-race.patch diff --git a/queue-3.4/tracing-fix-syscall_-regfunc-vs-copy_process-race.patch b/queue-3.4/tracing-fix-syscall_-regfunc-vs-copy_process-race.patch new file mode 100644 index 00000000000..003e441f83d --- /dev/null +++ b/queue-3.4/tracing-fix-syscall_-regfunc-vs-copy_process-race.patch @@ -0,0 +1,72 @@ +From 4af4206be2bd1933cae20c2b6fb2058dbc887f7c Mon Sep 17 00:00:00 2001 +From: Oleg Nesterov +Date: Sun, 13 Apr 2014 20:58:54 +0200 +Subject: tracing: Fix syscall_*regfunc() vs copy_process() race + +From: Oleg Nesterov + +commit 4af4206be2bd1933cae20c2b6fb2058dbc887f7c upstream. + +syscall_regfunc() and syscall_unregfunc() should set/clear +TIF_SYSCALL_TRACEPOINT system-wide, but do_each_thread() can race +with copy_process() and miss the new child which was not added to +the process/thread lists yet. + +Change copy_process() to update the child's TIF_SYSCALL_TRACEPOINT +under tasklist. + +Link: http://lkml.kernel.org/p/20140413185854.GB20668@redhat.com + +Fixes: a871bd33a6c0 "tracing: Add syscall tracepoints" +Acked-by: Frederic Weisbecker +Acked-by: Paul E. McKenney +Signed-off-by: Oleg Nesterov +Signed-off-by: Steven Rostedt +Signed-off-by: Greg Kroah-Hartman + +--- + include/trace/syscall.h | 15 +++++++++++++++ + kernel/fork.c | 2 ++ + 2 files changed, 17 insertions(+) + +--- a/include/trace/syscall.h ++++ b/include/trace/syscall.h +@@ -4,6 +4,7 @@ + #include + #include + #include ++#include + + #include + +@@ -54,4 +55,18 @@ int perf_sysexit_enable(struct ftrace_ev + void perf_sysexit_disable(struct ftrace_event_call *call); + #endif + ++#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_HAVE_SYSCALL_TRACEPOINTS) ++static inline void syscall_tracepoint_update(struct task_struct *p) ++{ ++ if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) ++ set_tsk_thread_flag(p, TIF_SYSCALL_TRACEPOINT); ++ else ++ clear_tsk_thread_flag(p, TIF_SYSCALL_TRACEPOINT); ++} ++#else ++static inline void syscall_tracepoint_update(struct task_struct *p) ++{ ++} ++#endif ++ + #endif /* _TRACE_SYSCALL_H */ +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -1441,7 +1441,9 @@ static struct task_struct *copy_process( + + total_forks++; + spin_unlock(¤t->sighand->siglock); ++ syscall_tracepoint_update(p); + write_unlock_irq(&tasklist_lock); ++ + proc_fork_connector(p); + cgroup_post_fork(p); + if (clone_flags & CLONE_THREAD)