Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -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);
}