Skip to content

Commit 08088cb

Browse files
Michal Hockotorvalds
authored andcommitted
memcg: change oom_info_lock to mutex
Kirill has reported the following: Task in /test killed as a result of limit of /test memory: usage 10240kB, limit 10240kB, failcnt 51 memory+swap: usage 10240kB, limit 10240kB, failcnt 0 kmem: usage 0kB, limit 18014398509481983kB, failcnt 0 Memory cgroup stats for /test: BUG: sleeping function called from invalid context at kernel/cpu.c:68 in_atomic(): 1, irqs_disabled(): 0, pid: 66, name: memcg_test 2 locks held by memcg_test/66: #0: (memcg_oom_lock#2){+.+...}, at: [<ffffffff81131014>] pagefault_out_of_memory+0x14/0x90 #1: (oom_info_lock){+.+...}, at: [<ffffffff81197b2a>] mem_cgroup_print_oom_info+0x2a/0x390 CPU: 2 PID: 66 Comm: memcg_test Not tainted 3.14.0-rc1-dirty torvalds#745 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS Bochs 01/01/2011 Call Trace: __might_sleep+0x16a/0x210 get_online_cpus+0x1c/0x60 mem_cgroup_read_stat+0x27/0xb0 mem_cgroup_print_oom_info+0x260/0x390 dump_header+0x88/0x251 ? trace_hardirqs_on+0xd/0x10 oom_kill_process+0x258/0x3d0 mem_cgroup_oom_synchronize+0x656/0x6c0 ? mem_cgroup_charge_common+0xd0/0xd0 pagefault_out_of_memory+0x14/0x90 mm_fault_error+0x91/0x189 __do_page_fault+0x48e/0x580 do_page_fault+0xe/0x10 page_fault+0x22/0x30 which complains that mem_cgroup_read_stat cannot be called from an atomic context but mem_cgroup_print_oom_info takes a spinlock. Change oom_info_lock to a mutex. This was introduced by 947b3dd ("memcg, oom: lock mem_cgroup_print_oom_info"). Signed-off-by: Michal Hocko <[email protected]> Reported-by: "Kirill A. Shutemov" <[email protected]> Cc: Johannes Weiner <[email protected]> Cc: David Rientjes <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 9845cbb commit 08088cb

File tree

1 file changed

+3
-3
lines changed

1 file changed

+3
-3
lines changed

mm/memcontrol.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,7 +1687,7 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
16871687
* protects memcg_name and makes sure that parallel ooms do not
16881688
* interleave
16891689
*/
1690-
static DEFINE_SPINLOCK(oom_info_lock);
1690+
static DEFINE_MUTEX(oom_info_lock);
16911691
struct cgroup *task_cgrp;
16921692
struct cgroup *mem_cgrp;
16931693
static char memcg_name[PATH_MAX];
@@ -1698,7 +1698,7 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
16981698
if (!p)
16991699
return;
17001700

1701-
spin_lock(&oom_info_lock);
1701+
mutex_lock(&oom_info_lock);
17021702
rcu_read_lock();
17031703

17041704
mem_cgrp = memcg->css.cgroup;
@@ -1767,7 +1767,7 @@ void mem_cgroup_print_oom_info(struct mem_cgroup *memcg, struct task_struct *p)
17671767

17681768
pr_cont("\n");
17691769
}
1770-
spin_unlock(&oom_info_lock);
1770+
mutex_unlock(&oom_info_lock);
17711771
}
17721772

17731773
/*

0 commit comments

Comments
 (0)