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
