[Devel] [PATCH v11 01/12] ve/cgroup: implemented per-ve workqueue.
Valeriy Vdovin
valeriy.vdovin at virtuozzo.com
Fri Apr 17 17:55:33 MSK 2020
Signed-off-by: Valeriy Vdovin <valeriy.vdovin at virtuozzo.com>
Reviewed-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
include/linux/ve.h | 2 ++
kernel/ve/ve.c | 25 +++++++++++++++++++++++++
2 files changed, 27 insertions(+)
diff --git a/include/linux/ve.h b/include/linux/ve.h
index 9d60838..362dae1 100644
--- a/include/linux/ve.h
+++ b/include/linux/ve.h
@@ -125,6 +125,8 @@ struct ve_struct {
struct cn_private *cn;
#endif
struct kmapset_key sysfs_perms_key;
+
+ struct workqueue_struct *wq;
};
struct ve_devmnt {
diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index ad3a698..967258f 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -481,6 +481,21 @@ static const struct timespec zero_time = { };
extern void cgroup_mark_ve_root(struct ve_struct *ve);
+static int ve_workqueue_start(struct ve_struct *ve)
+{
+ ve->wq = alloc_workqueue("ve_wq_%s",
+ WQ_SYSFS|WQ_FREEZABLE|WQ_UNBOUND, 8, ve->ve_name);
+
+ if (!ve->wq)
+ return -ENOMEM;
+ return 0;
+}
+
+static void ve_workqueue_stop(struct ve_struct *ve)
+{
+ destroy_workqueue(ve->wq);
+}
+
/* under ve->op_sem write-lock */
static int ve_start_container(struct ve_struct *ve)
{
@@ -524,6 +539,10 @@ static int ve_start_container(struct ve_struct *ve)
if (err)
goto err_umh;
+ err = ve_workqueue_start(ve);
+ if (err)
+ goto err_workqueue;
+
err = ve_hook_iterate_init(VE_SS_CHAIN, ve);
if (err < 0)
goto err_iterate;
@@ -539,6 +558,8 @@ static int ve_start_container(struct ve_struct *ve)
return 0;
err_iterate:
+ ve_workqueue_stop(ve);
+err_workqueue:
ve_stop_umh(ve);
err_umh:
ve_stop_kthread(ve);
@@ -595,6 +616,8 @@ void ve_exit_ns(struct pid_namespace *pid_ns)
if (!ve->ve_ns || ve->ve_ns->pid_ns != pid_ns)
return;
+ ve_workqueue_stop(ve);
+
/*
* At this point all userspace tasks in container are dead.
*/
@@ -1648,6 +1671,8 @@ static int __init ve_subsys_init(void)
{
ve_cachep = KMEM_CACHE(ve_struct, SLAB_PANIC);
list_add(&ve0.ve_list, &ve_list_head);
+ ve0.wq = alloc_workqueue("ve0_wq", WQ_FREEZABLE|WQ_UNBOUND, 8);
+ BUG_ON(!ve0.wq);
return 0;
}
late_initcall(ve_subsys_init);
--
1.8.3.1
More information about the Devel
mailing list