]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 4 Jul 2014 22:11:34 +0000 (15:11 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 4 Jul 2014 22:11:34 +0000 (15:11 -0700)
added patches:
tracing-fix-syscall_-regfunc-vs-copy_process-race.patch

queue-3.4/series
queue-3.4/tracing-fix-syscall_-regfunc-vs-copy_process-race.patch [new file with mode: 0644]

index 7130e8ddbf3c9a4e10fdd5a7d705c7a62fbe630c..de6b7d8b224753699c0356f7c2c497d095574cec 100644 (file)
@@ -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 (file)
index 0000000..003e441
--- /dev/null
@@ -0,0 +1,72 @@
+From 4af4206be2bd1933cae20c2b6fb2058dbc887f7c Mon Sep 17 00:00:00 2001
+From: Oleg Nesterov <oleg@redhat.com>
+Date: Sun, 13 Apr 2014 20:58:54 +0200
+Subject: tracing: Fix syscall_*regfunc() vs copy_process() race
+
+From: Oleg Nesterov <oleg@redhat.com>
+
+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 <fweisbec@gmail.com>
+Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
+Signed-off-by: Oleg Nesterov <oleg@redhat.com>
+Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 <linux/tracepoint.h>
+ #include <linux/unistd.h>
+ #include <linux/ftrace_event.h>
++#include <linux/thread_info.h>
+ #include <asm/ptrace.h>
+@@ -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(&current->sighand->siglock);
++      syscall_tracepoint_update(p);
+       write_unlock_irq(&tasklist_lock);
++
+       proc_fork_connector(p);
+       cgroup_post_fork(p);
+       if (clone_flags & CLONE_THREAD)