From nobody Tue Sep 29 02:35:31 2026 Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) (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 BBED33B6364 for ; Thu, 13 Aug 2026 07:50:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786607449; cv=none; b=janLVdJ65U5h9j2yoxfobtiYg1wH5QE8V5wLvk1uKgTPLpGJH+sCbRvwwkGxJ25bvR3n3TLKI08sUhY8J+3jiIvB7W8xjBXXbcNBYrdGq+kI1jMFTUQLSNsggJVldoWEq0w85nse++I637P3Jfs/3+yGwEuG3GdhVJTqyqqt9Ec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786607449; c=relaxed/simple; bh=9IpPFSzcLdM/8SH0aciFnU7h9JSdrOn6A0jBLTwIgtM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=W8lRCmmpjPU2doClU/oACjzHDn+M2bgAflFuoFcBNEhj9qq6NBFnGzwjxLEz+TsFh15fw8ontn9faO5ajVKvYh975FOBj3+mltxrGqxX6Syf3s7+tEwqiJEoLFWOS6AGrhUdFI4gEkl2mBXll+sDvw5IwngUx4R3kc+kqMinJt0= 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=d+nBeRzt; arc=none smtp.client-ip=209.85.214.173 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="d+nBeRzt" Received: by mail-pl1-f173.google.com with SMTP id d9443c01a7336-2cad68425a7so2618425ad.1 for ; Thu, 13 Aug 2026 00:50:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786607443; x=1787212243; 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=d+nBeRztFbobsBkzQpXOmDm5LZMI974j84U0+OwWbqLy8HC+hQYj6kL6YqdztU8qgH 353jmcWW6pUfUDGQvMSysMdWt1JhI6AHy4gblquQqFpKf9SHshD3GTNXKZ9s626hVobJ B2rZi1/unH53Gc5n1GTNzNW77zLueEVWVFuJ2Z50kW1pfK5J2K1tg9VREsbdVAoH1wbh oZWL6Ko5g0jQ4+ngn5PViHxHA1TOQmM0A/l2ZYZxJkQenXP10MrEHrUt8l5gx6NNmE/0 rYvyAfKIISmzjwbWZG1naP1hcR6vPX2FBgcskCC2T9sY/wL65l0Ji+oY9p4ZDdbUV+rf RJJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786607443; x=1787212243; 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=i6jfhhhZuHoEagqts9zLHaHSMHT+KcdIgng4Kaw0dxhzY7iuKd+cjgL4OPGnozZu1x Y9Pqqq822w5gl1GtAJJG0IoSU1ug718rvQtcSrSRNPEagFjWGqyRCD2L6eie2gFwH+1f Shq36k/QMuFt0yNhAPLFhIE7g9paQltdKWd903z/RUYWDWYHxPcIhCTJADtjFc944qfZ RvOQGVl1c7mfQuINohn/144RTedNOVQfznuK/iy+1DQbasW+u0+yILQ7nHVGoSGv23Vn GbyeZPBeRlAGPJZNDjMh0L1rVykoqsllEG1kaAiT7VfPTl2lvXE0S/hZWRrgysZ0kczU Djgw== X-Gm-Message-State: AOJu0Yx0NC5jhqzXRjj6u7J0s+0GfI0CSI2GlLJM35rjC/r1US0VZ5/m 1G7KhrtKSglLCZEQNJ/VJQgraFwXHkfAbNk1PUy7J4JR9XCjGmkrCwtr X-Gm-Gg: AR+sD13ojds5k2kJ4VNLpPN7FmJcJzZkxQ+HOMTbqOX1gf7FA3aMV/7ho3PONF2lY8X /BwYA3/tpGd9CXwANW0QaeDgGWQrlI7LV01qwjNSU+ABEiJlOl96ySP8KXVL1TX7YPfz+AKhXY5 2aDs3LXIKJzVm8kYqjyDi6vViefcFtf1dBpVxlq1UH1uFxlaezcJtuVLT/wXwa6AywqqpjtBBIe 5mjOm7EqFtysAqjmxyCrX67BfvJXGATdkUk6mjSsBGAY82p8qy/UnxZDUh0HASUWMTTuBzjCNN5 qRA/rPzsfyCFibhjNrnkhfMgtKVK467AkDorJ2HrczUYiKisYTlsCgEjtRDm1IO4rX53QLmmSfx azOpJNdcymHJNSOuzy/iMVRCpQ1P7pPBgvb3gkJjcVgXg2svYGLVrJl9b0v1Ovxfy9dq/1Kx6S/ Q1pX9UAwefBhN4jLH7kDdeU8OnC+FhN+pcKLiSG/PaxPKxz5NvpRibkMh6Zf1zU4S+b1KOe39sy JNMECSv6taiP1E6kL8dvYNjQ5j93u/DeK8ofq8MPbf+IbRPXCkSVc1Q2tSKa68qKKHOHDHvQf4K 6wOCdpRkRrhriw1r X-Received: by 2002:a17:902:e5c4:b0:2ca:de3:15eb with SMTP id d9443c01a7336-2d388b7518fmr25969965ad.0.1786607442621; Thu, 13 Aug 2026 00:50:42 -0700 (PDT) Received: from debian.lan (n058152058183.netvigator.com. [58.152.58.183]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d37c40d6b0sm5550125ad.40.2026.08.13.00.50.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 00:50:42 -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 Chen Subject: [PATCH v6 1/4] mm: add page_counter_margin() Date: Thu, 13 Aug 2026 15:50:22 +0800 Message-ID: <20260813075025.1406585-2-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260813075025.1406585-1-xueyuan.chen21@gmail.com> References: <20260813075025.1406585-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) --- 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 Tue Sep 29 02:35:31 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 CA623438026 for ; Thu, 13 Aug 2026 07:50:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786607456; cv=none; b=pKvOq8lvBLvXrLAjWHt5iHCWPvSEhfzh/KRuCurN5j7boQXUbnsMHE7Ov7IU3WfEQ7xI3ISyb3hn05EPsD0hFKinAeOJCHZ4dzqnkypVWe52CbG8u5W0mcPA2NsFz6Jcem4gF/yxrg44ghL3zmx3UrRgAIU4hYAh36kqUJN8uus= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786607456; c=relaxed/simple; bh=Z2P/u8p2VN2KJWt6zvZw7BNx1xVUliqSH9psL0YD++Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Sg2LdpnlNWhMkcuipSyS6s7T9FSnkAXJnCxoGjvbWwQaOJ1iLMb8xohl5NMRCIXZw9qd8gcYSmxu4lHNTsWYd8PYATHeY+Y7A/XdrbjqWXp+PnI6KyKsLHXA7kst9/9LNqHxqj0AX7/9qYU5NUEH/vRCr9R/Ni06b0UgSvUXD+o= 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=QfnOmuza; arc=none smtp.client-ip=209.85.214.171 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="QfnOmuza" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2cecdc24b1cso3639055ad.1 for ; Thu, 13 Aug 2026 00:50:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786607449; x=1787212249; 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=QfnOmuzaLlOBfJSRQt+6wNtmExoJv0vM7YL9mHMqnjtzA6CzAZTjbv5yzMggdI58pG 5Eirj8cFraWRpkSUAqsToDYBhKmsDjuyHflXNTWcv68WU/+ltc4bRM1MyDbXc6ch4Z/x NhaNXeazH0FE399QHZThXznibpsENxkeY0/elk7YNWlYpFTKRGlvxquwxDdtF9IIdfJE DNqQf88HAkjhA8jI1KT7XBsZOJrV6fdmZNi9dWX7zBXYRmd+oLgtJzYMx5+IduOoL9k6 e6uoJL3zd/FvI8qUeBz8kWDM2gcBjoCRL2DaYtt/otPiOGC2MFjwxY0Vhw076kxwEi4Z h8Lw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786607449; x=1787212249; 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=pTTvIQ7FIQ5HM3X0p2TqClyVIKcmcRF6+TZ2CKNX2QMTEw86bJHP4sN92PZCj0QMLe jCMvB1aJAyxmqeAZpvD98vh2hjieKUu0aKih17Z9XqcC83Osr1TlonDWruPRAtH9/YUl tgYfXCnMrMvUXMEv0Rf5RRF3ZfkgszOK38hx0kV9k8QU0mSt60TETViN8yaCUQS76267 I7W5Ym9VBUwPDKBd39GoPzB/yzr17UZxGk+S/yWhGxD4Ic3/JLgdMrk74EmnGfvJORZY 1EcK8zmbSmcvYS7SG+ITSYUVBWSFjrYQw8ahvioDxkOk3nog7/k1aDmo9lws9F2/1u6k rRhA== X-Gm-Message-State: AOJu0YxVyy3YwuXgrRwNngVlhapu25+XrLuRkuHNiGiZFlB+Z8WiX+hb gesRt6Jg2Pw0jYa9IA4QbAOfdzobjmLcc5aenrx9ugKkqk+ocqax/3N5seSS6zxK3SlaVgAI X-Gm-Gg: AR+sD12Gzi1mBvgC108To1EzMIi+Atsa2a6RNMB0L8BhK0fLCUI1eeqP8OoXve2Xcwn aKBYw1DvH15l9Qz2e4gz9RGAb1bbW4rITYJ9CusqyIEaE9tNhnTRZECGYHL727tAXaKA8Is5ly/ i4q7Wb4zohhuCBT3s/hzbZ/wfE3yx+wLYds1TosqY1a+x/OA0efKO3CtZ0eQlut02FE0QLX0gya jvlNPyyrt6jc83QeKCwdUFaqOkrG/BOn7V5IgZMvZthRKXgxoX3PQPUJOw1IZGeW91cpN9eJJrc fgDSb4yY0b2AahcTv8HHyJed/8ORZMaUl7qom1zyGK9592ZxhT5b9IT24b7it4Q4njAXHsnw/hs W8C8n8U7JubQPr1ds4Gw7fPmhGaOS5NfnO/PPLx9pydvga1ZQZytydpDWHsG58tlr8pvR6MJC5v usLiM72uSQkP//RXptNMCxHoIdGnv8+zj1PSU9PVrvo0cwTOaltj3kpBqM7UZVw/PHuCK9gF8oF hwRapp/yf1vgtiLms1nJdfai7lEC63xluNOzEvBT/yh1H00UtKVc1PxisnDuTjvlcA7Qb6P7eGm ptYVepEbDenW+dKr X-Received: by 2002:a17:903:4688:b0:2cc:d6de:d58e with SMTP id d9443c01a7336-2d37f237867mr34765455ad.4.1786607449116; Thu, 13 Aug 2026 00:50:49 -0700 (PDT) Received: from debian.lan (n058152058183.netvigator.com. [58.152.58.183]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d37c40d6b0sm5550125ad.40.2026.08.13.00.50.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 00:50:48 -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 Chen Subject: [PATCH v6 2/4] mm: distinguish large folio swap allocation failures Date: Thu, 13 Aug 2026 15:50:23 +0800 Message-ID: <20260813075025.1406585-3-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260813075025.1406585-1-xueyuan.chen21@gmail.com> References: <20260813075025.1406585-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 Tue Sep 29 02:35:31 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 65263439F75 for ; Thu, 13 Aug 2026 07:50:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786607462; cv=none; b=CADpfTOhYK3CR/8lmD3X9KBZBhgISmoER3KVMQGm5ZG3q5dzZ7v1+7WZQ6SRkxECHwjhBzyZNFr2JyuDw/m1E1h3d/RRBK5ulYvW4/N1U8M+qRdXvsqvOB4oJwBiCNQyKVY5zI8nAmCF5JP/KxnJIaJdnbEzNfhHaG2MrsAwceg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786607462; c=relaxed/simple; bh=XaathRSrx29KQi5sCxP3i8qUQiCNwd8x5Hpg2To/nkk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BSmvTn9XDizvD3ieDmECYr/R4j7486ycR8PxfLUtA0ct5mvn1gOnT9wcybrTHMJr2z4BXIUnXwXw5YARfJhO/HixFwbXoOonpVzqraJ6XtW62hSca6RHHE4/sXQrcf1UV7K7gdnytzkeewBh+oaR+IKbManpkRn5cMonhhemxGI= 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=rfyWWZgr; arc=none smtp.client-ip=209.85.214.171 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="rfyWWZgr" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-2cffd93cdedso3056705ad.3 for ; Thu, 13 Aug 2026 00:50:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786607456; x=1787212256; 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=rfyWWZgrjxYy6a7hzh1BPH1dAWviFf/8OOMiZLoLzV3naUVLpsWbErSLtK1qmg4bWB AQjcqpsO605q/5/GzOvhvp0xUshJ/qKhTM2VkZdFsjxVjvdshQztW/C5lrVDH8N7WX7P 7Vynsu2i8qVCm3nHaQhWb4/gmcjBZmjsnHlDjkiTtEJdUroKKRnlgC0hK9X05TqVpB/k TMp5p87ud++D+FT05iyITkGBR3TppBD7HvSQm1jStGuGcAga9ObtUwevJhp3alQQ2X42 F+HdyHyPmA4j3h2aujg+C2XHreEnhPSll9JhyhiEgB3z/c8o7DtxxGulWU3H0cNXstWR Gplw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786607456; x=1787212256; 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=h8KKdUdZ57RjIBxdxE8d7uH9z3nkKDg4h7w7C817O3ef/aITkVyyZxYjpehHINZdNe YLFfwYKnKEDGXuBKqAE+fcX0v8ZsNvLtFFl4lrZvLkSl0+7Bnd0ME3Nm+w978+3fae68 HX46ypDIulBQOQWzkGeHCfXSVPisnGJcBvyD5mwBopcUqztYWx7BHrP869INQI8J8h4Z t7zo5Lu7q839n1LI2ieRdqCi9k/EPHZ6VSLgYZpt/dppSDvBcUyJt3Kt1lVq/gHEIu6L Mx2N6DdPHc9PrY97vCLVxgXAtpxYTbIJS5543vyAsJTBxsHlx6KWdSSlj5SAXO9ZKG0H Lurg== X-Gm-Message-State: AOJu0YzLIelPr4JoZvyld60klnEFkCOPetlKmGo9e04qrN2ThgUuLELI U7/+ePt9Mi9ZFoDxfiNNeFE69R9eBRmvid0sdAVx0UlkFenLgnW5/xOx X-Gm-Gg: AR+sD10CkoLYQz25dbK+HMnBw2HQvjyoKY6KOViLipDAD0RLc4RZ2s9V249fdvgt9JV PYLDxp61QM8m0a+JYm6hvbyjNPCwb+lxe9qOY5NAa7CjSMmnOzwzNuLxkSqxfe7Ah6YpAB5Exhv L6uxWpwXY85wmG8Ym8jRzt4fc22GhYkR1VBQvNerDzkTDJZbnLRXfs7ZDGK9HhWN3MFszhEeZqz 7py80ZJh9BQBZmtL3jP7QwNfWQYDaW//JsyzFkLlWr+temBcV+BDpBuaKyW6C65tV1wHZNGl7dw 6uUznq34fQRS/fHO0D9PPnDI2ffydWbT28QS1rWXKqG2zUnJ7dgOj2CldVJ6YFgNbttS26DNDQs RzknYEThD86UStLAWi/ulyr3jC7BzdJ02/zfpXEB5p7arlqNsGjvq41MZk5dbkfuzz6etWO57rr XOe4iMEWVFL1mK0vzBAGb2GSYvWbcCrS/GDGR17sV4Y8lynUaYzBgYiNGDKQTGmFhd1QtMo9Ciw 5fq53Sdik2j/x7Jh3O189YnPs2ev79JL02Smg7E/w39ExLs7DOqtxStZ0uwWPGJlYm0qH4oCMYf TWKD9o8= X-Received: by 2002:a17:903:1a8c:b0:2c7:ef84:c58e with SMTP id d9443c01a7336-2d37d53f7ffmr34359475ad.1.1786607456117; Thu, 13 Aug 2026 00:50:56 -0700 (PDT) Received: from debian.lan (n058152058183.netvigator.com. [58.152.58.183]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d37c40d6b0sm5550125ad.40.2026.08.13.00.50.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 00:50:55 -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 Chen Subject: [PATCH v6 3/4] mm/vmscan: avoid pointless large folio splits without swap Date: Thu, 13 Aug 2026 15:50:24 +0800 Message-ID: <20260813075025.1406585-4-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260813075025.1406585-1-xueyuan.chen21@gmail.com> References: <20260813075025.1406585-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 Tue Sep 29 02:35:31 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 57836340D90 for ; Thu, 13 Aug 2026 07:51:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786607466; cv=none; b=YTXS104htF4x+V17MvI9+aKdgi3XDImXBRaWAykWaXD74zVfsWLJmYnptoCfAc/nC+BCXOplJgZn836yaSrif2hvMnL3RFktH9xgou8YwRtm2TmWYFKLkOQtfc26IVYQrT/j4M/fCMj+ImA8gFkE0OGwjveOzTthX9guuWaiCn4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786607466; c=relaxed/simple; bh=jlsMADLwJ/8YxSz9rHL6HMJ91PlPCeP88izjFdx/g98=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XYK/5Vq8hNSoGOUrlykdBPkX7h8OUJ+wqMC/9ayx9QP5qtzsqE8udGcA/e9mDN+kKEPuhWo5PSP2QFW+9DM2E4cbBAk0nzcYgeI/1p1s4dbjyjxzTVWFECYIi/tQmqxO6eqoqvI/fw2sZGqtTr8BxyUpAFZFObBWyPYrLEh7Qwk= 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=pNjXJjxR; arc=none smtp.client-ip=209.85.214.177 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="pNjXJjxR" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-2ccae46de39so3380325ad.3 for ; Thu, 13 Aug 2026 00:51:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786607462; x=1787212262; 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=pNjXJjxRevRNPCQHBZj83wnTWvpLCqOKOGkLNOI18DacrxHc3xnf1HzUA1EO4PNcym lEFNpfSoqNlwnAI/go33H/vEiFu1CmYFmOI549tFbKUTynD/gvSQdrVxVARqf5+Oy8PU rlkMUcJ0QdsCGESHCQErPQBeOBLTSmLGF386AT83FM4p/rO5oBpMk13I3HudNXHHkGBz UqP24KXbYX9nZ7ug6kOFoPDlMQejjjkVryjLhPwYnKa4ljz3nowx8TRdjI55vxtpZNIo AsYf8RyPVGdfF04AVGUBM8/ZcElpBeaVKA7jw6bsvSx0nrcBLKfIBvlvTSF/9arb6nEY j/4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786607462; x=1787212262; 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=ZybIxFiCZM2ZcgbiN6ZqPxehiNf21tZVtXbfJs0CIU3oAvax5Dgtem0vUyg4efMWzs HnVutItonuCSOhIxyoAjgUKrIJqrEvf+iNpOEgyU3W9jajsdW8OH6v8wK0At6PuRm/kO Xq+R16M47yuRJ+vyAS5t0BDMTze80wKyfFiWUBaiwgSa9e3xbrz7VXQisvU9YatPHjJg 9D+y2oZuQ/w/Vnbcahe7QZ/+X1n5MO4a4M25SsTOlIYU8qCVgQHJzTuwnyqT30t/ovsi R/xgYNeDcsWWQ9ke5epdAoz0guSDg7PZ/IacogE+2AGltP8syv0o0IEsJEncgMkirFz+ 4/ww== X-Gm-Message-State: AOJu0Yx7Urc6/TQAWte0lKG2lMYXwdGt19swmpF3FpYM8i2Tpb6kOlEI PvhNmJRKZmdQ9bbqHCSt/3sPSwmhRBopuEkDdKzvv1IYSmxVDtTGcWsI X-Gm-Gg: AR+sD11XufE3Rg9P4oMehpr1kPr7B5E3HLUqRhPc6bR/ctSrLSkWOmHrW3hyEEAWzs5 ttNge0bqa33Xz7MC9Ozj2aOt62z1LfaIp64e1BAxP/2yaTalMtB5vsUKYhZlWxCM+wMwsKrCKGp B472SKCDxE043X/1jAzLAM/AATipk6IULFoNFP3oZU4qFFQbAxyHc/QxfCGkPO1jeY+7IyEaHz/ KzaVZkF1EhNqA99g1CVy+XteXZitXRLPAtSUUzTdgyEX9v0EyQsJSmBciaxsecnGmpF6BNpJtmJ +EbLD+qIbBWP2QQKs+ZyGLCzE7XiiPoXOlEnkL2MUKgfc0CnBP+yidFDtufTb6DQ/+ccs+WqbC+ vYp/1qj1yn95dycSPqbcjV/QcBHlYwjpO4sFVhrndsl12Iw7rlFCj/vH0LJm1nEUj5C4z5z0bWa 3oLL3OqXfND+dJzsMKSMnB2THPBtQe5xZ8peTXzrM87EGt550UbrKBUJhAzBJdaUOIt4/4Ek1rz 5yClUk1eNsyV7nvCSieFyqQS3XR5NmORAcxiB/+WxqhbhHbiH4BC+hzYe8T9nraoJViuV3/cB0m BjFnUw== X-Received: by 2002:a17:902:fc46:b0:2cf:9e90:8be with SMTP id d9443c01a7336-2d37efb393emr33092015ad.4.1786607462232; Thu, 13 Aug 2026 00:51:02 -0700 (PDT) Received: from debian.lan (n058152058183.netvigator.com. [58.152.58.183]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2d37c40d6b0sm5550125ad.40.2026.08.13.00.50.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 13 Aug 2026 00:51:01 -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 Chen Subject: [PATCH v6 4/4] mm/shmem: split large folios only on -E2BIG Date: Thu, 13 Aug 2026 15:50:25 +0800 Message-ID: <20260813075025.1406585-5-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260813075025.1406585-1-xueyuan.chen21@gmail.com> References: <20260813075025.1406585-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