瀏覽代碼

coredump: zap_threads() must skip kernel threads

The main loop in zap_threads() must skip kthreads which may use the same
mm.  Otherwise we "kill" this thread erroneously (for example, it can not
fork or exec after that), and the coredumping task stucks in the
TASK_UNINTERRUPTIBLE state forever because of the wrong ->core_waiters
count.

Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Roland McGrath <roland@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Oleg Nesterov 17 年之前
父節點
當前提交
15b9f360c0
共有 1 個文件被更改,包括 3 次插入2 次删除
  1. 3 2
      fs/exec.c

+ 3 - 2
fs/exec.c

@@ -1574,11 +1574,12 @@ static inline int zap_threads(struct task_struct *tsk, struct mm_struct *mm,
 	for_each_process(g) {
 	for_each_process(g) {
 		if (g == tsk->group_leader)
 		if (g == tsk->group_leader)
 			continue;
 			continue;
-
+		if (g->flags & PF_KTHREAD)
+			continue;
 		p = g;
 		p = g;
 		do {
 		do {
 			if (p->mm) {
 			if (p->mm) {
-				if (p->mm == mm) {
+				if (unlikely(p->mm == mm)) {
 					lock_task_sighand(p, &flags);
 					lock_task_sighand(p, &flags);
 					zap_process(p);
 					zap_process(p);
 					unlock_task_sighand(p, &flags);
 					unlock_task_sighand(p, &flags);