From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 53D5FC433E0 for ; Thu, 9 Jul 2020 06:41:40 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 1B954206C3 for ; Thu, 9 Jul 2020 06:41:39 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1B954206C3 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 8F59C6B000A; Thu, 9 Jul 2020 02:41:39 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 87F226B000C; Thu, 9 Jul 2020 02:41:39 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 71FD46B000D; Thu, 9 Jul 2020 02:41:39 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0227.hostedemail.com [216.40.44.227]) by kanga.kvack.org (Postfix) with ESMTP id 54BE26B000A for ; Thu, 9 Jul 2020 02:41:39 -0400 (EDT) Received: from smtpin04.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id D3A778248D52 for ; Thu, 9 Jul 2020 06:41:38 +0000 (UTC) X-FDA: 77017591476.04.trade65_051359326ec3 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin04.hostedemail.com (Postfix) with ESMTP id 9A065800DE04 for ; Thu, 9 Jul 2020 06:41:38 +0000 (UTC) X-HE-Tag: trade65_051359326ec3 X-Filterd-Recvd-Size: 6558 Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by imf44.hostedemail.com (Postfix) with ESMTP for ; Thu, 9 Jul 2020 06:41:38 +0000 (UTC) Received: by mail-wr1-f66.google.com with SMTP id s10so1047446wrw.12 for ; Wed, 08 Jul 2020 23:41:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=zocQrS21lM/UZCn+cI7FNSUsf8rRHDktAk3OeT8ZHNk=; b=N41vBDF1STmgZ5SZdiw/NwJaS90dnWZStfus9yXjjFGdscQOKPuQbCLnpYB9igZK2y 6O+VgktPNQlYZzNWxnrx1kBDp1XQBToSzVO/R+scDR9GFi7BuHcVsx8iGfVgaFO6eanE xhsUvaU5sINNpHdnrMNTaBnXI7OeWuFsdI6gYTce8QBTL8LA4nmVwAq6b33rlsfPPXFF Lu6Qp+C5YSAjbkxK3+d1U/im7a1nXL5G8VkGb2of4hWAI/p29MY9Vpta2sbZQedm+XzP 3uB+t9aSpr44K8Rk4mcpen3d9+snakxq4ZnsrdNjh9DkhbhRRkpuJZ9s+usxWHDotNLQ Ht6g== X-Gm-Message-State: AOAM531JBQfGR3e6j91g4xWnZqy8ziRBt+kPSH7qICR58FPJfJt3oyOR NFat5M26PtZAiEjCF0Vl6fE= X-Google-Smtp-Source: ABdhPJzxshiaX9JP7Z/ZSM3yvwBlTN8ZW+jgoQj2oA674v+sITAL6HBrZ2bdcj5BOwM6twrBR5G4Iw== X-Received: by 2002:a5d:68cc:: with SMTP id p12mr60914557wrw.111.1594276897198; Wed, 08 Jul 2020 23:41:37 -0700 (PDT) Received: from localhost (ip-37-188-179-51.eurotel.cz. [37.188.179.51]) by smtp.gmail.com with ESMTPSA id k11sm4290115wrd.23.2020.07.08.23.41.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 08 Jul 2020 23:41:36 -0700 (PDT) Date: Thu, 9 Jul 2020 08:41:35 +0200 From: Michal Hocko To: Yafang Shao Cc: David Rientjes , Andrew Morton , Linux MM Subject: Re: [PATCH] mm, oom: make the calculation of oom badness more accurate Message-ID: <20200709064135.GA19160@dhcp22.suse.cz> References: <1594214649-9837-1-git-send-email-laoar.shao@gmail.com> <20200708142806.GJ7271@dhcp22.suse.cz> <20200708143211.GK7271@dhcp22.suse.cz> <20200708190225.GM7271@dhcp22.suse.cz> <20200709062644.GA12704@dhcp22.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200709062644.GA12704@dhcp22.suse.cz> X-Rspamd-Queue-Id: 9A065800DE04 X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam04 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: On Thu 09-07-20 08:26:46, Michal Hocko wrote: > On Thu 09-07-20 10:14:14, Yafang Shao wrote: [...] > > diff --git a/fs/proc/base.c b/fs/proc/base.c > > index 774784587..0da8efa41 100644 > > --- a/fs/proc/base.c > > +++ b/fs/proc/base.c > > @@ -528,7 +528,7 @@ static int proc_oom_score(struct seq_file *m, > > struct pid_namespace *ns, > > unsigned long totalpages = totalram_pages + total_swap_pages; > > unsigned long points = 0; > > > > - points = oom_badness(task, NULL, NULL, totalpages) * > > + points = 1000 + oom_badness(task, NULL, NULL, totalpages) * > > 1000 / totalpages; > > seq_printf(m, "%lu\n", points); > > > > And then update the documentation as "from 0 (never kill) to 3000 > > (always kill)" > > This is still not quite there yet, I am afraid. OOM_SCORE_ADJ_MIN tasks have > always reported 0 and I can imagine somebody might depend on this fact. > So you need to special case LONG_MIN at least. It would be also better > to stick with [0, 2000] range. usage * 1000 / total -> [0, 1000] adj -> [-1000, 1000] max (0, usage * 1000 / total + adj) -> [0, 2000] So effectively something like this. diff --git a/fs/proc/base.c b/fs/proc/base.c index d86c0afc8a85..fdf5a0be1cc3 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -550,9 +550,9 @@ static int proc_oom_score(struct seq_file *m, struct pid_namespace *ns, struct pid *pid, struct task_struct *task) { unsigned long totalpages = totalram_pages() + total_swap_pages; - unsigned long points = 0; + long points = 0; - points = oom_badness(task, totalpages) * 1000 / totalpages; + points = max(0, oom_badness(task, totalpages)); seq_printf(m, "%lu\n", points); return 0; diff --git a/mm/gup.c b/mm/gup.c index de9e36262ccb..75980dd5a2fc 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -1794,7 +1794,6 @@ static long __gup_longterm_locked(struct task_struct *tsk, vmas_tmp, NULL, gup_flags); if (gup_flags & FOLL_LONGTERM) { - memalloc_nocma_restore(flags); if (rc < 0) goto out; @@ -1802,11 +1801,13 @@ static long __gup_longterm_locked(struct task_struct *tsk, for (i = 0; i < rc; i++) put_page(pages[i]); rc = -EOPNOTSUPP; + memalloc_nocma_restore(flags); goto out; } rc = check_and_migrate_cma_pages(tsk, mm, start, rc, pages, vmas_tmp, gup_flags); + memalloc_nocma_restore(flags); } out: diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 6e94962893ee..30dbc302a677 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -196,13 +196,13 @@ static bool is_dump_unreclaim_slabs(void) * predictable as possible. The goal is to return the highest value for the * task consuming the most memory to avoid subsequent oom failures. */ -unsigned long oom_badness(struct task_struct *p, unsigned long totalpages) +long oom_badness(struct task_struct *p, unsigned long totalpages) { long points; long adj; if (oom_unkillable_task(p)) - return 0; + return -1; p = find_lock_task_mm(p); if (!p) @@ -229,15 +229,10 @@ unsigned long oom_badness(struct task_struct *p, unsigned long totalpages) mm_pgtables_bytes(p->mm) / PAGE_SIZE; task_unlock(p); - /* Normalize to oom_score_adj units */ - adj *= totalpages / 1000; + points *= 1000 / totalpages; points += adj; - /* - * Never return 0 for an eligible task regardless of the root bonus and - * oom_score_adj (oom_score_adj can't be OOM_SCORE_ADJ_MIN here). - */ - return points > 0 ? points : 1; + return points; } static const char * const oom_constraint_text[] = { @@ -341,7 +336,7 @@ static int oom_evaluate_task(struct task_struct *task, void *arg) } points = oom_badness(task, oc->totalpages); - if (!points || points < oc->chosen_points) + if (points > 0 || points < oc->chosen_points) goto next; select: -- Michal Hocko SUSE Labs