| From 2bdfd2825c9662463371e6691b1a794e97fa36b4 Mon Sep 17 00:00:00 2001 |
| From: Waiman Long <longman@redhat.com> |
| Date: Wed, 2 Feb 2022 22:31:03 -0500 |
| Subject: cgroup/cpuset: Fix "suspicious RCU usage" lockdep warning |
| |
| From: Waiman Long <longman@redhat.com> |
| |
| commit 2bdfd2825c9662463371e6691b1a794e97fa36b4 upstream. |
| |
| It was found that a "suspicious RCU usage" lockdep warning was issued |
| with the rcu_read_lock() call in update_sibling_cpumasks(). It is |
| because the update_cpumasks_hier() function may sleep. So we have |
| to release the RCU lock, call update_cpumasks_hier() and reacquire |
| it afterward. |
| |
| Also add a percpu_rwsem_assert_held() in update_sibling_cpumasks() |
| instead of stating that in the comment. |
| |
| Fixes: 4716909cc5c5 ("cpuset: Track cpusets that use parent's effective_cpus") |
| Signed-off-by: Waiman Long <longman@redhat.com> |
| Tested-by: Phil Auld <pauld@redhat.com> |
| Reviewed-by: Phil Auld <pauld@redhat.com> |
| Signed-off-by: Tejun Heo <tj@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| kernel/cgroup/cpuset.c | 10 ++++++++++ |
| 1 file changed, 10 insertions(+) |
| |
| --- a/kernel/cgroup/cpuset.c |
| +++ b/kernel/cgroup/cpuset.c |
| @@ -1481,10 +1481,15 @@ static void update_sibling_cpumasks(stru |
| struct cpuset *sibling; |
| struct cgroup_subsys_state *pos_css; |
| |
| + percpu_rwsem_assert_held(&cpuset_rwsem); |
| + |
| /* |
| * Check all its siblings and call update_cpumasks_hier() |
| * if their use_parent_ecpus flag is set in order for them |
| * to use the right effective_cpus value. |
| + * |
| + * The update_cpumasks_hier() function may sleep. So we have to |
| + * release the RCU read lock before calling it. |
| */ |
| rcu_read_lock(); |
| cpuset_for_each_child(sibling, pos_css, parent) { |
| @@ -1492,8 +1497,13 @@ static void update_sibling_cpumasks(stru |
| continue; |
| if (!sibling->use_parent_ecpus) |
| continue; |
| + if (!css_tryget_online(&sibling->css)) |
| + continue; |
| |
| + rcu_read_unlock(); |
| update_cpumasks_hier(sibling, tmp); |
| + rcu_read_lock(); |
| + css_put(&sibling->css); |
| } |
| rcu_read_unlock(); |
| } |