[Devel] [PATCH rh7] signal/ve: allow to send signal from another ve namespace

Andrey Ryabinin aryabinin at virtuozzo.com
Thu Nov 12 06:14:58 PST 2015


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 <aryabinin at virtuozzo.com>
---
 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



More information about the Devel mailing list