Skip to content

Commit 3a06bb7

Browse files
htejuntorvalds
authored andcommitted
memcg: add RCU locking around css_for_each_descendant_pre() in memcg_offline_kmem()
memcg_offline_kmem() may be called from memcg_free_kmem() after a css init failure. memcg_free_kmem() is a ->css_free callback which is called without cgroup_mutex and memcg_offline_kmem() ends up using css_for_each_descendant_pre() without any locking. Fix it by adding rcu read locking around it. mkdir: cannot create directory `65530': No space left on device =============================== [ INFO: suspicious RCU usage. ] 4.6.0-work+ raspberrypi#321 Not tainted ------------------------------- kernel/cgroup.c:4008 cgroup_mutex or RCU read lock required! [ 527.243970] other info that might help us debug this: [ 527.244715] rcu_scheduler_active = 1, debug_locks = 0 2 locks held by kworker/0:5/1664: #0: ("cgroup_destroy"){.+.+..}, at: [<ffffffff81060ab5>] process_one_work+0x165/0x4a0 #1: ((&css->destroy_work)raspberrypi#3){+.+...}, at: [<ffffffff81060ab5>] process_one_work+0x165/0x4a0 [ 527.248098] stack backtrace: CPU: 0 PID: 1664 Comm: kworker/0:5 Not tainted 4.6.0-work+ raspberrypi#321 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.9.1-1.fc24 04/01/2014 Workqueue: cgroup_destroy css_free_work_fn Call Trace: dump_stack+0x68/0xa1 lockdep_rcu_suspicious+0xd7/0x110 css_next_descendant_pre+0x7d/0xb0 memcg_offline_kmem.part.44+0x4a/0xc0 mem_cgroup_css_free+0x1ec/0x200 css_free_work_fn+0x49/0x5e0 process_one_work+0x1c5/0x4a0 worker_thread+0x49/0x490 kthread+0xea/0x100 ret_from_fork+0x1f/0x40 Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Tejun Heo <[email protected]> Acked-by: Vladimir Davydov <[email protected]> Acked-by: Johannes Weiner <[email protected]> Cc: Michal Hocko <[email protected]> Cc: <[email protected]> [4.5+] Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent f86e427 commit 3a06bb7

File tree

1 file changed

+3
-0
lines changed

1 file changed

+3
-0
lines changed

mm/memcontrol.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2896,13 +2896,16 @@ static void memcg_offline_kmem(struct mem_cgroup *memcg)
28962896
* ordering is imposed by list_lru_node->lock taken by
28972897
* memcg_drain_all_list_lrus().
28982898
*/
2899+
rcu_read_lock(); /* can be called from css_free w/o cgroup_mutex */
28992900
css_for_each_descendant_pre(css, &memcg->css) {
29002901
child = mem_cgroup_from_css(css);
29012902
BUG_ON(child->kmemcg_id != kmemcg_id);
29022903
child->kmemcg_id = parent->kmemcg_id;
29032904
if (!memcg->use_hierarchy)
29042905
break;
29052906
}
2907+
rcu_read_unlock();
2908+
29062909
memcg_drain_all_list_lrus(kmemcg_id, parent->kmemcg_id);
29072910

29082911
memcg_free_cache_id(kmemcg_id);

0 commit comments

Comments
 (0)