From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933949AbbGHNEc (ORCPT ); Wed, 8 Jul 2015 09:04:32 -0400 Received: from cantor2.suse.de ([195.135.220.15]:53791 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758104AbbGHNE0 (ORCPT ); Wed, 8 Jul 2015 09:04:26 -0400 From: Michal Hocko To: Andrew Morton Cc: David Rientjes , Jakob Unterwurzacher , , LKML , Michal Hocko Subject: [PATCH 2/4] oom: Do not invoke oom notifiers on sysrq+f Date: Wed, 8 Jul 2015 15:04:19 +0200 Message-Id: <1436360661-31928-3-git-send-email-mhocko@suse.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1436360661-31928-1-git-send-email-mhocko@suse.com> References: <1436360661-31928-1-git-send-email-mhocko@suse.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Michal Hocko A github user rfjakob has reported the following issue via IRC. Manually triggering the OOM killer does not work anymore in 4.0.5 This is what it looks like: https://gist.github.com/rfjakob/346b7dc611fc3cdf4011 Basically, what happens is that the GPU driver frees some memory, that satisfies the OOM killer But the memory is allocated immediately again, and in the, no processes are killed no matter how often you trigger the oom killer "in the end" Quoting from the github: " [19291.202062] sysrq: SysRq : Manual OOM execution [19291.208335] Purging GPU memory, 74399744 bytes freed, 8728576 bytes still pinned. [19291.390767] sysrq: SysRq : Manual OOM execution [19291.396792] Purging GPU memory, 74452992 bytes freed, 8728576 bytes still pinned. [19291.560349] sysrq: SysRq : Manual OOM execution [19291.566018] Purging GPU memory, 75489280 bytes freed, 8728576 bytes still pinned. [19291.729944] sysrq: SysRq : Manual OOM execution [19291.735686] Purging GPU memory, 74399744 bytes freed, 8728576 bytes still pinned. [19291.918637] sysrq: SysRq : Manual OOM execution [19291.924299] Purging GPU memory, 74403840 bytes freed, 8728576 bytes still pinned. " The issue is that sysrq+f (force_kill) gets confused by the regular OOM heuristic which tries to prevent from OOM killer if some of the oom notifier can relase a memory. The heuristic doesn't make much sense for the sysrq+f path because this one is used by the administrator to kill a memory hog. Reported-by: Jakob Unterwurzacher Signed-off-by: Michal Hocko --- mm/oom_kill.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/mm/oom_kill.c b/mm/oom_kill.c index f2737d66f66a..0b1b0b25f928 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -661,10 +661,12 @@ bool out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask, if (oom_killer_disabled) return false; - blocking_notifier_call_chain(&oom_notify_list, 0, &freed); - if (freed > 0) - /* Got some memory back in the last second. */ - goto out; + if (!force_kill) { + blocking_notifier_call_chain(&oom_notify_list, 0, &freed); + if (freed > 0) + /* Got some memory back in the last second. */ + goto out; + } /* * If current has a pending SIGKILL or is exiting, then automatically -- 2.1.4