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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 023B3C83F12 for ; Mon, 28 Aug 2023 17:34:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 52F988E0029; Mon, 28 Aug 2023 13:34:45 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 4B8278E001C; Mon, 28 Aug 2023 13:34:45 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 30B5E8E0029; Mon, 28 Aug 2023 13:34:45 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 1C0A88E001C for ; Mon, 28 Aug 2023 13:34:45 -0400 (EDT) Received: from smtpin22.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id E922D160423 for ; Mon, 28 Aug 2023 17:34:44 +0000 (UTC) X-FDA: 81174213288.22.61EF12B Received: from mail-ej1-f43.google.com (mail-ej1-f43.google.com [209.85.218.43]) by imf10.hostedemail.com (Postfix) with ESMTP id 012A6C001A for ; Mon, 28 Aug 2023 17:34:42 +0000 (UTC) Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=WsUalkF2; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf10.hostedemail.com: domain of yosryahmed@google.com designates 209.85.218.43 as permitted sender) smtp.mailfrom=yosryahmed@google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1693244083; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=U/hj4zAJGTB+R9zOcfvDXuXZl9jn964RzT9PqzJAHP0=; b=1EcaSfoeyjR3Sj2H1+mT18aqXxqUot65xYw7itr8gtNC9hCSQaEM2Em6vC8Sx0HeUIF6+z MASECBm7upBEAFxJw7eCKQpYAqwz+fLIy1NUBPLsD5lzevxO64BS2pD5GUas1sPCkS70/B 9SOYwFY2hCiLRLVa2qSeowM62DgohYQ= ARC-Authentication-Results: i=1; imf10.hostedemail.com; dkim=pass header.d=google.com header.s=20221208 header.b=WsUalkF2; dmarc=pass (policy=reject) header.from=google.com; spf=pass (imf10.hostedemail.com: domain of yosryahmed@google.com designates 209.85.218.43 as permitted sender) smtp.mailfrom=yosryahmed@google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1693244083; a=rsa-sha256; cv=none; b=h+XjjXYm0QtAK8TKuCyLEcMeZPH5mm1zQ0Q3xNO0h+N40wupTRkfM11CLUOmtHxydXwsV3 ud08V5myok+OZjeIK0XXIeK9dOD264erH49k562kTEvd5+c7VcrdJwUgk983ZNJwnYn/Cn Q1jRnKtrtL0tCpbtXlehsXPYG69ZCNI= Received: by mail-ej1-f43.google.com with SMTP id a640c23a62f3a-99c1c66876aso447648466b.2 for ; Mon, 28 Aug 2023 10:34:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1693244081; x=1693848881; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=U/hj4zAJGTB+R9zOcfvDXuXZl9jn964RzT9PqzJAHP0=; b=WsUalkF2WJkUXm1iyLayE+cKxReFkBrRh13idRWzabm5RlUS3+llbD48GNuWbXOn6t m79Y5p3vy/j2ej5wSdbTU+RbeLlXG/TtgvC2/4b3d9MNF4P+auj1xkKh1nECoyo2GjlP AiquHhh7ECeNSmHYAyZyX5hjm28PFYD9BMIU8VPi/jb5h+bl6wWiwmMYTEBhm/CF5qsA nBuBFz12D51f2rwaBPuJhtTAb14y7VSjx2IZ9gTHei44RAOwaZD0pSar7GYubwwlfJDJ A+Ubk0r+am8VuaiZvIOysukbCejD2iiz124Vc3u+LfUCpFr9JMKN1MSWolcnDzE5cHZu aDDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693244081; x=1693848881; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=U/hj4zAJGTB+R9zOcfvDXuXZl9jn964RzT9PqzJAHP0=; b=e10hRHWaGbPZGw6j2086hH/prn5XsI/DgJyCtCGUMlIZ65pS+x2qXdhkoOjatg2/6N 0Yoc2I3GcyBaRCsssDIvNrkYmBZGPNLDDPh2hsuLtgBmlclDSQ+qO4fDKZbsirbBa/vP FSvA6rgQmyyQKDKi9aiiFrTfD7tlsfZmn7mV0C+BQ29dAeN41rw+kmU59XUH11OJ0MX7 LRtpxeCkhE0zIzye93EntiBJ9VA+ABHTXKeqpwfg17lgccapSdRkdRjArb+O9Aifu6VY aP4FPcy4xIiqJ7671lhTLxPoG1+b9khNX38evY2mJH9CK0/SnxcBRw2LqBeGgAwOF/Rb QPcQ== X-Gm-Message-State: AOJu0Yz2CoWXR7G1FM8h2rSRNG2vcyN0X9S8brRFsBhJB7ijB9R4lbx2 WVsN7V3mtWCXRvSpZ2id6WrhoS9cGC2lfr+vhwSpyw== X-Google-Smtp-Source: AGHT+IEi7YigMwKZgkfNgXjdZC1iYDHnDNwgtE8RWJJovsbRv4Z9jhMYkK8lC5NEiWocERzRNBdblIzhv+vC1k/SjvE= X-Received: by 2002:a17:906:2189:b0:99c:85af:7aa6 with SMTP id 9-20020a170906218900b0099c85af7aa6mr18646688eju.28.1693244081274; Mon, 28 Aug 2023 10:34:41 -0700 (PDT) MIME-Version: 1.0 References: <20230826034401.640861-1-liushixin2@huawei.com> In-Reply-To: <20230826034401.640861-1-liushixin2@huawei.com> From: Yosry Ahmed Date: Mon, 28 Aug 2023 10:34:05 -0700 Message-ID: Subject: Re: [PATCH v3] mm: vmscan: try to reclaim swapcache pages if no swap space To: Liu Shixin Cc: Huang Ying , Michal Hocko , Johannes Weiner , Roman Gushchin , Shakeel Butt , Muchun Song , Andrew Morton , wangkefeng.wang@huawei.com, linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 012A6C001A X-Stat-Signature: 6qqm9wcykpptkc3g37u51c5fxgo5fjrg X-Rspam-User: X-HE-Tag: 1693244082-212782 X-HE-Meta: U2FsdGVkX18YVGCVgZtkmbaj7rxktUyzty/QM/C24S7iUrlPQ2osMsYiO7tRTRZM8o8aJOqXQk7+DKBPJMp2GZKj56VQWMRFheBehuwvs0cPyGti0lY9vFtcpg5i/heYp4LNhzTY/om52WXG4MidQvzZ0OKHPjUNE+rZUGTKPEJocovhvEN+vCMdUaskHAszegnINzXhP4tQTkdnDkAyYEFaH8Dj99KBSq1OWBUVqit0J/LRMGDyb7lef0KVuAH0uZpJej+zRGTQ82c7e9Tf3LcT+oyYldzgxq7OYFh/Fh4VoA2ZUGkvZrtUNDyQvFArGCIGTrKWYPwtkjv5sCl3jcjN+ACoFnfp4xtkug8Wf4rc2grcimhm8inN0D0WU34NZ/t7GX2iIRA3nl3A4dxZRIzxT2FbI/rc+Y9bFKltnOc+plNTBjyDrpnKeIEPwn0PCGRC2KBJTXizKH1qwzNYyob/if0LgmlkrGFozz2H0i7TgZHKox2wkcX09ywZYdWKcLWEjaKSOz8MlEnYjc3pFFz/CQPMejSeW7u2s60/8uWhayCL1edWqRBbKch6ZfOuFdp+p41bTdqewD2A3bwj3umRcjsEkfcU5MAeoy1IvtOr81NWHgtmDd9nQV9godst8eYlmB6pxiS43yQ/Au/I4uyG6yAIaQeeFBdjHCxGq8GcmNmCNfpi2y8kpAKbxbE2dhZH77xjwdXV9oYADLM4ZqILH5N+wbDCAA8xm5FHq2eNmobyTaKO+uEsSZqxj4r8i7w0Jxr+vphumm3Ymx1SH3ns5BaWfXzmx2LMYbYC5FcZy507nHGqeaH9TtfPPu09S2q95SWsm85/rw7bdDJ3d6nGsbBrcoej3DW8SAsHxbOxUbt23+aojA3ZnnI31nFtodaGKQHF7TLjkysdKlUvAER5IqOKnYjclZMI0erA4IJDcB5OOBODXCNe3+ibtm7gCXbDd/fMPdy060qzIvQ PBKs1tI1 0Sdmbo9iSPWVvKAe0CdhKrM+Nky9DHZOE0qOxHLG6sKth5NbTFHJF9HT8pGiILVRxlvnMy2ydsh3h3e25D3zRulY5jJMkDT8QLfucaXIFaXYNFp/Q3lkWgCtaI0LEFeR+3cLp6ltiZvpVda9IASFbaB+EbMh3rjCjcz+K8MjgLvOuSyZcQRGAUe1GOpcY52p0EH8752n5ES+ECxNUSj1qTlHvMfONbQLE7U+ZYxNZz4J9TPxFSirioX8Sa5i7IeYQXjhKmRwA9kwpxXfOB0qKw7EXRQ== 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 Fri, Aug 25, 2023 at 7:49=E2=80=AFPM Liu Shixin = wrote: > > When spaces of swap devices are exhausted, only file pages can be reclaim= ed. > But there are still some swapcache pages in anon lru list. This can lead > to a premature out-of-memory. > > This problem can be fixed by checking number of swapcache pages in > can_reclaim_anon_pages(). > > Add a new bit swapcache_only in struct scan_control to skip isolating ano= n > pages that are not in the swap cache when only swap cache can be reclaime= d. > > Signed-off-by: Liu Shixin I can confirm that with the reproducer I posted on v2 this patch fixes the problem, feel free to add: Tested-by: Yosry Ahmed The code LGTM. I personally prefer that we add NR_SWAPCACHE to memcg1_stats, so that it's obvious that it is used by cgroup v1 code, but perhaps maintainers have opinions against that. > --- > include/linux/swap.h | 6 ++++++ > mm/memcontrol.c | 8 ++++++++ > mm/vmscan.c | 29 +++++++++++++++++++++++++++-- > 3 files changed, 41 insertions(+), 2 deletions(-) > > diff --git a/include/linux/swap.h b/include/linux/swap.h > index 456546443f1f..0318e918bfa4 100644 > --- a/include/linux/swap.h > +++ b/include/linux/swap.h > @@ -669,6 +669,7 @@ static inline void mem_cgroup_uncharge_swap(swp_entry= _t entry, unsigned int nr_p > } > > extern long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg); > +extern long mem_cgroup_get_nr_swapcache_pages(struct mem_cgroup *memcg); > extern bool mem_cgroup_swap_full(struct folio *folio); > #else > static inline void mem_cgroup_swapout(struct folio *folio, swp_entry_t e= ntry) > @@ -691,6 +692,11 @@ static inline long mem_cgroup_get_nr_swap_pages(stru= ct mem_cgroup *memcg) > return get_nr_swap_pages(); > } > > +static inline long mem_cgroup_get_nr_swapcache_pages(struct mem_cgroup *= memcg) > +{ > + return total_swapcache_pages(); > +} > + > static inline bool mem_cgroup_swap_full(struct folio *folio) > { > return vm_swap_full(); > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index e8ca4bdcb03c..c465829db92b 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -7567,6 +7567,14 @@ long mem_cgroup_get_nr_swap_pages(struct mem_cgrou= p *memcg) > return nr_swap_pages; > } > > +long mem_cgroup_get_nr_swapcache_pages(struct mem_cgroup *memcg) > +{ > + if (mem_cgroup_disabled()) > + return total_swapcache_pages(); > + > + return memcg_page_state(memcg, NR_SWAPCACHE); > +} > + > bool mem_cgroup_swap_full(struct folio *folio) > { > struct mem_cgroup *memcg; > diff --git a/mm/vmscan.c b/mm/vmscan.c > index 7c33c5b653ef..5cb4adf6642b 100644 > --- a/mm/vmscan.c > +++ b/mm/vmscan.c > @@ -137,6 +137,9 @@ struct scan_control { > /* Always discard instead of demoting to lower tier memory */ > unsigned int no_demotion:1; > > + /* Swap space is exhausted, only reclaim swapcache for anon LRU *= / > + unsigned int swapcache_only:1; > + > /* Allocation order */ > s8 order; > > @@ -613,10 +616,20 @@ static inline bool can_reclaim_anon_pages(struct me= m_cgroup *memcg, > */ > if (get_nr_swap_pages() > 0) > return true; > + /* Is there any swapcache pages to reclaim? */ > + if (total_swapcache_pages() > 0) { > + sc->swapcache_only =3D 1; > + return true; > + } > } else { > /* Is the memcg below its swap limit? */ > if (mem_cgroup_get_nr_swap_pages(memcg) > 0) > return true; > + /* Is there any swapcache pages in memcg to reclaim? */ > + if (mem_cgroup_get_nr_swapcache_pages(memcg) > 0) { > + sc->swapcache_only =3D 1; > + return true; > + } > } > > /* > @@ -2280,6 +2293,19 @@ static bool skip_cma(struct folio *folio, struct s= can_control *sc) > } > #endif > > +static bool skip_isolate(struct folio *folio, struct scan_control *sc, > + enum lru_list lru) > +{ > + if (folio_zonenum(folio) > sc->reclaim_idx) > + return true; > + if (skip_cma(folio, sc)) > + return true; > + if (unlikely(sc->swapcache_only && !is_file_lru(lru) && > + !folio_test_swapcache(folio))) > + return true; > + return false; > +} > + > /* > * Isolating page from the lruvec to fill in @dst list by nr_to_scan tim= es. > * > @@ -2326,8 +2352,7 @@ static unsigned long isolate_lru_folios(unsigned lo= ng nr_to_scan, > nr_pages =3D folio_nr_pages(folio); > total_scan +=3D nr_pages; > > - if (folio_zonenum(folio) > sc->reclaim_idx || > - skip_cma(folio, sc)) { > + if (skip_isolate(folio, sc, lru)) { > nr_skipped[folio_zonenum(folio)] +=3D nr_pages; > move_to =3D &folios_skipped; > goto move; > -- > 2.25.1 >