device_cgroup: don't grab mutex in rcu callback
Commit 103a197c0c
("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>
This commit is contained in:
Родитель
024e4ec185
Коммит
53eb8c82d5
|
@ -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_cgroup: dev_cgroup with the exception list to be cleaned
|
||||
|
@ -167,14 +177,9 @@ 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;
|
||||
|
||||
lockdep_assert_held(&devcgroup_mutex);
|
||||
|
||||
list_for_each_entry_safe(ex, tmp, &dev_cgroup->exceptions, list) {
|
||||
list_del_rcu(&ex->list);
|
||||
kfree_rcu(ex, rcu);
|
||||
}
|
||||
__dev_exception_clean(dev_cgroup);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -215,9 +220,7 @@ static void devcgroup_css_free(struct cgroup *cgroup)
|
|||
struct dev_cgroup *dev_cgroup;
|
||||
|
||||
dev_cgroup = cgroup_to_devcgroup(cgroup);
|
||||
mutex_lock(&devcgroup_mutex);
|
||||
dev_exception_clean(dev_cgroup);
|
||||
mutex_unlock(&devcgroup_mutex);
|
||||
__dev_exception_clean(dev_cgroup);
|
||||
kfree(dev_cgroup);
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче