Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp1442153pxb; Wed, 20 Oct 2021 05:19:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxW+nDSiGe+vk/kggDDndfWN4v1mjHdQZU+uHvx+vR2F1VfAVRbnQrOPpY1LaPZBi2/oXvL X-Received: by 2002:a17:906:d145:: with SMTP id br5mr45327241ejb.250.1634732380767; Wed, 20 Oct 2021 05:19:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1634732380; cv=none; d=google.com; s=arc-20160816; b=IdCT43X583NVyc5qgajqFv+NCXdEXsSCdbMN9LrEzBg5t1Re70Xpcf7nXpetAASRvy rdNeQnvJvnw/0ZFh5U5I6tnDNpwX730pFsAFhkymjcDa8PJTC6n+Bjn+ZY5scONTnPdQ JYbDdppEgynJgwFYnw4enkwdat9m9rp33fH2R39Fgw3HWT9JSxr8qUbmL7xyrpN6ObKU fMEZqLtVJ/VwK5lCWwtF2xA9DaymcBlBWdXmmAL80mCNIVSngGqj7qUObtMR9j1eEhJs hUI3Rix0pIBHIph58b7ZzomID//yioZYyXr3j/QBI982OVSZnr3p0PLJVVQ6rWlPvzKV kM3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:references:cc :to:subject:from:dkim-signature; bh=vKfgRv2zJEAoAS/QMp8Ojy3ytr5x5Kwda6HCzY+o9dY=; b=taK/aCvtEup3CdZUfoMaBNtFVUo6xJ8rwd4zjHmXRD8vKfrKsfuwCAj6mwc4pBcGIk f8Vl2ysSuQhTKqoNCgKuxokkDVX4ZnCws4bjpLOPtZxfKsvetgrBC3wLHxz8gx3UYyhe T2qXeSa/XXI/hjjQDCmGbRQ5AN1OI4oVxOmS9bPEGbqEv0gBlXjuKsyeLceKyEwcDyMN MKuwCtYu8/HxfNGzoUv5WvFHvhNUAKDYw3EWYYnZ6+xWobT0SLQ8LuECccMwqSSSwSrY RKMhdZkhpJg31N2i7poz5XzVJujgGpet8xdZa1g3SwXTHqIt8t77HrayPm+mMaf3ivQm pDSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=piFq4YJO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id w7si2506919edq.616.2021.10.20.05.19.16; Wed, 20 Oct 2021 05:19:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@virtuozzo.com header.s=relay header.b=piFq4YJO; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=virtuozzo.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230344AbhJTMRH (ORCPT + 99 others); Wed, 20 Oct 2021 08:17:07 -0400 Received: from relay.sw.ru ([185.231.240.75]:44326 "EHLO relay.sw.ru" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230361AbhJTMRE (ORCPT ); Wed, 20 Oct 2021 08:17:04 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuozzo.com; s=relay; h=Content-Type:MIME-Version:Date:Message-ID:Subject :From; bh=vKfgRv2zJEAoAS/QMp8Ojy3ytr5x5Kwda6HCzY+o9dY=; b=piFq4YJOVCzthmB9i6b NgU9AF9sxMXuXUshwNGUqc8UUt7jOsEyjWpz7crmMVUVecu7tMqQloOLCOHVflMvVpfVsy94enpjs 38aVbuXoEwvwIBMuS1SZMSPcfMeMLX5W7o9phEpjbW/bnnHEfFKouHYb3wZ6hDngTOJJSojLDVQ=; Received: from [172.29.1.17] by relay.sw.ru with esmtp (Exim 4.94.2) (envelope-from ) id 1mdAUa-006bCw-9o; Wed, 20 Oct 2021 15:14:48 +0300 From: Vasily Averin Subject: [PATCH memcg 3/3] memcg: handle memcg oom failures To: Michal Hocko , Johannes Weiner , Vladimir Davydov , Andrew Morton Cc: Roman Gushchin , Uladzislau Rezki , Vlastimil Babka , Shakeel Butt , Mel Gorman , Tetsuo Handa , cgroups@vger.kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, kernel@openvz.org References: Message-ID: Date: Wed, 20 Oct 2021 15:14:27 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org mem_cgroup_oom() can fail if current task was marked unkillable and oom killer cannot find any victim. Currently we force memcg charge for such allocations, however it allow memcg-limited userspace task in to overuse assigned limits and potentially trigger the global memory shortage. Let's fail the memory charge in such cases. This failure should be somehow recognised in #PF context, so let's use current->memcg_in_oom == (struct mem_cgroup *)OOM_FAILED ToDo: what is the best way to notify pagefault_out_of_memory() about mem_cgroup_out_of_memory failure ? Signed-off-by: Vasily Averin --- mm/memcontrol.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 74a7379dbac1..b09d3c64f63f 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1810,11 +1810,21 @@ 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)) + if (mem_cgroup_out_of_memory(memcg, mask, order)) { ret = OOM_SUCCESS; - else + } else { ret = OOM_FAILED; - + /* + * In some rare cases mem_cgroup_out_of_memory() can return false. + * If it was called from #PF it forces handle_mm_fault() + * return VM_FAULT_OOM and executes pagefault_out_of_memory(). + * memcg_in_oom is set here to notify pagefault_out_of_memory() + * that it was a memcg-related failure and not allow to run + * global OOM. + */ + if (current->in_user_fault) + current->memcg_in_oom = (struct mem_cgroup *)ret; + } if (locked) mem_cgroup_oom_unlock(memcg); @@ -1848,6 +1858,15 @@ bool mem_cgroup_oom_synchronize(bool handle) if (!memcg) return false; + /* OOM is memcg, however out_of_memory() found no victim */ + if (memcg == (struct mem_cgroup *)OOM_FAILED) { + /* + * Should be called from pagefault_out_of_memory() only, + * where it is used to prevent false global OOM. + */ + current->memcg_in_oom = NULL; + return true; + } if (!handle) goto cleanup; @@ -2633,15 +2652,10 @@ static int try_charge_memcg(struct mem_cgroup *memcg, gfp_t gfp_mask, */ oom_status = mem_cgroup_oom(mem_over_limit, gfp_mask, get_order(nr_pages * PAGE_SIZE)); - switch (oom_status) { - case OOM_SUCCESS: + if (oom_status == OOM_SUCCESS) { passed_oom = true; nr_retries = MAX_RECLAIM_RETRIES; goto retry; - case OOM_FAILED: - goto force; - default: - goto nomem; } nomem: if (!(gfp_mask & __GFP_NOFAIL)) -- 2.32.0