Commit 53eb8c82 authored by Jerry Snitselaar's avatar Jerry Snitselaar Committed by Linus Torvalds

device_cgroup: don't grab mutex in rcu callback

Commit 103a197c ("security/device_cgroup: lock assert fails in
dev_exception_clean()") grabs devcgroup_mutex to fix assert failure, but
a mutex can't be grabbed in rcu callback.  Since there shouldn't be any
other references when css_free is called, mutex isn't needed for list
cleanup in devcgroup_css_free().
Signed-off-by: default avatarJerry Snitselaar <jerry.snitselaar@oracle.com>
Acked-by: default avatarTejun Heo <tj@kernel.org>
Acked-by: default avatarAristeu Rozanski <aris@redhat.com>
Cc: James Morris <james.l.morris@oracle.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 024e4ec1
...@@ -159,6 +159,16 @@ static void dev_exception_rm(struct dev_cgroup *dev_cgroup, ...@@ -159,6 +159,16 @@ static void dev_exception_rm(struct dev_cgroup *dev_cgroup,
} }
} }
static void __dev_exception_clean(struct dev_cgroup *dev_cgroup)
{
struct dev_exception_item *ex, *tmp;
list_for_each_entry_safe(ex, tmp, &dev_cgroup->exceptions, list) {
list_del_rcu(&ex->list);
kfree_rcu(ex, rcu);
}
}
/** /**
* dev_exception_clean - frees all entries of the exception list * dev_exception_clean - frees all entries of the exception list
* @dev_cgroup: dev_cgroup with the exception list to be cleaned * @dev_cgroup: dev_cgroup with the exception list to be cleaned
...@@ -167,14 +177,9 @@ static void dev_exception_rm(struct dev_cgroup *dev_cgroup, ...@@ -167,14 +177,9 @@ static void dev_exception_rm(struct dev_cgroup *dev_cgroup,
*/ */
static void dev_exception_clean(struct dev_cgroup *dev_cgroup) static void dev_exception_clean(struct dev_cgroup *dev_cgroup)
{ {
struct dev_exception_item *ex, *tmp;
lockdep_assert_held(&devcgroup_mutex); lockdep_assert_held(&devcgroup_mutex);
list_for_each_entry_safe(ex, tmp, &dev_cgroup->exceptions, list) { __dev_exception_clean(dev_cgroup);
list_del_rcu(&ex->list);
kfree_rcu(ex, rcu);
}
} }
/* /*
...@@ -215,9 +220,7 @@ static void devcgroup_css_free(struct cgroup *cgroup) ...@@ -215,9 +220,7 @@ static void devcgroup_css_free(struct cgroup *cgroup)
struct dev_cgroup *dev_cgroup; struct dev_cgroup *dev_cgroup;
dev_cgroup = cgroup_to_devcgroup(cgroup); dev_cgroup = cgroup_to_devcgroup(cgroup);
mutex_lock(&devcgroup_mutex); __dev_exception_clean(dev_cgroup);
dev_exception_clean(dev_cgroup);
mutex_unlock(&devcgroup_mutex);
kfree(dev_cgroup); kfree(dev_cgroup);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment