On Mon 17-12-12 02:34:30, azurIt wrote: > >I would try to limit changes to minimum. So the original kernel you were > >using + the first patch to prevent OOM from the write path + 2 debugging > >patches. > > > It didn't take off the whole system this time (but i was > prepared to record a video of console ;) ), here it is: > http://www.watchdog.sk/lkml/oom_mysqld4 [...] [ 1248.059429] ------------[ cut here ]------------ [ 1248.059586] WARNING: at mm/memcontrol.c:2400 T.1146+0x2d9/0x610() [ 1248.059723] Hardware name: S5000VSA [ 1248.059855] gfp_mask:208 nr_pages:1 oom:0 ret:2 This is GFP_KERNEL allocation which is expected. It is also a simple page which is not that expected because we shouldn't return ENOMEM on those unless this was GFP_ATOMIC allocation (which it wasn't) or the caller told us to not trigger OOM which is the case only for THP pages (see mem_cgroup_charge_common). So the big question is how have we ended up with oom=false here... [Ohh, I am really an idiot. I screwed the first patch] - bool oom = true; + bool oom = !(gfp_mask | GFP_MEMCG_NO_OOM); Which obviously doesn't work. It should read !(gfp_mask &GFP_MEMCG_NO_OOM). No idea how I could have missed that. I am really sorry about that. --- diff --git a/mm/memcontrol.c b/mm/memcontrol.c index c04676d..1f35a74 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -2704,7 +2704,7 @@ static int mem_cgroup_charge_common(struct page *page, struct mm_struct *mm, struct mem_cgroup *memcg = NULL; unsigned int nr_pages = 1; struct page_cgroup *pc; - bool oom = !(gfp_mask | GFP_MEMCG_NO_OOM); + bool oom = !(gfp_mask & GFP_MEMCG_NO_OOM); int ret; if (PageTransHuge(page)) { -- Michal Hocko SUSE Labs -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>