[Devel] [PATCH vz9 06/14] ve/umh: add per-container usermodehelper thread

Nikita Yushchenko nikita.yushchenko at virtuozzo.com
Mon Sep 27 09:29:52 MSK 2021


From: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>

Signed-off-by: Stanislav Kinsburskiy <skinsbursky at virtuozzo.com>

+++
ve, kthread: Remove some useless crud.

Simplify the code by removing useless macroses.

Signed-off-by: Andrey Ryabinin <aryabinin at virtuozzo.com>

(cherry-picked from vz8 commit 890476830003 ("ve/umh: add per-container
usermodehelper thread"))

Signed-off-by: Nikita Yushchenko <nikita.yushchenko at virtuozzo.com>
---
 include/linux/ve.h |  4 ++++
 kernel/ve/ve.c     | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/include/linux/ve.h b/include/linux/ve.h
index cea4fa48d939..f80dca3d3d84 100644
--- a/include/linux/ve.h
+++ b/include/linux/ve.h
@@ -14,6 +14,7 @@
 #include <linux/ve_proto.h>
 #include <linux/cgroup.h>
 #include <linux/kmapset.h>
+#include <linux/kthread.h>
 #include <linux/vzstat.h>
 
 struct nsproxy;
@@ -62,6 +63,9 @@ struct ve_struct {
 
 	struct kthread_worker	*kthreadd_worker;
 	struct task_struct	*kthreadd_task;
+
+	struct kthread_worker	umh_worker;
+	struct task_struct	*umh_task;
 };
 
 extern int nr_ve;
diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index 9c0070c39eb4..2f0eff24156a 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -265,6 +265,31 @@ static void ve_drop_context(struct ve_struct *ve)
 	ve->init_cred = NULL;
 }
 
+static void ve_stop_umh(struct ve_struct *ve)
+{
+	kthread_flush_worker(&ve->umh_worker);
+	kthread_stop(ve->umh_task);
+	ve->umh_task = NULL;
+}
+
+static int ve_start_umh(struct ve_struct *ve)
+{
+	struct task_struct *task;
+
+	kthread_init_worker(&ve->umh_worker);
+
+	task = kthread_create_on_node_ve_flags(ve, 0, kthread_worker_fn,
+				      &ve->umh_worker, NUMA_NO_NODE,
+				      "khelper");
+	if (IS_ERR(task))
+		return PTR_ERR(task);
+
+	wake_up_process(task);
+
+	ve->umh_task = task;
+	return 0;
+}
+
 static void ve_stop_kthreadd(struct ve_struct *ve)
 {
 	kthread_flush_worker(ve->kthreadd_worker);
@@ -430,6 +455,10 @@ static int ve_start_container(struct ve_struct *ve)
 	if (err)
 		goto err_kthreadd;
 
+	err = ve_start_umh(ve);
+	if (err)
+		goto err_umh;
+
 	err = ve_hook_iterate_init(VE_SS_CHAIN, ve);
 	if (err < 0)
 		goto err_iterate;
@@ -445,6 +474,8 @@ static int ve_start_container(struct ve_struct *ve)
 	return 0;
 
 err_iterate:
+	ve_stop_umh(ve);
+err_umh:
 	ve_stop_kthreadd(ve);
 err_kthreadd:
 	ve_list_del(ve);
@@ -480,6 +511,7 @@ void ve_stop_ns(struct pid_namespace *pid_ns)
 	/*
 	 * Stop kthreads, or zap_pid_ns_processes() will wait them forever.
 	 */
+	ve_stop_umh(ve);
 	ve_stop_kthreadd(ve);
 unlock:
 	up_write(&ve->op_sem);
-- 
2.30.2



More information about the Devel mailing list