diff options
| author | Dave Anderson <[email protected]> | 2010-01-08 22:42:50 +0000 |
|---|---|---|
| committer | Linus Torvalds <[email protected]> | 2010-01-11 17:34:05 +0000 |
| commit | bd4f490a079730aadfaf9a728303ea0135c01945 (patch) | |
| tree | 7de1396233a18a8da5e4b204415a8859154c79bc /fs/proc/array.c | |
| parent | scripts/get_maintainer.pl: fix file exclusion X: logic (diff) | |
| download | kernel-bd4f490a079730aadfaf9a728303ea0135c01945.tar.gz kernel-bd4f490a079730aadfaf9a728303ea0135c01945.zip | |
cgroups: fix 2.6.32 regression causing BUG_ON() in cgroup_diput()
The LTP cgroup test suite generates a "kernel BUG at kernel/cgroup.c:790!"
here in cgroup_diput():
/*
* if we're getting rid of the cgroup, refcount should ensure
* that there are no pidlists left.
*/
BUG_ON(!list_empty(&cgrp->pidlists));
The cgroup pidlist rework in 2.6.32 generates the BUG_ON, which is caused
when pidlist_array_load() calls cgroup_pidlist_find():
(1) if a matching cgroup_pidlist is found, it down_write's the mutex of the
pre-existing cgroup_pidlist, and increments its use_count.
(2) if no matching cgroup_pidlist is found, then a new one is allocated, it
down_write's its mutex, and the use_count is set to 0.
(3) the matching, or new, cgroup_pidlist gets returned back to pidlist_array_load(),
which increments its use_count -- regardless whether new or pre-existing --
and up_write's the mutex.
So if a matching list is ever encountered by cgroup_pidlist_find() during
the life of a cgroup directory, it results in an inflated use_count value,
preventing it from ever getting released by cgroup_release_pid_array().
Then if the directory is subsequently removed, cgroup_diput() hits the
BUG_ON() when it finds that the directory's cgroup is still populated with
a pidlist.
The patch simply removes the use_count increment when a matching pidlist
is found by cgroup_pidlist_find(), because it gets bumped by the calling
pidlist_array_load() function while still protected by the list's mutex.
Signed-off-by: Dave Anderson <[email protected]>
Reviewed-by: Li Zefan <[email protected]>
Acked-by: Ben Blum <[email protected]>
Cc: Paul Menage <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
Diffstat (limited to 'fs/proc/array.c')
0 files changed, 0 insertions, 0 deletions
