CRIU sends SIGKILL to container's init process as a part of cleanup process if restoring failed. CRIU does this from a different ve, which is currently not allowed without any apparent reason. SIGKILL just ignored, thus CRIU hangs on wait for process being killed. So this patch allows such signals.
https://jira.sw.ru/browse/PSBM-40896 Signed-off-by: Andrey Ryabinin <[email protected]> --- include/linux/ve_proto.h | 3 --- kernel/signal.c | 27 ++------------------------- 2 files changed, 2 insertions(+), 28 deletions(-) diff --git a/include/linux/ve_proto.h b/include/linux/ve_proto.h index 0f5898e..153f18b 100644 --- a/include/linux/ve_proto.h +++ b/include/linux/ve_proto.h @@ -31,7 +31,6 @@ static inline bool ve_is_super(struct ve_struct *ve) } #define get_exec_env() (current->task_ve) -#define get_env_init(ve) (ve->ve_ns->pid_ns->child_reaper) const char *ve_name(struct ve_struct *ve); @@ -122,8 +121,6 @@ static inline struct ve_struct *get_exec_env(void) return NULL; } -#define get_env_init(ve) (ve->ve_ns->pid_ns->child_reaper) - static inline bool ve_is_super(struct ve_struct *ve) { return true; diff --git a/kernel/signal.c b/kernel/signal.c index 357f164..49fbdb0 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -55,27 +55,6 @@ static inline int is_si_special(const struct siginfo *info); int print_fatal_signals __read_mostly; -static int sig_ve_ignored(int sig, struct siginfo *info, struct task_struct *t) -{ - struct ve_struct *ve; - - /* always allow signals from the kernel */ - if (info == SEND_SIG_FORCED || - (!is_si_special(info) && SI_FROMKERNEL(info))) - return 0; - - ve = get_exec_env(); - if (ve_is_super(ve)) - return 0; - rcu_read_lock(); - if (ve->ve_ns && get_env_init(ve) != t) { - rcu_read_unlock(); - return 0; - } - rcu_read_unlock(); - return !sig_user_defined(t, sig) || sig_kernel_only(sig); -} - static void __user *sig_handler(struct task_struct *t, int sig) { return t->sighand->action[sig - 1].sa.sa_handler; @@ -1361,8 +1340,7 @@ int group_send_sig_info(int sig, struct siginfo *info, struct task_struct *p) rcu_read_unlock(); if (!ret && sig) - ret = sig_ve_ignored(sig, info, p) ? 0 : - do_send_sig_info(sig, info, p, true); + ret = do_send_sig_info(sig, info, p, true); return ret; } @@ -2976,8 +2954,7 @@ do_send_specific(pid_t tgid, pid_t pid, int sig, struct siginfo *info) * probe. No signal is actually delivered. */ if (!error && sig) { - if (!sig_ve_ignored(sig, info, p)) - error = do_send_sig_info(sig, info, p, false); + error = do_send_sig_info(sig, info, p, false); /* * If lock_task_sighand() failed we pretend the task * dies after receiving the signal. The window is tiny, -- 2.4.10 _______________________________________________ Devel mailing list [email protected] https://lists.openvz.org/mailman/listinfo/devel
