浏览代码

ftrace: do_each_pid_task() needs rcu lock

"ftrace: use struct pid" commit 978f3a45d9499c7a447ca7615455cefb63d44165
converted ftrace_pid_trace to "struct pid*".

But we can't use do_each_pid_task() without rcu_read_lock() even if
we know the pid itself can't go away (it was pinned in ftrace_pid_write).
The exiting task can detach itself from this pid at any moment.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Oleg Nesterov 16 年之前
父节点
当前提交
229c4ef8ae
共有 1 个文件被更改,包括 5 次插入0 次删除
  1. 5 0
      kernel/trace/ftrace.c

+ 5 - 0
kernel/trace/ftrace.c

@@ -1737,9 +1737,12 @@ static void clear_ftrace_pid(struct pid *pid)
 {
 {
 	struct task_struct *p;
 	struct task_struct *p;
 
 
+	rcu_read_lock();
 	do_each_pid_task(pid, PIDTYPE_PID, p) {
 	do_each_pid_task(pid, PIDTYPE_PID, p) {
 		clear_tsk_trace_trace(p);
 		clear_tsk_trace_trace(p);
 	} while_each_pid_task(pid, PIDTYPE_PID, p);
 	} while_each_pid_task(pid, PIDTYPE_PID, p);
+	rcu_read_unlock();
+
 	put_pid(pid);
 	put_pid(pid);
 }
 }
 
 
@@ -1747,9 +1750,11 @@ static void set_ftrace_pid(struct pid *pid)
 {
 {
 	struct task_struct *p;
 	struct task_struct *p;
 
 
+	rcu_read_lock();
 	do_each_pid_task(pid, PIDTYPE_PID, p) {
 	do_each_pid_task(pid, PIDTYPE_PID, p) {
 		set_tsk_trace_trace(p);
 		set_tsk_trace_trace(p);
 	} while_each_pid_task(pid, PIDTYPE_PID, p);
 	} while_each_pid_task(pid, PIDTYPE_PID, p);
+	rcu_read_unlock();
 }
 }
 
 
 static void clear_ftrace_pid_task(struct pid **pid)
 static void clear_ftrace_pid_task(struct pid **pid)