From nobody Sat Sep 26 21:14:06 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A33BA632 for ; Sun, 30 Aug 2026 04:29:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788064176; cv=none; b=tuW3tLI+5UBTRF7HkVPv+5ovwcoH9yymE/LSR4fia0JYpushTYk5HiMjI+8B18jBsVqrSKz9zxS2oAZltgIDPNbbabhzHbvhl3xVcgHNvIBSK99VqCzyxxXGfoRKLMcTcScNmaSrnTAySVa5RXEPjdSXXCrBRQgHp9p5U4pLt5I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788064176; c=relaxed/simple; bh=9IpPFSzcLdM/8SH0aciFnU7h9JSdrOn6A0jBLTwIgtM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=VwTOu4bh/nPSWJ3wyJzFPvFrqqxZbIrHEdmU8wzLDMt5ZPMQFjosrDnIcuuMmiaziURsOkOQ8pI7Fhf0uECxkBB6n6544wsXXK84Q9NO5feBa4n1DSeDq5qlonZuOw76cBN91qCzQzFxwZCJnwg9n7C+0R3XAYOXTNbuuROsa9A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YQxk98Sj; arc=none smtp.client-ip=209.85.214.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YQxk98Sj" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-2cf110997efso2911045ad.2 for ; Sat, 29 Aug 2026 21:29:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788064174; x=1788668974; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HgBqYNXZCzr06f5NE3mn9NXVjLKoxOpoLRZ6XBqO/qg=; b=YQxk98SjDJPDMnJlW4hOvuSBRj6k7+uyilsE4BVW92xcQAHTJqNvZ0dex2smaX3v/i Xia9beFQ5crg8Myd2W8qxZViVYSKhkxXkXEOhhsb1n2KlBVHYZ3V489oHXO3cb6bdVvP zXd2GpWvu/KSAWSPW0A6dN/MhUIAfmYVKF5+lWWmrqr6nY1FNR7eJFenTIDls800Vjb6 3WaedjA3iM2v8WA3zoV7Xo2Onf6jqH4wY9qFGoa0ogvppIPkC8bI962Ru5VClykiG92y 1A8RLvy9bk9fBiaDfT3kIR88WisOonG/Pb/aj3JHJRYgGi30bJX4TmQLKgWXg8zZrBDk P2BQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788064174; x=1788668974; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=HgBqYNXZCzr06f5NE3mn9NXVjLKoxOpoLRZ6XBqO/qg=; b=eOhKG6uUaVEGc/yriAbKVprCqrl/sUnmzyMszIb/QtJWGlf6nBU8Pj8mqUReZu//E1 yKhPZkNWQQWDwWQf/tY/0p+26/SF/nnzY+/YKNbDttebiRHMUPR23f6RqLVv8W8IuqEg 8403/IPCPWl2J9lWyfCVRD0WZZDrpDq5T0ySJYh+U6CkKc0np1tMNUigGTU7yOp0OAzS O9OCxIbNylr4tYsGu3XYHLezE4jRVHlliYss2rfNggdUdUvRT8Ymt8nnuvOQl00wwPVI sYnpD7NwiU3vfNy8BmoVlB1XBOOofGVwAgkZ6XP6vdzemvshXuO9Fcr2Qkl4jbEkJRBc 58fw== X-Gm-Message-State: AFuF++m78a5CDBNZfNFdvm5ZZl8fMvTfUCsS7+/35CSQVbc3HYekiLs3 X1ARGeT7+lxZFd1ss6YWey4zh4aBLj0jxTpvEL2G/imnQ+GiWbJnMwlA X-Gm-Gg: AYBFou2kij6I0FpKqCn8E2xpiAGM5rxmtYV3lsd6UdCLKr3wU6t7AbnkIKRmRvP+bd7 cryrUmm7wJ+Z/V+Lg2dBb7PtEWwbmRqz5U8es0+5hYwBi+Ns45QFjljno2qdmtbPt4bpciDKbVs W5N7w3jJIlTy5TaUUqMsYe8q3lxWyYBrUQhGKRrGu+l/gxayxOpvXAEVxCQxn2pZ/8a9FDogQMO 3f36ppkpb6YCTGoIuslWsjhd5t/KmvRwa3p/LJW4dvVKMBA3wOlQ5KvbDyn6RTSTOuhvxd74Bt6 +bA2VlJPCD3EVg9KorAP3HMAV7fM83tciSCBH2XZ/zfyBiIuIxXIOmvorZT+k3U2Suh+epqZ+Yx XBVzfxKYUHMv68FIx/1vYShwxEAhJTarOq6niXJZ8vjkGtl+lO9qb/og//gkiGY8jNhwk++Euu8 96Xbyz7cBIS7bEBLRmIiDswHseVtqFovun5oWf8k6MbuGx1czJlMGvKlbwJ2NtxfuNGcNg3amCt O9wgzSp3CkKgA3kGRoYVwyXgrgn5mnyHvHdZpw2Qwf8d4ShRo6X X-Received: by 2002:a17:903:1112:b0:2d6:3c1a:85ef with SMTP id d9443c01a7336-2d74e08b96emr156523785ad.4.1788064173835; Sat, 29 Aug 2026 21:29:33 -0700 (PDT) Received: from o6.lan ([188.253.112.231]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d8f98d46casm7493535ad.83.2026.08.29.21.29.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Aug 2026 21:29:33 -0700 (PDT) From: Xueyuan Chen To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, zhaonanzhe@xiaomi.com, baohua@kernel.org, hannes@cmpxchg.org, ryncsn@gmail.com, youngjun.park@lge.com, baolin.wang@linux.alibaba.com, hughd@google.com, chrisl@kernel.org, shikemeng@huaweicloud.com, nphamcs@gmail.com, baoquan.he@linux.dev, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, david@kernel.org, ljs@kernel.org, xueyuan.chen21@gmail.com Subject: [PATCH v7 1/4] mm: add page_counter_margin() Date: Sun, 30 Aug 2026 12:29:17 +0800 Message-ID: <20260830042920.2280454-2-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260830042920.2280454-1-xueyuan.chen21@gmail.com> References: <20260830042920.2280454-1-xueyuan.chen21@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Johannes Weiner mem_cgroup_get_nr_swap_pages() open-codes the remaining capacity across the memcg swap counter hierarchy. Add page_counter_margin() to return the minimum usable space from a page counter to the root, and use it in mem_cgroup_get_nr_swap_pages(). This is a pure refactoring with no intended behavior change. Signed-off-by: Johannes Weiner Signed-off-by: Xueyuan Chen Reviewed-by: David Hildenbrand (Arm) Reviewed-by: Barry Song --- include/linux/page_counter.h | 1 + mm/memcontrol.c | 9 +++------ mm/page_counter.c | 20 ++++++++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/include/linux/page_counter.h b/include/linux/page_counter.h index d649b6bbbc87..07b7cb12249c 100644 --- a/include/linux/page_counter.h +++ b/include/linux/page_counter.h @@ -68,6 +68,7 @@ static inline unsigned long page_counter_read(struct page= _counter *counter) return atomic_long_read(&counter->usage); } =20 +long page_counter_margin(struct page_counter *counter); void page_counter_cancel(struct page_counter *counter, unsigned long nr_pa= ges); void page_counter_charge(struct page_counter *counter, unsigned long nr_pa= ges); bool page_counter_try_charge(struct page_counter *counter, diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 8319ad8c5c23..109c08be91cf 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5670,12 +5670,9 @@ long mem_cgroup_get_nr_swap_pages(struct mem_cgroup = *memcg) { long nr_swap_pages =3D get_nr_swap_pages(); =20 - if (mem_cgroup_disabled() || do_memsw_account()) - return nr_swap_pages; - for (; !mem_cgroup_is_root(memcg); memcg =3D parent_mem_cgroup(memcg)) - nr_swap_pages =3D min_t(long, nr_swap_pages, - READ_ONCE(memcg->swap.max) - - page_counter_read(&memcg->swap)); + if (!mem_cgroup_disabled() && !do_memsw_account()) + nr_swap_pages =3D min(nr_swap_pages, page_counter_margin(&memcg->swap)); + return nr_swap_pages; } =20 diff --git a/mm/page_counter.c b/mm/page_counter.c index 661e0f2a5127..450543f4b318 100644 --- a/mm/page_counter.c +++ b/mm/page_counter.c @@ -46,6 +46,26 @@ static void propagate_protected_usage(struct page_counte= r *c, } } =20 +/** + * page_counter_margin - remaining usable space within hierarchical limits + * @counter: counter + * + * Return: The minimum value of max minus usage across @counter and all of + * its ancestors. The value may be negative during a concurrent charge. + */ +long page_counter_margin(struct page_counter *counter) +{ + long margin =3D PAGE_COUNTER_MAX; + + do { + long m =3D READ_ONCE(counter->max) - page_counter_read(counter); + + margin =3D min(margin, m); + } while ((counter =3D counter->parent)); + + return margin; +} + /** * page_counter_cancel - take pages out of the local counter * @counter: counter base-commit: c73b725a57f276a3702ca213bde78fca029bc619 --=20 2.47.3 From nobody Sat Sep 26 21:14:06 2026 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 492CE2459E1 for ; Sun, 30 Aug 2026 04:29:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788064181; cv=none; b=DSOd2Tu6lM6MWXkjZgvDqkbfX1t9wyu00U21IQik4B7GbcPCTsdMIU74pnIXd5hAsnmny9hJRAYBkfgzMQ8JDUrBFgyfJLDilTVm4HEfVqNQh8eLM6zzhDVysfrWAsMersCQK4cscMDVGgtVx04vUM4XUeaoTGTJhbP+Tf0NkMw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788064181; c=relaxed/simple; bh=Z2P/u8p2VN2KJWt6zvZw7BNx1xVUliqSH9psL0YD++Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KwMW8nRFBRDgThHeHqxYgiEzS7yg0L4dTbLJw38guhwK9dNwy054kKvl1iQw7M0wxWuo2VUCgJL532/N7lHrUvpdDjNfqzk88zyN3hfuuZrjP8AGzdl2/nG10VpT8UI8Bh7nDsMdsTn+ejwaBpdJCrECLpjm5dPx4njXjDB+dhQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mL5HnAV7; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mL5HnAV7" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2d319b84213so3379165ad.1 for ; Sat, 29 Aug 2026 21:29:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788064179; x=1788668979; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=uO+fdQnTYZ+Aocv+Kahxqh7F24JHdH1Qim2aviwHKRg=; b=mL5HnAV7XbmoU5X2+cf0KqtXXrvJ6SOvOTRUyZUQAMZyWgoJY4+UnusyN9lP/Kl2Uw b9rJH3skBNhfpMO3BR9tSY1X/guvQfdUV1J9/OnbQP/Sy7ThbdDlCxLtNRa76/NZzYVx kQwe9cRXjw9qmOk/TxNpXY5hZWxXI3uOkpXaf966fWLdYUGH5sl6w93Yb5gfZ3+4B/Zh DEW+O5VDQlAFAN6bRvkYtxLevYvdYZPeM+XYU52Xfy21N+jxbVe9vE0sUUJVe2ixeQDB T5/47mxM/KYN8MtNldYrHo4xTP6QOFF86eGPHpD84zhdt3NGBT292dvjMQCTpQ5Cc+uS 6lRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788064179; x=1788668979; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=uO+fdQnTYZ+Aocv+Kahxqh7F24JHdH1Qim2aviwHKRg=; b=o0q1Xy5DPrkKxU7FAlYQ5lOPEZ/HgflePFdFH+VgJ53pO0VNVY2KzTaoSNagXkrWMT yn62r/u84LX5gtXrSF8mU8CNTZy4sN7MAglMtxxM7Z+9jum9ssys/7epx+VYXjuhGylU iIMPBDHY0YaLrbTT/htQJ1sfCzOfVdm/8+kAUeAAMXJr3Qq9uLeVOXQvaZYSYT+i9yzH NxMt62Uf6JvIOwLmVm3gBSgCBmwBAcuqG61LN+MjZjb+H/CDKx3DjfhHxDKrR42x3xRI qthqoRuzFu63UuWdc6EyWKx7Tz/pquwwEhYnm0fj1HY+vkCSit4SWr5hqrw3V72/IRvv 5r0A== X-Gm-Message-State: AFuF++lCdpYRuNO/BPSl4PStTV6BwDqVrQdUCeDJWGclSxgsTc67s6oo 1L9ShDehzSTkiFoNI1sbwUI9ZEvvM4W02aRnKFv3ok9PginL+ncazcJYwHgIMTSn7s2JeFw2spE = X-Gm-Gg: AYBFou0zeMGBlQG93a3yx3AyJimJdHFX8k/w2rm/kB0ymRuJBr723PCF0CUQn3IiUoX GGEuk//alhsbhEnDx4zKLJywIPG0J+mDvB/ajgtws09oh5ljhz91PogkfMfBELMIFE8ZUa9twkn gfVnKBtP3pKKOkI/AdtTFfMLdmtVoFud2Fz0Boq36+n6glmUvKXoA1UlhWlnxgVmKm1bXkUbL3j 2vlLPBCZP0PMR2KBHTVDWA4rVCFSV/GPpkUjLfHMOsy8yi9G22TK62h3fUtJpii1YhJyM8TiVos qJUYREmY97J2z90FYmc4AwFWZbMXDpyHliRN7grJdy5SjD+F7xIpGqH71IKIRpJ1V3w6XOxRhQa 812W1pRsl1ZSXSLbzZVj8s82zMvf65vuVt1YWLORrm/YlVtGv+MCzuEJByl+QzS3nDx/botcDSJ Po/bnKkW5o3O6dBOdkEKj5L4owTWG8u2syQqpbxvTPHHbMbbUpE1T7la0mMEyOGoiHGLapD20/0 opL1+eoesWOeoqkYFSZ+IUPw8FZcoJmzwPuGHKONFS+Wi3OhJA= X-Received: by 2002:a17:902:ec82:b0:2d2:a952:2628 with SMTP id d9443c01a7336-2d74def63efmr160857695ad.2.1788064179371; Sat, 29 Aug 2026 21:29:39 -0700 (PDT) Received: from o6.lan ([188.253.112.231]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d8f98d46casm7493535ad.83.2026.08.29.21.29.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Aug 2026 21:29:39 -0700 (PDT) From: Xueyuan Chen To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, zhaonanzhe@xiaomi.com, baohua@kernel.org, hannes@cmpxchg.org, ryncsn@gmail.com, youngjun.park@lge.com, baolin.wang@linux.alibaba.com, hughd@google.com, chrisl@kernel.org, shikemeng@huaweicloud.com, nphamcs@gmail.com, baoquan.he@linux.dev, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, david@kernel.org, ljs@kernel.org, xueyuan.chen21@gmail.com Subject: [PATCH v7 2/4] mm: distinguish large folio swap allocation failures Date: Sun, 30 Aug 2026 12:29:18 +0800 Message-ID: <20260830042920.2280454-3-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260830042920.2280454-1-xueyuan.chen21@gmail.com> References: <20260830042920.2280454-1-xueyuan.chen21@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" folio_alloc_swap() reports most failures with generic negative error codes. Reclaim callers consequently cannot tell whether splitting a large folio could make progress, or whether no swap space is available for even a single page. Classify failures using both the global free swap count and the remaining capacity in the folio's memcg swap hierarchy. Return -ENOSPC when global swap space is exhausted, -ENOMEM when splitting cannot overcome the failure, and -E2BIG for a large folio when allocating or charging a smaller folio might still succeed. Use this classification for all folio_alloc_swap() failure paths, including capability rejection, swap slot allocation failure, and memcg swap charge failure. Callers are updated separately to split large folios only on -E2BIG. Suggested-by: Kairui Song Suggested-by: Barry Song Suggested-by: Youngjun Park Signed-off-by: Xueyuan Chen Acked-by: David Hildenbrand (Arm) --- include/linux/swap.h | 6 ++++++ mm/memcontrol.c | 23 +++++++++++++++++++++++ mm/swapfile.c | 26 +++++++++++++++++++------- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 0544b2ec4c56..b23108d992aa 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -525,6 +525,7 @@ static inline void mem_cgroup_uncharge_swap(unsigned sh= ort id, unsigned int nr_p __mem_cgroup_uncharge_swap(id, nr_pages); } =20 +long mem_cgroup_get_folio_swap_margin(struct folio *folio); extern long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg); extern bool mem_cgroup_swap_full(struct folio *folio); #else @@ -538,6 +539,11 @@ static inline void mem_cgroup_uncharge_swap(unsigned s= hort id, { } =20 +static inline long mem_cgroup_get_folio_swap_margin(struct folio *folio) +{ + return PAGE_COUNTER_MAX; +} + static inline long mem_cgroup_get_nr_swap_pages(struct mem_cgroup *memcg) { return get_nr_swap_pages(); diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 109c08be91cf..4b42f3fc6075 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5676,6 +5676,29 @@ long mem_cgroup_get_nr_swap_pages(struct mem_cgroup = *memcg) return nr_swap_pages; } =20 +/** + * mem_cgroup_get_folio_swap_margin - get a folio's memcg swap margin + * @folio: folio whose memcg margin is queried + * + * Return: Remaining chargeable pages in the folio's memcg hierarchy. + */ +long mem_cgroup_get_folio_swap_margin(struct folio *folio) +{ + struct mem_cgroup *memcg; + long margin; + + if (mem_cgroup_disabled() || do_memsw_account() || + !folio_memcg_charged(folio)) + return PAGE_COUNTER_MAX; + + rcu_read_lock(); + memcg =3D folio_memcg(folio); + margin =3D page_counter_margin(&memcg->swap); + rcu_read_unlock(); + + return margin; +} + bool mem_cgroup_swap_full(struct folio *folio) { struct mem_cgroup *memcg; diff --git a/mm/swapfile.c b/mm/swapfile.c index 70b90fa9c2a0..651682b1fe63 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1735,7 +1735,9 @@ static int swap_dup_entries_cluster(struct swap_info_= struct *si, * swap cache. * * Context: Caller needs to hold the folio lock. - * Return: Whether the folio was added to the swap cache. + * Return: %0 on success, %-E2BIG if splitting the folio might allow swapo= ut, + * %-ENOSPC if no global swap space is available, or %-ENOMEM if splitting + * would not help. */ int folio_alloc_swap(struct folio *folio) { @@ -1747,11 +1749,11 @@ int folio_alloc_swap(struct folio *folio) =20 if (order) { /* - * Reject large allocation when THP_SWAP is disabled, - * the caller should split the folio and try again. + * Reject large allocation when THP_SWAP is disabled. Check below + * whether splitting and retrying can make progress. */ if (!IS_ENABLED(CONFIG_THP_SWAP)) - return -EAGAIN; + goto failed; =20 /* * Allocation size should never exceed cluster size @@ -1759,7 +1761,7 @@ int folio_alloc_swap(struct folio *folio) */ if (size > SWAPFILE_CLUSTER) { VM_WARN_ON_ONCE(1); - return -EINVAL; + goto failed; } } =20 @@ -1775,13 +1777,23 @@ int folio_alloc_swap(struct folio *folio) } =20 /* Need to call this even if allocation failed, for MEMCG_SWAP_FAIL. */ - if (unlikely(mem_cgroup_try_charge_swap(folio))) + if (unlikely(mem_cgroup_try_charge_swap(folio))) { swap_cache_del_folio(folio); + goto failed; + } =20 if (unlikely(!folio_test_swapcache(folio))) - return -ENOMEM; + goto failed; =20 return 0; + +failed: + if (get_nr_swap_pages() <=3D 0) + return -ENOSPC; + if (mem_cgroup_get_folio_swap_margin(folio) <=3D 0) + return -ENOMEM; + + return order ? -E2BIG : -ENOMEM; } =20 /** --=20 2.47.3 From nobody Sat Sep 26 21:14:06 2026 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AE597261B8A for ; Sun, 30 Aug 2026 04:29:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788064187; cv=none; b=O6R++gyTtxDzQdAOCDuDHFjBjCKYcRWrIAnKdgZysfEvrrSbwOihmFdS6olL/Ypyn3x6C8HCyV9j+a/bnazruNGh+fmHSqdZA+ap4++63FNIn1VGfgCVgm4f2+mXMe6mXkXtkkRkVMbDqys7X2ddqRPaKX3dCVvvsodIH7YrszA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788064187; c=relaxed/simple; bh=XaathRSrx29KQi5sCxP3i8qUQiCNwd8x5Hpg2To/nkk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ad74Dt+o5Hltu7LYaxbrWxnKM+UfDwNNl8nUYd4LCHtdya3fiEdEb35AY8g4dc+sKmCS9bux20NsYswevzXzKJ7J417pulKa3JSNE0LxsiJpSjd5KedzHxNhWIZImhkVMmED8NM7SOtt0m26e8lcrjlqU739lsVViFzK6alPoE0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HRrmLKzw; arc=none smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HRrmLKzw" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2ccae46de39so3930385ad.3 for ; Sat, 29 Aug 2026 21:29:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788064185; x=1788668985; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=CEIXli5+VfZzqjxEvVpDIXpUlXMwSuWYvMfEYh72ukg=; b=HRrmLKzwgHsruDtwvH5wenI+NgxtY70HlZh/QbZ9kB+hg5QEXHKK8hnvgVYh4OFfIV 3AtzTwUGHyn/A0LaIB8bnwtyM86aUgCl/0UDcDZ13e/irgKDvz02Gp18Yj6IThHlLW4z wJwMcTfuouXMdv342TAc+xlPAxCp4DoShhQUEZy7b8L9/62d+CsLHKZeUlH4ySDaG/Rh 4aXIMVdwPsOzYl4D78y5ensfPgMUq9alJteX5z+SAEG5wk7XkuXBl9T09QX2OzlSuDYn Z5Mi5IgEjnigchkweIqRjIJ8SUGWDRFxXF6RSWAtExPs9v212zN17L0M4HqlNtTLFK+Z r5fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788064185; x=1788668985; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=CEIXli5+VfZzqjxEvVpDIXpUlXMwSuWYvMfEYh72ukg=; b=nRqHLCOvb21/8eY6hiCupE27ta9SqncwwlVHk1TjgnwxSoGMcBgneBxmN0JdVvbG1s Iw4vmmYT9w+qH5mkF65++006AGbufB9UBxDErkmke8MaSSLp19WUZNsYU/C667h6Aki6 yey7L3BaRZtjPDMEHfWQ8z6GghxcEHcvBuP/5pVhjZ5OBodsgWnm2gj1kPxvHghGQhUx 1DhudS3BMk3/jaaYA50HvNB8Ia2+M6hj2Y9XOcUZzEQsRXb5dftU5E6SJfTbwOdwaPoI l0kbee26NRb1ff9wqCiKWROLRMoU5LD7He45AFaKyaAesFP72jRvNMscVRJCWUqGCRRL Azhg== X-Gm-Message-State: AFuF++marH1tWveTZaZXbhcJIw8/R/4wayLFhfqG8oPOq79CwclT+DjM PwPUCfE/rdEhGgkNiN9X9zWrxj/h2c8n0Ko9dadg2lgauIt/ewjthvrk X-Gm-Gg: AYBFou0UEsBXtlF0yDp6/S1mBRlxTZmBFDq1Y02F5MVPmmLjZUbnNH1Fgg0LH3HgaGH hVGKGH5ZW+C3xO28z6QPU3lgongIaoru7zyTzdOtD0d7OcZOrlU0L8aWUXLamB38w+iL1qoAL3S VqJ48/E6bixFIURcCfXZGqO4NIGxDyvtms+bUsiQ01ricrs/Vr7uIVFeyzdlDMEjQwrm2BMOIyx Pb+RyMG/oyLtPGJ2C9kisK7EU6DASJn+HtM7RNfhviPhompuPQtBvJ2lnac5iEgVos5DYIoTKnu z63JCUZ58KiQOfAYi6laTAZp22qkqRTahtEgc4mEwTDp1xmpvpezLzlqGf4xfZTtEoQuZ6NFVqy 1i8QdB9nCdYNWtw98c53aaE3alvha9u+YiyQk3UqRybg5VkRxt3c5NU87nNwwHiBIodRRJIOYQP y5i+4/tznp9rJueQzpsjILw96X1igx8+sXYbOTPiW10F+DGYn8+aWc0tEmtXMu5AGkDzeFiICzR GDEHERsmYBn4Juuv0Dl9NYve0XyVMd6tswpcSmFuOxfduysFoo= X-Received: by 2002:a17:903:1104:b0:2c9:8287:fd0d with SMTP id d9443c01a7336-2d74df62ccemr151520335ad.3.1788064184852; Sat, 29 Aug 2026 21:29:44 -0700 (PDT) Received: from o6.lan ([188.253.112.231]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d8f98d46casm7493535ad.83.2026.08.29.21.29.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Aug 2026 21:29:44 -0700 (PDT) From: Xueyuan Chen To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, zhaonanzhe@xiaomi.com, baohua@kernel.org, hannes@cmpxchg.org, ryncsn@gmail.com, youngjun.park@lge.com, baolin.wang@linux.alibaba.com, hughd@google.com, chrisl@kernel.org, shikemeng@huaweicloud.com, nphamcs@gmail.com, baoquan.he@linux.dev, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, david@kernel.org, ljs@kernel.org, xueyuan.chen21@gmail.com Subject: [PATCH v7 3/4] mm/vmscan: avoid pointless large folio splits without swap Date: Sun, 30 Aug 2026 12:29:19 +0800 Message-ID: <20260830042920.2280454-4-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260830042920.2280454-1-xueyuan.chen21@gmail.com> References: <20260830042920.2280454-1-xueyuan.chen21@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Barry Song (Xiaomi)" When swap is disabled, exhausted, or unavailable due to memcg swap limits, splitting a large anonymous folio cannot make swapout progress. The fallback only destroys the large folio and inflates split statistics. Use -E2BIG from folio_alloc_swap() as the explicit signal that splitting the folio might allow swapout of smaller pieces. For other allocation failures, keep the existing activation path and avoid the split. This preserves the split fallback for fragmented or partially available swap, while avoiding it when there is no backing space for any part of the folio. Reported-by: Nanzhe Zhao Signed-off-by: Barry Song (Xiaomi) Signed-off-by: Xueyuan Chen Acked-by: David Hildenbrand (Arm) Reviewed-by: Baolin Wang --- mm/vmscan.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 26df81e773ff..457049e130df 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1263,6 +1263,8 @@ static unsigned int shrink_folio_list(struct list_hea= d *folio_list, */ if (folio_test_anon(folio) && folio_test_swapbacked(folio) && !folio_test_swapcache(folio)) { + int ret; + if (!(sc->gfp_mask & __GFP_IO)) goto keep_locked; if (folio_maybe_dma_pinned(folio)) @@ -1281,11 +1283,14 @@ static unsigned int shrink_folio_list(struct list_h= ead *folio_list, split_folio_to_list(folio, folio_list)) goto activate_locked; } - if (folio_alloc_swap(folio)) { + ret =3D folio_alloc_swap(folio); + if (ret) { int __maybe_unused order =3D folio_order(folio); =20 if (!folio_test_large(folio)) goto activate_locked_split; + if (ret !=3D -E2BIG) + goto activate_locked; /* Fallback to swap normal pages */ if (split_folio_to_list(folio, folio_list)) goto activate_locked; --=20 2.47.3 From nobody Sat Sep 26 21:14:06 2026 Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31F3729BD9A for ; Sun, 30 Aug 2026 04:29:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788064192; cv=none; b=OLyEAQ3n9NnNoINVDc6Uff37y6dfJSz0+XAYzU4yIkPQ2wnQLYDIBgULAsjKb/pcMJUw+ZxpaBUeHCMbQgyvNowHK01xTnK/i8NlBffyyUkZWgq60KMX+tijWZYKpL6CF0E+ZpKsQyDoDWdFo2qJeszbQllrEa/g7EXk6BOrbDI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788064192; c=relaxed/simple; bh=jlsMADLwJ/8YxSz9rHL6HMJ91PlPCeP88izjFdx/g98=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=aPYSs3C8Ck34Xmit4kFHhAVSkEABGc0E8CFjRbYT6Tz8vCzULdDhwPZhNGSMp/1nZNXpPXH2dICDcDr1yAZBboNlNGc0I2Qg3yWxLT2m9UqzkpIeKzGBsgxkvCLF2CuPx+eRJs7NUpzPnssae2Ks2AXVVWxBTjDISbwaW5piZBE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mpbJopTz; arc=none smtp.client-ip=209.85.215.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mpbJopTz" Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-cbedaf975a3so431977a12.1 for ; Sat, 29 Aug 2026 21:29:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788064190; x=1788668990; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=KIo/hskvY35I+xlwCnjLbjXGmC9TvGJPu5fGHiHuA6o=; b=mpbJopTz2shr256SUkJKWCQdm9lOEfGY945rK4iIzon94pyGIhVrnIOqPkwgJhnUP2 dbypGfwEkK7zPUNt3mioR6C+IX/r+eaPEKZgBPGTUCLOnBkEXLSrXV92isi4HWFsVo0K Zkll0fwfSiKia8d1fJzZg3ulaF6qpzMWzi8Jucr7T9pKSyPILIC2rR0E/0iKoj8Ctwb6 or4m9wiiWepxRxbRUJkoXeSyNexWayThA0K7bKupVSFY/lI6MM1NCBu5CBaFjMmlbUYR Dnylv3hkUwyvjpdZnDhsqN7+kQMn6BDYzE7h3nL7Z+i/Z9p2PtqTsdlS1375k9N5ArBx d8sA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788064190; x=1788668990; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=KIo/hskvY35I+xlwCnjLbjXGmC9TvGJPu5fGHiHuA6o=; b=hjxfQ+mRuB6Ll5bEnx9nvW+0lUD5F4padXGNz65+WOrqA1/7djQon1e38XhK50Crbb a4h9WMc2N6FU9uYp4kufl9fOe7ySJgAzXMUry6KkIsQtjoCFQ/aT3WacgBSheXlUaOq5 DeLWF2vrZ0kprR9y5ui542OPM3fNfAuR4pkoBVhmSmvHPvLqz+DkPqVjj/LT1bIg1atu edVRmVhP5mxTaKoktvPTnosCFwa6pxvtfO5+ntA33t+1BsiZDXDRLX12j1a9CqOizvLP eT6PSjoD/HV+Q8X9LEvCXr8pLlSnqD7WVkg/7pBJ7NzTJzcXSbZZozeFEon5RrrxvTVo FTcA== X-Gm-Message-State: AFuF++lnr/ntgf8/hfr9wKM2LL8jB1S6WH+G53YBK0umEn9oQyJ91WHD 6IRiFWyag/D8HzH/K2/pgJbxnE3kdaDawwPvLqam1OfbpG1VO+D1iZDf X-Gm-Gg: AYBFou1j4WjYe4IG+QDEQmm2VIz9jCq0YEE/+lg/SfHifg9BMOWYUXvF78lhi3AXv6T FfolgB5rPPYBP/COqlAetyRIc20mW+z4uVz7JfmpDr9AUOeAgD+ownFV1txCljPbPdOH47M501p 9MQpKSCwMtitNhaOz0fo11QJlku7Sz3UemEaUxDs9oC0IrRaOUqJbHzE1QSPC9iHFQHA+PMHuKp FVA/hspquP2HY74PZdsiB4KS1x+pECMzcMdl4ZUPZzVk3pkJ2DhFEvzjhEZEBsWzdWXNxipx3KW x7M5VNsykfSfyfusHYz9KB+MPiPs6SwEBpd0r02apRNkWXPQJiu+vjEb+1K7eUP86GXLBn0Jy2H iEC3rcGAGRgq5Clk/fi9m4H+qV8Szwn5bGaPDcnGvrQeafcCmaKdfe4MGP5dOADMUxqdxcJagAS bGraUc/9ivRS+Zia1JXSRmTYB01b1COnZO2j37hOt2bw33J3Adzc/2zNCSVcFX26gZtRz4yWron 5BIgIhbQF6ZSb02UsxOhs9a6DrnM/EfMwEn+ApKo+mkroTVC5Eg X-Received: by 2002:a17:903:1106:b0:2d7:1a3f:8db5 with SMTP id d9443c01a7336-2d74e0c729bmr155654705ad.4.1788064190386; Sat, 29 Aug 2026 21:29:50 -0700 (PDT) Received: from o6.lan ([188.253.112.231]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d8f98d46casm7493535ad.83.2026.08.29.21.29.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 29 Aug 2026 21:29:50 -0700 (PDT) From: Xueyuan Chen To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, zhaonanzhe@xiaomi.com, baohua@kernel.org, hannes@cmpxchg.org, ryncsn@gmail.com, youngjun.park@lge.com, baolin.wang@linux.alibaba.com, hughd@google.com, chrisl@kernel.org, shikemeng@huaweicloud.com, nphamcs@gmail.com, baoquan.he@linux.dev, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, david@kernel.org, ljs@kernel.org, xueyuan.chen21@gmail.com Subject: [PATCH v7 4/4] mm/shmem: split large folios only on -E2BIG Date: Sun, 30 Aug 2026 12:29:20 +0800 Message-ID: <20260830042920.2280454-5-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260830042920.2280454-1-xueyuan.chen21@gmail.com> References: <20260830042920.2280454-1-xueyuan.chen21@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" shmem_writeout() currently splits a large folio on every folio_alloc_swap() failure. With the refined return-value contract, only -E2BIG indicates that splitting might allow smaller folios to be swapped out. Enter the split fallback only for -E2BIG. For -ENOSPC and -ENOMEM, redirty and reactivate the folio as before. Suggested-by: Baolin Wang Reviewed-by: Baolin Wang Signed-off-by: Xueyuan Chen Acked-by: David Hildenbrand (Arm) Reviewed-by: Barry Song --- mm/shmem.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mm/shmem.c b/mm/shmem.c index 6641823bed16..eff38bb33d8a 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1608,7 +1608,7 @@ int shmem_writeout(struct swap_io_ctx *ctx, struct fo= lio *folio, struct shmem_inode_info *info =3D SHMEM_I(inode); struct shmem_sb_info *sbinfo =3D SHMEM_SB(inode->i_sb); pgoff_t index; - int nr_pages; + int nr_pages, ret; bool split =3D false; =20 if ((info->flags & SHMEM_F_LOCKED) || sbinfo->noswap) @@ -1689,7 +1689,8 @@ int shmem_writeout(struct swap_io_ctx *ctx, struct fo= lio *folio, folio_mark_uptodate(folio); } =20 - if (!folio_alloc_swap(folio)) { + ret =3D folio_alloc_swap(folio); + if (!ret) { bool first_swapped =3D shmem_recalc_inode(inode, 0, nr_pages); int error; =20 @@ -1742,7 +1743,7 @@ int shmem_writeout(struct swap_io_ctx *ctx, struct fo= lio *folio, swap_cache_del_folio(folio); goto redirty; } - if (nr_pages > 1) + if (nr_pages > 1 && ret =3D=3D -E2BIG) goto try_split; redirty: folio_mark_dirty(folio); --=20 2.47.3