Skip to content

Commit

Permalink
device_cgroup: don't grab mutex in rcu callback
Browse files Browse the repository at this point in the history
Commit 103a197 ("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>
  • Loading branch information
Jerry Snitselaar authored and torvalds committed Feb 22, 2013
1 parent 024e4ec commit 53eb8c8
Showing 1 changed file with 12 additions and 9 deletions.
21 changes: 12 additions & 9 deletions security/device_cgroup.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
}

/*
Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit 53eb8c8

Please sign in to comment.