The commit is pushed to "branch-rh9-5.14.vz9.1.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git after ark-5.14 ------> commit 07a024cc540630c67156b0db494a7cd2bc0dbda6 Author: Stanislav Kinsburskiy <skinsbur...@virtuozzo.com> Date: Tue Sep 28 14:42:36 2021 +0300
ve/umh: add per-container usermodehelper thread 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); _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel