diff options
author | Jerry Snitselaar <jerry.snitselaar@oracle.com> | 2013-02-21 19:41:31 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-21 20:22:15 -0500 |
commit | 53eb8c82d581fdd4b389a3e417261f3ae924e603 (patch) | |
tree | de3893156c17c9ab220e4460630f581c55a0f487 /security/device_cgroup.c | |
parent | 024e4ec1856d57bb78c06ec903d29dcf716f5f47 (diff) |
device_cgroup: don't grab mutex in rcu callback
Commit 103a197c0c4e ("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: Jerry Snitselaar <jerry.snitselaar@oracle.com>
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: Aristeu Rozanski <aris@redhat.com>
Cc: James Morris <james.l.morris@oracle.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'security/device_cgroup.c')
-rw-r--r-- | security/device_cgroup.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/security/device_cgroup.c b/security/device_cgroup.c index d794abcc4b3b..1c69e38e3a2c 100644 --- a/security/device_cgroup.c +++ b/security/device_cgroup.c | |||
@@ -159,6 +159,16 @@ static void dev_exception_rm(struct dev_cgroup *dev_cgroup, | |||
159 | } | 159 | } |
160 | } | 160 | } |
161 | 161 | ||
162 | static void __dev_exception_clean(struct dev_cgroup *dev_cgroup) | ||
163 | { | ||
164 | struct dev_exception_item *ex, *tmp; | ||
165 | |||
166 | list_for_each_entry_safe(ex, tmp, &dev_cgroup->exceptions, list) { | ||
167 | list_del_rcu(&ex->list); | ||
168 | kfree_rcu(ex, rcu); | ||
169 | } | ||
170 | } | ||
171 | |||
162 | /** | 172 | /** |
163 | * dev_exception_clean - frees all entries of the exception list | 173 | * dev_exception_clean - frees all entries of the exception list |
164 | * @dev_cgroup: dev_cgroup with the exception list to be cleaned | 174 | * @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 | */ | 177 | */ |
168 | static void dev_exception_clean(struct dev_cgroup *dev_cgroup) | 178 | static void dev_exception_clean(struct dev_cgroup *dev_cgroup) |
169 | { | 179 | { |
170 | struct dev_exception_item *ex, *tmp; | ||
171 | |||
172 | lockdep_assert_held(&devcgroup_mutex); | 180 | lockdep_assert_held(&devcgroup_mutex); |
173 | 181 | ||
174 | list_for_each_entry_safe(ex, tmp, &dev_cgroup->exceptions, list) { | 182 | __dev_exception_clean(dev_cgroup); |
175 | list_del_rcu(&ex->list); | ||
176 | kfree_rcu(ex, rcu); | ||
177 | } | ||
178 | } | 183 | } |
179 | 184 | ||
180 | /* | 185 | /* |
@@ -215,9 +220,7 @@ static void devcgroup_css_free(struct cgroup *cgroup) | |||
215 | struct dev_cgroup *dev_cgroup; | 220 | struct dev_cgroup *dev_cgroup; |
216 | 221 | ||
217 | dev_cgroup = cgroup_to_devcgroup(cgroup); | 222 | dev_cgroup = cgroup_to_devcgroup(cgroup); |
218 | mutex_lock(&devcgroup_mutex); | 223 | __dev_exception_clean(dev_cgroup); |
219 | dev_exception_clean(dev_cgroup); | ||
220 | mutex_unlock(&devcgroup_mutex); | ||
221 | kfree(dev_cgroup); | 224 | kfree(dev_cgroup); |
222 | } | 225 | } |
223 | 226 | ||