Commit e5fca24
committed
cgroup: use a dedicated workqueue for cgroup destruction
Since be44562 ("cgroup: remove synchronize_rcu() from
cgroup_diput()"), cgroup destruction path makes use of workqueue. css
freeing is performed from a work item from that point on and a later
commit, ea15f8c ("cgroup: split cgroup destruction into two
steps"), moves css offlining to workqueue too.
As cgroup destruction isn't depended upon for memory reclaim, the
destruction work items were put on the system_wq; unfortunately, some
controller may block in the destruction path for considerable duration
while holding cgroup_mutex. As large part of destruction path is
synchronized through cgroup_mutex, when combined with high rate of
cgroup removals, this has potential to fill up system_wq's max_active
of 256.
Also, it turns out that memcg's css destruction path ends up queueing
and waiting for work items on system_wq through work_on_cpu(). If
such operation happens while system_wq is fully occupied by cgroup
destruction work items, work_on_cpu() can't make forward progress
because system_wq is full and other destruction work items on
system_wq can't make forward progress because the work item waiting
for work_on_cpu() is holding cgroup_mutex, leading to deadlock.
This can be fixed by queueing destruction work items on a separate
workqueue. This patch creates a dedicated workqueue -
cgroup_destroy_wq - for this purpose. As these work items shouldn't
have inter-dependencies and mostly serialized by cgroup_mutex anyway,
giving high concurrency level doesn't buy anything and the workqueue's
@max_active is set to 1 so that destruction work items are executed
one by one on each CPU.
Hugh Dickins: Because cgroup_init() is run before init_workqueues(),
cgroup_destroy_wq can't be allocated from cgroup_init(). Do it from a
separate core_initcall(). In the future, we probably want to reorder
so that workqueue init happens before cgroup_init().
Signed-off-by: Tejun Heo <[email protected]>
Reported-by: Hugh Dickins <[email protected]>
Reported-by: Shawn Bohrer <[email protected]>
Link: http://lkml.kernel.org/r/[email protected]
Link: http://lkml.kernel.org/g/[email protected]
Cc: [email protected] # v3.9+1 parent 6ce4eac commit e5fca24
1 file changed
+27
-3
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
89 | 89 | | |
90 | 90 | | |
91 | 91 | | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
92 | 100 | | |
93 | 101 | | |
94 | 102 | | |
| |||
871 | 879 | | |
872 | 880 | | |
873 | 881 | | |
874 | | - | |
| 882 | + | |
875 | 883 | | |
876 | 884 | | |
877 | 885 | | |
| |||
4249 | 4257 | | |
4250 | 4258 | | |
4251 | 4259 | | |
4252 | | - | |
| 4260 | + | |
4253 | 4261 | | |
4254 | 4262 | | |
4255 | 4263 | | |
| |||
4539 | 4547 | | |
4540 | 4548 | | |
4541 | 4549 | | |
4542 | | - | |
| 4550 | + | |
4543 | 4551 | | |
4544 | 4552 | | |
4545 | 4553 | | |
| |||
5063 | 5071 | | |
5064 | 5072 | | |
5065 | 5073 | | |
| 5074 | + | |
| 5075 | + | |
| 5076 | + | |
| 5077 | + | |
| 5078 | + | |
| 5079 | + | |
| 5080 | + | |
| 5081 | + | |
| 5082 | + | |
| 5083 | + | |
| 5084 | + | |
| 5085 | + | |
| 5086 | + | |
| 5087 | + | |
| 5088 | + | |
| 5089 | + | |
5066 | 5090 | | |
5067 | 5091 | | |
5068 | 5092 | | |
| |||
0 commit comments