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 <[email protected]>
---
 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;

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to