From patchwork Sat Apr 18 15:13:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Yafang Shao X-Patchwork-Id: 11496605 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C5FED6CA for ; Sat, 18 Apr 2020 15:13:35 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 85D0920776 for ; Sat, 18 Apr 2020 15:13:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="O5TCfJf7" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 85D0920776 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id AC8AE8E0006; Sat, 18 Apr 2020 11:13:34 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id A793E8E0003; Sat, 18 Apr 2020 11:13:34 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 969018E0006; Sat, 18 Apr 2020 11:13:34 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0141.hostedemail.com [216.40.44.141]) by kanga.kvack.org (Postfix) with ESMTP id 80AF78E0003 for ; Sat, 18 Apr 2020 11:13:34 -0400 (EDT) Received: from smtpin27.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id 307B7824556B for ; Sat, 18 Apr 2020 15:13:34 +0000 (UTC) X-FDA: 76721319948.27.humor33_766f54cf2245e X-Spam-Summary: 2,0,0,53785edd0d57088d,d41d8cd98f00b204,laoar.shao@gmail.com,,RULES_HIT:2:41:69:355:379:541:800:960:966:973:988:989:1260:1345:1359:1437:1535:1605:1730:1747:1777:1792:2196:2198:2199:2200:2393:2559:2562:2731:3138:3139:3140:3141:3142:3865:3866:3867:3870:3871:3872:3874:4049:4120:4250:4321:4385:4605:5007:6119:6261:6653:7514:7903:9413:9592:11026:11232:11473:11658:11914:12043:12048:12296:12297:12438:12517:12519:12555:12683:12895:12986:13972:14096:14110:14394:14687:21080:21324:21444:21451:21611:21627:21666:21966:21990:30054:30070:30074,0,RBL:209.85.210.194:@gmail.com:.lbl8.mailshell.net-62.50.0.100 66.100.201.100,CacheIP:none,Bayesian:0.5,0.5,0.5,Netcheck:none,DomainCache:0,MSF:not bulk,SPF:fp,MSBL:0,DNSBL:neutral,Custom_rules:0:1:0,LFtime:24,LUA_SUMMARY:none X-HE-Tag: humor33_766f54cf2245e X-Filterd-Recvd-Size: 9018 Received: from mail-pf1-f194.google.com (mail-pf1-f194.google.com [209.85.210.194]) by imf32.hostedemail.com (Postfix) with ESMTP for ; Sat, 18 Apr 2020 15:13:33 +0000 (UTC) Received: by mail-pf1-f194.google.com with SMTP id p25so2602771pfn.11 for ; Sat, 18 Apr 2020 08:13:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=fDbafwg9RkM9iVTg2J+7GHysyBGtm/+WKY/g4jULANI=; b=O5TCfJf7HOcoZ9jw6xSlAm0Meef+nuUzFltRn+U48inSG4LlR/xiQSXilsEUg2RHbZ 7ylxnbzC+TN/XSgY6z0sBU7MRgLB8Ad+/0a8fUfB6NSZTF/HZy0in3Wg3V3x1/l09xDd NMK4SCxCHYPedPyppHAF6U1KlJDFYXvMcoY9SxotvqOHJcEvQTSm0WhmRrTA1vvJu/A2 pacoq5OQkXvU4fNVoRwfW0PNDIYl/+hQxTORuktaa78TVk+Pkg+xY1jnskxGmkoBis7C tAtSpF8ZnRcjnjf2q9jbeGP83yl/lC+Xqfzc92+bdPNJ7NXVWlku/PcDnOT/HaFxtWUU gFbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=fDbafwg9RkM9iVTg2J+7GHysyBGtm/+WKY/g4jULANI=; b=eJQ+yjNVpNUAitDspewcCDMsoVpctAACWn2ZfNV6TuD2mi7E0neU2veUegL4fRNUvy IfjM2n15VbROaeJ/EC2l3jizQEWTHxdUsczDbFRyMy+20rK+aMCRrtSkj+ErFjhs8QiH Ae2MAJh/JKOAcX3oxuoCjt9cSx0eaMXzJxd+O30LLNY+d0kO9OS6BdNMvzqYdb9DS70w Nm5YDT8xRzgTdwv2Ew2UBUtVdZ42LrL8LLk43WD2I2eDXQOVku/OoKEndEmgU6F4dGXY F2tmLCiR+db0qKmpINL2d7VK7s6S6EzqYCGHJSlujTTYUHizZRd0D2c4ik1vuavNwWyP vEBg== X-Gm-Message-State: AGi0PuYpjQQ+tmPbTy3Iu0CCxFMcRYrVeu1Cs0WyymHkUM+IZeq83+yj 4jsxyj4f64sGjNmM7tfImbM= X-Google-Smtp-Source: APiQypKRc+pIJZrRFmbirBqrL21vS5pn2owvZ2MSdAUEugx9qaWRyVUyfh00il0BEBXCFlShTihnyQ== X-Received: by 2002:a63:5359:: with SMTP id t25mr7646092pgl.349.1587222812757; Sat, 18 Apr 2020 08:13:32 -0700 (PDT) Received: from localhost.localdomain ([203.100.54.194]) by smtp.gmail.com with ESMTPSA id j32sm9613028pgb.55.2020.04.18.08.13.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 18 Apr 2020 08:13:32 -0700 (PDT) From: Yafang Shao To: hannes@cmpxchg.org, mhocko@kernel.org, vdavydov.dev@gmail.com, akpm@linux-foundation.org Cc: linux-mm@kvack.org, Yafang Shao Subject: [PATCH 1/3] mm: change the return type of out_of_memory() Date: Sat, 18 Apr 2020 11:13:09 -0400 Message-Id: <20200418151311.7397-2-laoar.shao@gmail.com> X-Mailer: git-send-email 2.18.1 In-Reply-To: <20200418151311.7397-1-laoar.shao@gmail.com> References: <20200418151311.7397-1-laoar.shao@gmail.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Change the return type of out_of_memory() from bool to enum oom_status for later use. The definition of enum oom_status is moved from mm/memcontrol.c to include/linux/oom.h. No functional change. Signed-off-by: Yafang Shao --- include/linux/memcontrol.h | 1 + include/linux/oom.h | 9 ++++++++- mm/memcontrol.c | 30 +++++++++++++----------------- mm/oom_kill.c | 14 +++++++------- mm/page_alloc.c | 3 ++- 5 files changed, 31 insertions(+), 26 deletions(-) diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h index 1b4150ff64be..98bd8fb2f5c7 100644 --- a/include/linux/memcontrol.h +++ b/include/linux/memcontrol.h @@ -21,6 +21,7 @@ #include #include #include +#include struct mem_cgroup; struct page; diff --git a/include/linux/oom.h b/include/linux/oom.h index c696c265f019..3dca5ce189e6 100644 --- a/include/linux/oom.h +++ b/include/linux/oom.h @@ -22,6 +22,13 @@ enum oom_constraint { CONSTRAINT_MEMCG, }; +enum oom_status { + OOM_SUCCESS, + OOM_FAILED, + OOM_ASYNC, + OOM_SKIPPED +}; + /* * Details of the page allocation that triggered the oom killer that are used to * determine what should be killed. @@ -110,7 +117,7 @@ bool __oom_reap_task_mm(struct mm_struct *mm); extern unsigned long oom_badness(struct task_struct *p, unsigned long totalpages); -extern bool out_of_memory(struct oom_control *oc); +enum oom_status out_of_memory(struct oom_control *oc); extern void exit_oom_victim(void); diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 5beea03dd58a..22418b55804f 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1570,8 +1570,9 @@ unsigned long mem_cgroup_size(struct mem_cgroup *memcg) return page_counter_read(&memcg->memory); } -static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, - int order) +static enum oom_status mem_cgroup_out_of_memory(struct mem_cgroup *memcg, + gfp_t gfp_mask, + int order) { struct oom_control oc = { .zonelist = NULL, @@ -1580,16 +1581,20 @@ static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, .gfp_mask = gfp_mask, .order = order, }; - bool ret; + enum oom_status ret; if (mutex_lock_killable(&oom_lock)) - return true; + return OOM_SUCCESS; /* * A few threads which were not waiting at mutex_lock_killable() can * fail to bail out. Therefore, check again after holding oom_lock. */ - ret = should_force_charge() || out_of_memory(&oc); + if (should_force_charge()) + return OOM_SUCCESS; + + ret = out_of_memory(&oc); mutex_unlock(&oom_lock); + return ret; } @@ -1767,13 +1772,6 @@ static void memcg_oom_recover(struct mem_cgroup *memcg) __wake_up(&memcg_oom_waitq, TASK_NORMAL, 0, memcg); } -enum oom_status { - OOM_SUCCESS, - OOM_FAILED, - OOM_ASYNC, - OOM_SKIPPED -}; - static enum oom_status mem_cgroup_oom(struct mem_cgroup *memcg, gfp_t mask, int order) { enum oom_status ret; @@ -1821,10 +1819,7 @@ static enum oom_status mem_cgroup_oom(struct mem_cgroup *memcg, gfp_t mask, int mem_cgroup_oom_notify(memcg); mem_cgroup_unmark_under_oom(memcg); - if (mem_cgroup_out_of_memory(memcg, mask, order)) - ret = OOM_SUCCESS; - else - ret = OOM_FAILED; + ret = mem_cgroup_out_of_memory(memcg, mask, order); if (locked) mem_cgroup_oom_unlock(memcg); @@ -6102,7 +6097,8 @@ static ssize_t memory_max_write(struct kernfs_open_file *of, } memcg_memory_event(memcg, MEMCG_OOM); - if (!mem_cgroup_out_of_memory(memcg, GFP_KERNEL, 0)) + if (mem_cgroup_out_of_memory(memcg, GFP_KERNEL, 0) != + OOM_SUCCESS) break; } diff --git a/mm/oom_kill.c b/mm/oom_kill.c index dfc357614e56..d5a941bea2d7 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -1042,18 +1042,18 @@ EXPORT_SYMBOL_GPL(unregister_oom_notifier); * OR try to be smart about which process to kill. Note that we * don't have to be perfect here, we just have to be good. */ -bool out_of_memory(struct oom_control *oc) +enum oom_status out_of_memory(struct oom_control *oc) { unsigned long freed = 0; if (oom_killer_disabled) - return false; + return OOM_FAILED; if (!is_memcg_oom(oc)) { blocking_notifier_call_chain(&oom_notify_list, 0, &freed); if (freed > 0) /* Got some memory back in the last second. */ - return true; + return OOM_SUCCESS; } /* @@ -1064,7 +1064,7 @@ bool out_of_memory(struct oom_control *oc) if (task_will_free_mem(current)) { mark_oom_victim(current); wake_oom_reaper(current); - return true; + return OOM_SUCCESS; } /* @@ -1075,7 +1075,7 @@ bool out_of_memory(struct oom_control *oc) * invoke the OOM killer even if it is a GFP_NOFS allocation. */ if (oc->gfp_mask && !(oc->gfp_mask & __GFP_FS) && !is_memcg_oom(oc)) - return true; + return OOM_SUCCESS; /* * Check if there were limitations on the allocation (only relevant for @@ -1093,7 +1093,7 @@ bool out_of_memory(struct oom_control *oc) get_task_struct(current); oc->chosen = current; oom_kill_process(oc, "Out of memory (oom_kill_allocating_task)"); - return true; + return OOM_SUCCESS; } select_bad_process(oc); @@ -1112,7 +1112,7 @@ bool out_of_memory(struct oom_control *oc) if (oc->chosen && oc->chosen != (void *)-1UL) oom_kill_process(oc, !is_memcg_oom(oc) ? "Out of memory" : "Memory cgroup out of memory"); - return !!oc->chosen; + return oc->chosen ? OOM_SUCCESS : OOM_FAILED; } /* diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 69827d4fa052..0926117eb921 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -3917,7 +3917,8 @@ __alloc_pages_may_oom(gfp_t gfp_mask, unsigned int order, goto out; /* Exhausted what can be done so it's blame time */ - if (out_of_memory(&oc) || WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL)) { + if (out_of_memory(&oc) == OOM_SUCCESS || + WARN_ON_ONCE(gfp_mask & __GFP_NOFAIL)) { *did_some_progress = 1; /*