[Devel] [PATCH rh7] ve: Revert "ve/pid_ns: reap zombies with external parent on container's init exit"

Kirill Tkhai ktkhai at odin.com
Thu Apr 30 04:38:46 PDT 2015


Revert commit 4dba4987c61aff42e36aa3c889ba68dab84b0be8 ported from 2.6.32 kernel.

It's unnecessary because the shutdown sequence was reworked by Konstantin
Khlebnikov earlier in commit b5656165832b19ad628eee2a80a939625d43eab1.

With 4dba4987c61aff42e36aa3c889ba68dab84b0be8 applied we has a problem with
double task waiting which leads to memory corruption.
https://jira.sw.ru/browse/PSBM-33254

NOTE: vzctl from PCS6 and PCS7 does not need functionality like this. The first
one ignores signals (and child autoreaps), the second waits for its child in-ve
process exit (and reaps it). So, this was need for versions <= PCS5.

Signed-off-by: Kirill Tkhai <ktkhai at odin.com>
---
 include/linux/sched.h  |    2 --
 include/linux/ve.h     |    2 --
 kernel/exit.c          |   15 ---------------
 kernel/pid_namespace.c |    2 --
 kernel/ve/ve.c         |   38 --------------------------------------
 5 files changed, 59 deletions(-)

diff --git a/include/linux/sched.h b/include/linux/sched.h
index b5e5a17..7a3b793 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2291,8 +2291,6 @@ extern int allow_signal(int);
 extern void exit_mm(struct task_struct *);
 extern int disallow_signal(int);
 
-extern int reap_zombie(struct task_struct *);
-
 extern int do_execve(const char *,
 		     const char __user * const __user *,
 		     const char __user * const __user *);
diff --git a/include/linux/ve.h b/include/linux/ve.h
index 98dd244..e087edb 100644
--- a/include/linux/ve.h
+++ b/include/linux/ve.h
@@ -219,7 +219,6 @@ static inline int vtty_open_master(int veid, int idx) { return -ENODEV; }
 
 void ve_stop_ns(struct pid_namespace *ns);
 void ve_exit_ns(struct pid_namespace *ns);
-void ve_reap_external(struct pid_namespace *ns);
 int ve_start_container(struct ve_struct *ve);
 
 #else	/* CONFIG_VE */
@@ -237,7 +236,6 @@ static inline int vz_security_protocol_check(struct net *net, int protocol) { re
 
 static inline void ve_stop_ns(struct pid_namespace *ns) { }
 static inline void ve_exit_ns(struct pid_namespace *ns) { }
-static inline void ve_reap_external(struct pid_namespace *s) ( )
 
 #define kthread_create_on_node_ve(ve, threadfn, data, node, namefmt...)	\
 	kthread_create_on_node_ve(threadfn, data, node, namefmt...)
diff --git a/kernel/exit.c b/kernel/exit.c
index 5e43932..56b840c 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -1215,21 +1215,6 @@ static int wait_task_zombie(struct wait_opts *wo, struct task_struct *p)
 	return retval;
 }
 
-int reap_zombie(struct task_struct *p)
-{
-	struct wait_opts wo = {
-		.wo_flags = WEXITED,
-	};
-	int ret = 0;
-
-	if (p->exit_state == EXIT_ZOMBIE && !delay_group_leader(p)) {
-		p->exit_signal = -1;
-		ret = wait_task_zombie(&wo, p);
-	}
-
-	return ret;
-}
-
 static int *task_stopped_code(struct task_struct *p, bool ptrace)
 {
 	if (ptrace) {
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c
index cbff312..173b7df 100644
--- a/kernel/pid_namespace.c
+++ b/kernel/pid_namespace.c
@@ -236,8 +236,6 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns)
 		rc = sys_wait4(-1, NULL, __WALL, NULL);
 	} while (rc != -ECHILD);
 
-	ve_reap_external(pid_ns);
-
 	/*
 	 * sys_wait4() above can't reap the TASK_DEAD children.
 	 * Make sure they all go away, see free_pid().
diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index e963b56..eaad9eb 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -589,44 +589,6 @@ int ve_start_container(struct ve_struct *ve)
 }
 EXPORT_SYMBOL_GPL(ve_start_container);
 
-static bool ve_reap_one(struct pid_namespace *pid_ns)
-{
-	struct task_struct *task;
-	int nr;
-	bool reaped = false;
-
-	read_lock(&tasklist_lock);
-	nr = next_pidmap(pid_ns, 1);
-	while (nr > 0) {
-		rcu_read_lock();
-
-		task = pid_task(find_vpid(nr), PIDTYPE_PID);
-		if (task && task != current &&
-		    task->exit_state != EXIT_DEAD &&
-		    !(task->flags & PF_KTHREAD)) {
-			printk(KERN_INFO "VE#%d: found task on stop: %s (pid:"
-				"%d, exit_state: %d)\n", task->task_ve->veid,
-					task->comm, task_pid_nr(task),
-					task->exit_state);
-			reaped = true;
-			if (reap_zombie(task))
-				read_lock(&tasklist_lock);
-		}
-
-		rcu_read_unlock();
-
-		nr = next_pidmap(pid_ns, nr);
-	}
-	read_unlock(&tasklist_lock);
-	return reaped;
-}
-
-void ve_reap_external(struct pid_namespace *pid_ns)
-{
-	while (ve_reap_one(pid_ns))
-		schedule();
-}
-
 void ve_stop_ns(struct pid_namespace *pid_ns)
 {
 	struct ve_struct *ve = current->task_ve;




More information about the Devel mailing list