cgroup: add lock validation in check_for_release()
PATCH 1/1 cgroup: add lock validation in check_for_release()
There was a long-standing bug that this function was called without any lock. Add a check to prevent similar issue.
Signed-off-by Li Zefan <[email protected]>
--- kernel/cgroup.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
kernel/cgroup.c +11 -4
@@ -5028,13 +5028,20 @@ int cgroup_is_descendant(const struct cgroup *cgrp, struct task_struct *task)static void check_for_release (struct cgroup *cgrp) { -/* All of these checks rely on RCU to keep the cgroup -* structure alive */ +/* +* All of these checks rely on RCU or cgroup_mutex to keep the cgroup +* structure alive +*/ +rcu_lockdep_assert (rcu_read_lock_held () ||cgroup_lock_is_held (), +"check_for_release() called witout proper locking" ); +if (cgroup_is_releasable (cgrp) && !atomic_read (&cgrp->count) &&list_empty (&cgrp->children) && !cgroup_has_css_refs (cgrp)) { -/* Control Group is currently removeable. If it's not +/* +* Control Group is currently removable. If it's not * already queued for a userspace notification, queue -* it now */ +* it now +*/ int need_schedule_work =0 ;raw_spin_lock (&release_list_lock); if (!cgroup_is_removed(cgrp) &&
Signature · 1 line
1.8.0.2