From: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>

Signed-off-by: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com>

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

Simplify the code by removing useless macroses.

Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com>

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

Signed-off-by: Nikita Yushchenko <nikita.yushche...@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

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to