Previously a task could've being moved by the outside event to another
ve cgroup and its link to ve_struct might change (task->task_ve). Now
when the link to ve_struct goes through ve namespace, the link is
persistent unless the task itself does clone3/unshare/setns.

So now we are safe to use ve_struct returned from get_exec_env(),
without worrying that it will be freed under us. And don't need any
special helper to get reference to the current ve.

Also remove get_curr_ve() as we no longer need it.

https://virtuozzo.atlassian.net/browse/VSTOR-118289
Signed-off-by: Pavel Tikhomirov <[email protected]>

Feature: ve: ve generic structures
---
 include/linux/cgroup.h    |  1 -
 kernel/cgroup/cgroup.c    | 42 ---------------------------------------
 net/core/netprio_cgroup.c |  6 ++----
 3 files changed, 2 insertions(+), 47 deletions(-)

diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 2e01e484cbac7..6fe5422e27b93 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -867,7 +867,6 @@ static inline void cgroup_bpf_put(struct cgroup *cgrp) {}
 
 #ifdef CONFIG_VE
 int ve_hide_cgroups(struct cgroup_root *root);
-struct ve_struct *get_curr_ve(void);
 struct cgroup_subsys_state *cgroup_get_e_ve_css(struct cgroup *cgrp,
                                                struct cgroup_subsys *ss);
 #endif
diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 5893d8f4d010a..26ad3faf2e218 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -2102,48 +2102,6 @@ static int cgroup_reconfigure(struct fs_context *fc)
 }
 
 #ifdef CONFIG_VE
-/*
- * This helper is a safe alternative to get_exec_env(), this helper actually
- * gets reference on current ve so if in other thread we would be moved from
- * this ve, at least this ve would not be freed under us.
- */
-struct ve_struct *get_curr_ve(void)
-{
-       struct ve_struct *ve;
-
-       /*
-        * If first thread loads current->task_ve pointer, and if just after
-        * that current is moved by other thread from this ve cgroup to some
-        * other and this ve cgroup gets destroyed, ve pointer gets freed, so
-        * first thread can't use such ve pointer safely.
-        */
-
-       /*
-        * Fast path: Let's make it safe with rcu lock, though current can be
-        * moved to other ve cgroup and our ve cgroup can start destroying, ve
-        * pointer would be still valid. As it is freed in ve_destroy. And
-        * ve_destroy is called from rcu callback after task_ve had changed.
-        */
-       rcu_read_lock();
-       ve = rcu_dereference(current->task_ve);
-       if (css_tryget(&ve->css)) {
-               rcu_read_unlock();
-               return ve;
-       }
-       rcu_read_unlock();
-
-       /*
-        * Slow path: Under cgroup_mutex both current tasks ve cgroup and
-        * task_ve pointer can't change. Corresponding cgroup_mutex around
-        * cgroup_attach_task() protects us from it.
-        */
-       mutex_lock(&cgroup_mutex);
-       ve = get_ve(current->task_ve);
-       mutex_unlock(&cgroup_mutex);
-
-       return ve;
-}
-
 /*
  * Let's skip optional cgroups in Virtuozzo containers. Admin on host can
  * do "mount -t cgroup cgroup -onone,name=namedcgroup /mnt", and this should
diff --git a/net/core/netprio_cgroup.c b/net/core/netprio_cgroup.c
index 30c2599e3cc1c..bfe0ff69b0b67 100644
--- a/net/core/netprio_cgroup.c
+++ b/net/core/netprio_cgroup.c
@@ -220,7 +220,7 @@ static int read_priomap(struct seq_file *sf, void *v)
        struct net *net, *_net = NULL;
        struct net_device *dev;
 
-       ve = get_curr_ve();
+       ve = get_exec_env();
        if (!ve_is_super(ve)) {
                struct nsproxy *ve_nsproxy;
 
@@ -230,7 +230,6 @@ static int read_priomap(struct seq_file *sf, void *v)
                        _net = get_net(ve_nsproxy->net_ns);
                rcu_read_unlock();
        }
-       put_ve(ve);
 
        net = _net ? : &init_net;
        rcu_read_lock();
@@ -256,7 +255,7 @@ static ssize_t write_priomap(struct kernfs_open_file *of,
        if (sscanf(buf, "%"__stringify(IFNAMSIZ)"s %u", devname, &prio) != 2)
                return -EINVAL;
 
-       ve = get_curr_ve();
+       ve = get_exec_env();
        if (!ve_is_super(ve)) {
                struct nsproxy *ve_nsproxy;
 
@@ -266,7 +265,6 @@ static ssize_t write_priomap(struct kernfs_open_file *of,
                        _net = get_net(ve_nsproxy->net_ns);
                rcu_read_unlock();
        }
-       put_ve(ve);
 
        net = _net ? : &init_net;
        dev = dev_get_by_name(net, devname);
-- 
2.51.1

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to