We do not need rcu_read_lock here because we are already protected by
ve->op_sem from ve->ve_ns modification, so let's simplify code.

Also remove excess warnings.

https://jira.sw.ru/browse/PSBM-134002
Fixes: 907c1e6cd67f ("cgroup: Mark cgroup CGRP_VE_ROOT")
Signed-off-by: Pavel Tikhomirov <ptikhomi...@virtuozzo.com>
---
 kernel/cgroup/cgroup.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
index 05fe9436a9a3..a425f06eceea 100644
--- a/kernel/cgroup/cgroup.c
+++ b/kernel/cgroup/cgroup.c
@@ -1969,19 +1969,20 @@ void cgroup_mark_ve_root(struct ve_struct *ve)
 
        spin_lock_irq(&css_set_lock);
 
-       rcu_read_lock();
-       cset = rcu_dereference(ve->ve_ns)->cgroup_ns->root_cset;
-       if (WARN_ON(!cset))
-               goto unlock;
+       /*
+        * We can safely use ve->ve_ns without rcu_read_lock here, as we are
+        * always called _after_ ve_grab_context under ve->op_sem, so we've
+        * just set ve_ns and nobody else can modify it under us.
+        */
+       cset = rcu_dereference_protected(ve->ve_ns,
+                       lockdep_is_held(&ve->op_sem))->cgroup_ns->root_cset;
 
        list_for_each_entry(link, &cset->cgrp_links, cgrp_link) {
                cgrp = link->cgrp;
                set_bit(CGRP_VE_ROOT, &cgrp->flags);
        }
-       link_ve_root_cpu_cgroup(cset->subsys[cpu_cgrp_id]);
-unlock:
-       rcu_read_unlock();
 
+       link_ve_root_cpu_cgroup(cset->subsys[cpu_cgrp_id]);
        spin_unlock_irq(&css_set_lock);
 }
 
@@ -1993,17 +1994,18 @@ void cgroup_unmark_ve_roots(struct ve_struct *ve)
 
        spin_lock_irq(&css_set_lock);
 
-       rcu_read_lock();
-       cset = rcu_dereference(ve->ve_ns)->cgroup_ns->root_cset;
-       if (WARN_ON(!cset))
-               goto unlock;
+       /*
+        * We can safely use ve->ve_ns without rcu_read_lock here, as we are
+        * always called _before_ ve_drop_context under ve->op_sem, so we
+        * did not change ve_ns yet and nobody else can modify it under us.
+        */
+       cset = rcu_dereference_protected(ve->ve_ns,
+                       lockdep_is_held(&ve->op_sem))->cgroup_ns->root_cset;
 
        list_for_each_entry(link, &cset->cgrp_links, cgrp_link) {
                cgrp = link->cgrp;
                clear_bit(CGRP_VE_ROOT, &cgrp->flags);
        }
-unlock:
-       rcu_read_unlock();
 
        spin_unlock_irq(&css_set_lock);
 }
-- 
2.31.1

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

Reply via email to