From nobody Sat Jul 25 05:17:38 2026 Received: from mail-pg1-f178.google.com (mail-pg1-f178.google.com [209.85.215.178]) (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 D1BFB39CD1A for ; Fri, 17 Jul 2026 12:25:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.178 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784291138; cv=none; b=IrgR3iO2REgEgLr74ITg1iwMlaFWWalclzLVDCpE46x0mqgaLQS1zzr6fYdbFQ+401RKnRZn3a2+XcViH560UpiVxyKT0LHRk5uu/JbM/7dAHcjCJ1t1eNnGyUC28Lx/9h1G34JWJrxTJML/KVKV4K/2OUA16LbjmElVRCsyjbw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784291138; c=relaxed/simple; bh=nNPnbebxFqFvlbhtNKSssD58ich+0e+YV1xULpS8b9A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MwschKIkdQQQ4XN3wVT3IxzffLE0CPHEEerPlmiYHK8nePkC/Q3dDMvHHVuQRJW/hGcxzUESiE1PFiwEcPsY+TBzzLPoC8M8ng86d2+U1i46uTtnqtoQOiGyEhQEwb4VxO+atC6vnWrwKsZCpdcPIaNCohSiCkS+YWmwAcvWhI8= 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=nlFN/P19; arc=none smtp.client-ip=209.85.215.178 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="nlFN/P19" Received: by mail-pg1-f178.google.com with SMTP id 41be03b00d2f7-ca6bda96134so451843a12.3 for ; Fri, 17 Jul 2026 05:25:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784291136; x=1784895936; 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=A8FQitk+4ag8anobMv4zmmc0PaWJJPYKVTqkunfaASE=; b=nlFN/P193WjDPIHvCUq3bneqkOmfMATCFIASffNjFa/hGB4D9zWhxYbAAKPJRL2jyi aRdQw2Afs1m/cnrlgPf/lUCquvRIMSzIjzEIDEXeGPUidxD0VrqnXkRBdFpwkr2rONJK S5TyopjWZ8Bbyq+LsyyAr91i1jxoZmc4P6u/lEZUrWA2IoibjKWxvZ4N9XNig+w+qlFh dymcWBMkWeqZUqggtz2r271+o8wYFDC7oCxLnmnf0JeQHAZP9S51q2F9Hesjk0p5TTfA i5lMyKY/Rlpn37uUpbseSr63wgB5Obb8N2wcyFxJVFml30uQk2tUveIzG39IiHN5MQBB AyfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784291136; x=1784895936; 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=A8FQitk+4ag8anobMv4zmmc0PaWJJPYKVTqkunfaASE=; b=SJw1HmD9OEY9ah93eitcGLnW5KntRblC5/TOoUle0krJvYJbqRKrYHY6m6JsabG95f 8txAvp82ryCprsx8CSwoC+3kY8fQtViwIZcgphtAANZAjuREbrmhMYRzq4pv/vNfif0R 7rDyGRfCFRovHaTgDf7+Vdc3lV1toAvJMss7gnSMst4pAsmGpNA06qc9v9B7eKlrYXuM iryotoSoU8cZSTTZcHz8Elq7G5ThIOD3C5ykeMFYl8s1latHvnk8ZL2DocHcvm2Vu9Es 8pQp4EawBCo1/pjBiIkbuBXe3VP8XgOuPIXwlSpzP0csSXQRN8/t8g9y30K+Qi+Mk+mj BKoQ== X-Gm-Message-State: AOJu0YxD5aHDb6/TvOd6T1rSZwAdJpWY8TilPjQny7mdlbjpt7+hV6KY rJD4n4wK6HPBYSmH/0yYbW0PPzP6JV0eJF0shsO5Cg7myQHtE/HahnJ/ X-Gm-Gg: AfdE7cmk4/VBJtEWN6GvyMen5A3/E83fR4c6dbX84aNm2mkeh6OEhJfY0fMd4Q5CMAt djYT+eXxDtH4zhFmsfby81eYRr0XEDEAC2IzaTtlfQl5ydh93S1CKEuxYcAQtKIWm0vgEsRxCFc 1ixHpqCDtaxiadNUuyDAn4/MVMk+/T6PWPfC5fI9lKGX36TxLLepiO+FHXV5348bLd5R7f4AAOG RDEMN0KUrWNxz8rMedH7izxrNkoD0oLrs/z0NY6OF+1S43KbpaxxpXB4WKT59h/90Ag+1t7tfKH 0lcl8YPxDWWejaSf3mofsEFLdeb2VWjfOaeVNe2LRj8b3VnUhrkHbnPbX94WFojGZCMC9j8g1Y1 N8Nki7pukFxNwnszayHejsDu1duCgcCQa5yJqBvydJ2gYAEyCPqZfE6Dvn/BOXi+uQSYPYCnqNj rW10GOMlzrjr9GoKaPMiJy+dIYfpE5JHbJRuDU0VOoroQ+kVX6TP9tURM= X-Received: by 2002:a17:902:e889:b0:2ca:d9ec:3217 with SMTP id d9443c01a7336-2cf349c0b89mr20319995ad.7.1784291135912; Fri, 17 Jul 2026 05:25:35 -0700 (PDT) Received: from debian.lan ([240e:391:eb4:a240::1]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2cf347119dfsm9935955ad.56.2026.07.17.05.25.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 05:25:35 -0700 (PDT) From: Xueyuan Chen To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, baohua@kernel.org, zhaonanzhe@xiaomi.com, hannes@cmpxchg.org, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, chrisl@kernel.org, kasong@tencent.com, shikemeng@huaweicloud.com, nphamcs@gmail.com, bhe@redhat.com, youngjun.park@lge.com, david@kernel.org, ljs@kernel.org, liam@infradead.org, vbabka@kernel.org, rppt@kernel.org, surenb@google.com, qi.zheng@linux.dev, axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com, baolin.wang@linux.alibaba.com, hughd@google.com, Xueyuan Chen Subject: [RFC PATCH v3 1/4] mm: add page_counter_margin() Date: Fri, 17 Jul 2026 20:25:11 +0800 Message-ID: <20260717122514.51514-2-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260717122514.51514-1-xueyuan.chen21@gmail.com> References: <20260717122514.51514-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 --- include/linux/page_counter.h | 1 + mm/memcontrol.c | 9 +++------ mm/page_counter.c | 17 +++++++++++++++++ 3 files changed, 21 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 177732fef010..1e10f493d2a9 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5548,12 +5548,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..7300dca90632 100644 --- a/mm/page_counter.c +++ b/mm/page_counter.c @@ -46,6 +46,23 @@ static void propagate_protected_usage(struct page_counte= r *c, } } =20 +/** + * page_counter_margin - remaining usable space within hierarchical limits + * @counter: counter + */ +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 --=20 2.47.3 From nobody Sat Jul 25 05:17:38 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 667A03B3C1F for ; Fri, 17 Jul 2026 12:25: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=1784291148; cv=none; b=DDDkC6T+jPMXRRLdhQX/Ca+442wubAr6eguHpxZTkWans2lE67w13Khb2+5CQMzsuuZGJXjYeoDJUz0LmVl76g5hzfb44GbAhNCs0GDundVuRtaHh+Mrn8sJNYvJ5/8i8+KOa27AuE2i/E/2uC/ACPWrlk6eXMXGCO+EgyYK0r8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784291148; c=relaxed/simple; bh=Fjfc8fgQPzeyzhc9k0VdSPjgLCvAlCl42eml0gPXRh0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MD0qSPKScgqTvzDHqOCBOdLcwaH+Us4K9srOIcgsblyRR7h17iPym53E3ljTPIJXgixFn2LXdTYTYl0BdktBuaqHZO8LUaAv8vanJutFse9slIqaE77nqsHT2zve316c31cLHiDc/sgX+S22AYSgEqpG/9m2owPFJpbGuAib8Dk= 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=Hm7AGdLr; 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="Hm7AGdLr" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2ccdce28edeso13521205ad.0 for ; Fri, 17 Jul 2026 05:25:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784291144; x=1784895944; 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=NdpVmifpRBJ5SJh8r5+PpSs+j8VMT6d4fWNM6qfZmYA=; b=Hm7AGdLrPtEZ5HxLlbebckgrO8ckUmPIeB7yyD8zfyF+8dFm3xbhyaRYOqBA4tsKLb jRRsv+fGE/ocB7HjGXVNP2FXFKFf7FmiEEJ00cLhbnezZZ0H/PmbwWV/b/+jbmBWpacq KRMb2wGI89vC/Gj06dXc8VyrbxFeoR4oG8eA4KzRfXBj+rvFpWkw66EYI+fSDY/FknKt jv7Cay7t9HyqxyviAafp+6FG4zh3wuU3R7Xv5LSLgwcWwIwOdvCKg26JF8ZNMtxxJ/fd fRCgbph8pUWz7pcJeYn+Ew1wZv0caVRLxsrpvA9q1J+HSbKd7tYadBWvvsxa2zlS/2va toSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784291144; x=1784895944; 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=NdpVmifpRBJ5SJh8r5+PpSs+j8VMT6d4fWNM6qfZmYA=; b=NVLXORTecWaYYw6sYwOnkfiAfSIRd1BFDtyvmI43aI6LMlMqkvEo4XJ7E8wRjt8k75 BYdlKsT+Bd1Ugc7wA/96qToTVfRgEoLMaVPaP3/QAkwY5NYwj1fasmRu6Mtcppq7yj7a g4IEheS5anxXWC+nHYpKOsI25IJU+EdQyoD3+a9Se05PREGtCVMbuCCBSpjpkNu4F98g y/mUMAMPnJ2VYnc49ScYib2ax10jOT3f4vpToXBgqKYflKJnq4CqkmuZuPwolOB2cEdn lb/x5ZXRG22YY4Lhzp9pUj3ULFBryl0eD15xTWP7cOtAisEFFXzjWMAkaH6tEdFnga9F 0yjQ== X-Gm-Message-State: AOJu0YxYweSaXwKB1nvB6a1xT49F1ZZq71PBW7OH89NnIvfHiPwYLj3S ++awwajoKiTOXIyG+uqIoovN4mzu7OmLVs8v6paBKpvGDiGU4bmtHwsx X-Gm-Gg: AfdE7cnulWJie5vaWJJG0cYmdjFjgYffWQ8qwt/GEoRUm4nvt91ePDtA19UcRUj/3fC jIm0OBRfmoTwcOE+W9Yj8qDw7OyfZW1aW1B6HXMQWLf3Flyph5ae3jc8HQY8dmsc+RvuVdov0oA cknBNkTX25V4L7L63sYi/+cNDskNF3/zs5srnr1XnjtaWPPA/mCUcLBvSo9HwHESfVwvv9R7pij ZBYUjMgZ/m9fngXzw0qU6pZLuZ9IRwrZr9aL671Bt3UXWPDVq43Ijt96JJwR9/gSxMz7PD4g1XU nnenOUJw3xQy8mhpAnA93dRKb/ihuGf+IkqtTJwM2NwSU6iQpJNH5BqlLIBj5th8Q4KgAFqxKmH oORaAvymBF9N0B3TAbaz4B1ZS0d4j7dOh/jKP6/f+8p7kuDQ0fn6V0IcPsemMI/qKMu6k+Wab1C 5PwOCkQvGiZcvCgGWoI8EtCNhDekVr14t2D/UfAugmftrB X-Received: by 2002:a17:903:41c4:b0:2ca:11ee:b002 with SMTP id d9443c01a7336-2cf349faca5mr18400775ad.5.1784291143790; Fri, 17 Jul 2026 05:25:43 -0700 (PDT) Received: from debian.lan ([240e:391:eb4:a240::1]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2cf347119dfsm9935955ad.56.2026.07.17.05.25.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 05:25:43 -0700 (PDT) From: Xueyuan Chen To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, baohua@kernel.org, zhaonanzhe@xiaomi.com, hannes@cmpxchg.org, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, chrisl@kernel.org, kasong@tencent.com, shikemeng@huaweicloud.com, nphamcs@gmail.com, bhe@redhat.com, youngjun.park@lge.com, david@kernel.org, ljs@kernel.org, liam@infradead.org, vbabka@kernel.org, rppt@kernel.org, surenb@google.com, qi.zheng@linux.dev, axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com, baolin.wang@linux.alibaba.com, hughd@google.com, Xueyuan Chen Subject: [RFC PATCH v3 2/4] mm: distinguish large folio swap allocation failures Date: Fri, 17 Jul 2026 20:25:12 +0800 Message-ID: <20260717122514.51514-3-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260717122514.51514-1-xueyuan.chen21@gmail.com> References: <20260717122514.51514-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 allocation failures with a generic negative error code. Reclaim cannot tell whether splitting a large folio could make progress or whether there is no backing space at all. Track the global free swap count around the allocation attempt and let the memcg swap charge path cap it by the remaining hierarchical swap margin. Return -E2BIG for large folios when a smaller allocation might still fit, -ENOSPC when no swap space is available, and -ENOMEM when the failure is not helped by splitting. This only refines folio_alloc_swap() return codes. The reclaim caller is updated separately. Signed-off-by: Xueyuan Chen --- include/linux/swap.h | 10 ++++++---- mm/memcontrol.c | 10 +++++++++- mm/swapfile.c | 21 +++++++++++++++------ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 7a09df6977a5..0695ac56457f 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -571,13 +571,14 @@ static inline void folio_throttle_swaprate(struct fol= io *folio, gfp_t gfp) #endif =20 #if defined(CONFIG_MEMCG) && defined(CONFIG_SWAP) -int __mem_cgroup_try_charge_swap(struct folio *folio, swp_entry_t entry); +int __mem_cgroup_try_charge_swap(struct folio *folio, swp_entry_t entry, + long *nr_swap_pages); static inline int mem_cgroup_try_charge_swap(struct folio *folio, - swp_entry_t entry) + swp_entry_t entry, long *nr_swap_pages) { if (mem_cgroup_disabled()) return 0; - return __mem_cgroup_try_charge_swap(folio, entry); + return __mem_cgroup_try_charge_swap(folio, entry, nr_swap_pages); } =20 extern void __mem_cgroup_uncharge_swap(swp_entry_t entry, unsigned int nr_= pages); @@ -592,7 +593,8 @@ extern long mem_cgroup_get_nr_swap_pages(struct mem_cgr= oup *memcg); extern bool mem_cgroup_swap_full(struct folio *folio); #else static inline int mem_cgroup_try_charge_swap(struct folio *folio, - swp_entry_t entry) + swp_entry_t entry, + long *nr_swap_pages) { return 0; } diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 1e10f493d2a9..7c9e7072fb39 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -5472,12 +5472,14 @@ int __init mem_cgroup_init(void) * __mem_cgroup_try_charge_swap - try charging swap space for a folio * @folio: folio being added to swap * @entry: swap entry to charge + * @nr_swap_pages: optional swap availability to cap by memcg margin * * Try to charge @folio's memcg for the swap space at @entry. * * Returns 0 on success, -ENOMEM on failure. */ -int __mem_cgroup_try_charge_swap(struct folio *folio, swp_entry_t entry) +int __mem_cgroup_try_charge_swap(struct folio *folio, swp_entry_t entry, + long *nr_swap_pages) { unsigned int nr_pages =3D folio_nr_pages(folio); struct page_counter *counter; @@ -5495,6 +5497,9 @@ int __mem_cgroup_try_charge_swap(struct folio *folio,= swp_entry_t entry) rcu_read_lock(); memcg =3D obj_cgroup_memcg(objcg); if (!entry.val) { + if (nr_swap_pages && !mem_cgroup_is_root(memcg)) + *nr_swap_pages =3D min(*nr_swap_pages, + page_counter_margin(&memcg->swap)); memcg_memory_event(memcg, MEMCG_SWAP_FAIL); rcu_read_unlock(); return 0; @@ -5509,6 +5514,9 @@ int __mem_cgroup_try_charge_swap(struct folio *folio,= swp_entry_t entry) memcg_memory_event(memcg, MEMCG_SWAP_MAX); memcg_memory_event(memcg, MEMCG_SWAP_FAIL); mem_cgroup_private_id_put(memcg, nr_pages); + if (nr_swap_pages) + *nr_swap_pages =3D min(*nr_swap_pages, + page_counter_margin(counter)); return -ENOMEM; } mod_memcg_state(memcg, MEMCG_SWAP, nr_pages); diff --git a/mm/swapfile.c b/mm/swapfile.c index 9174f1eeffb0..53a921ca099a 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1690,12 +1690,14 @@ static int swap_dup_entries_cluster(struct swap_inf= o_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 swapout, + * or another negative error code if splitting would not help. */ int folio_alloc_swap(struct folio *folio) { unsigned int order =3D folio_order(folio); unsigned int size =3D 1 << order; + long nr_swap_pages; =20 VM_BUG_ON_FOLIO(!folio_test_locked(folio), folio); VM_BUG_ON_FOLIO(!folio_test_uptodate(folio), folio); @@ -1706,7 +1708,7 @@ int folio_alloc_swap(struct folio *folio) * the caller should split the folio and try again. */ if (!IS_ENABLED(CONFIG_THP_SWAP)) - return -EAGAIN; + return -E2BIG; =20 /* * Allocation size should never exceed cluster size @@ -1714,10 +1716,12 @@ int folio_alloc_swap(struct folio *folio) */ if (size > SWAPFILE_CLUSTER) { VM_WARN_ON_ONCE(1); - return -EINVAL; + return -E2BIG; } } =20 + nr_swap_pages =3D get_nr_swap_pages(); + again: local_lock(&percpu_swap_cluster.lock); if (!swap_alloc_fast(folio)) @@ -1730,11 +1734,16 @@ 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, folio->swap))) + if (unlikely(mem_cgroup_try_charge_swap(folio, folio->swap, + &nr_swap_pages))) { swap_cache_del_folio(folio); + return order && nr_swap_pages > 0 ? -E2BIG : -ENOMEM; + } =20 - if (unlikely(!folio_test_swapcache(folio))) - return -ENOMEM; + if (unlikely(!folio_test_swapcache(folio))) { + nr_swap_pages =3D get_nr_swap_pages(); + return order && nr_swap_pages > 0 ? -E2BIG : -ENOSPC; + } =20 return 0; } --=20 2.47.3 From nobody Sat Jul 25 05:17:38 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 788A93BFAE8 for ; Fri, 17 Jul 2026 12:25:53 +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=1784291157; cv=none; b=WiXCd66Xc6QnazuApzPpuLHqr+pQ/hoz3qUP4suHf743r7F1Eq6wVbsB5ii13qJ+gaD3EpgMrDX66faeaYpLvJwtTQg9Aatd54J/2QRp/fnx4PMJAEmFb24FlTgq/2c3ghI6boq0+Bm/BWe/MqupBfvg93Udf825B7Zij8CowqA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784291157; c=relaxed/simple; bh=2aWhzNwCb1BPCutP5oLGQCez7hpPKAKMLp03Caf1XA8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NbutPwIDOVkcXV74n1s0guvLe2XKGFb4e8GcPN5HSYns7cJspqpEyVCa0br3+9eJujk7p9kpOu9BRLpH/zVFiNd0wmP6oOurMVUUrLiL88qwtcllf/5g0nl9IXEytlUQFkbZw8KHPpiZvw0P+jozYL0BskUusXG1XwG418FfGyE= 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=ljbm+NDx; 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="ljbm+NDx" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2cecdc24b1cso7624035ad.1 for ; Fri, 17 Jul 2026 05:25:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784291152; x=1784895952; 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=TomD5kQp4QDVC9gWt3p58S/rBPFQXp4PWIaI11lLUvQ=; b=ljbm+NDxp2Ve297pyq8DLLHe6Ax4IRi9VHeq/WLyf+XAHGegomh6sN0CNhq83rsY4j OqfWbE1alXJMxHlrgWKlli6row4hhD1nOXiKGB82bG9XWDfKo/VA5klboyhBULB45MT7 UbC4oJgCZd5XASw3vSawAQ2l1i+8UnRc4iI8K8pwFqpAp74NtnZdHW8BhAaf00QKr98q tsS1KhgYtXgxMik/f8BBAIit17gnHsnDyFfpXHQbgu0u6dAChnxd0lSUF/LwAZPoUoXH durgplNqv6pMPhF+P9joJ/zxOAkPwFJtceuruLBvod9XTcm0VgrkQyiql1ypTBtl0U6C A/6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784291152; x=1784895952; 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=TomD5kQp4QDVC9gWt3p58S/rBPFQXp4PWIaI11lLUvQ=; b=cRSROzqasRuWT96k1+tTQjoh66jzhfOsU8NhOkkCnr6p6yiqsTXgf0bOGQqb2HAlMP kEnaf+5gNSqxKItCH8mVRam4JbcZ6dMlIPAlQ4FZHU3yyQZIk32c/7HyoK4P6pBB7ZoB K4SbkGcKvCqYaH+A4NBziKrC5l6dscx0FvWzwbcshdc8fwVzpWePagvEC4Guc6V1PSPN TY0o5VqKpnJ4lfuXeTNrD4lBqdCAdPeGvS4FKtxzAelPyqw/lZogRIFIWv005bthme+O XvAQKL4pd2r1U9RTC4aMpo4tP047nxxy7j+E/SwemZG7P8ssYYd8bCxt7nk+veWOTpIr 7OuQ== X-Gm-Message-State: AOJu0Yy4idCwnuS3+vB8s6xelizpVaKm/0KUsxH/WOqNLlFhMJPoIu1D YwaOLpEzevT7uI+g1XEB5Unnczc6LOLbl7m7uM+D+I7YNnZbuV5xg5LC X-Gm-Gg: AfdE7cnc7IRBxtb5HDYBf00PYUZcPEf78py0Rojp4O8zaeRpwR9Zac3aguhM6xJs9RI MqbwZlrUQs3KQ1H8w9Gw37HkvB95qfyO86nvBcs6MgiLc1Rwh9PUeDwv2hUHAB8lEkrMQcYe/jr cF9nbp2rT2rMUONIBgfHOp6+05f0h1/3OTEvZHhB5HankSV0IZMSSBU36d/pCC7SVmd5YYgZDak 9wgQojdZlbxDZ6h88xL/LTvEr4A5EDY8qXK913oZkjCc1TXUBn3/KotPqxOfwu9deZ2kmIZ0IKk ly2kgK0j+v3MyoymAttrwUzixKMbMCapImP3L4CFSEbbjRWEkYvIUNcoMLUN8nhSmOOa/2rEdve ZegTrjYksN5ZRBz83Xo5J/USjGZG55zcSMofvoj1Z1H2GGlHKZAdSnCD20YScdyploqLRTaQYvc 51QRs16ZoasRcUD5Pd1+O979cG50bkL87c4hzKGLIktUCN X-Received: by 2002:a17:902:f686:b0:2c9:d8c6:1db3 with SMTP id d9443c01a7336-2cf349c0eedmr20955805ad.8.1784291151963; Fri, 17 Jul 2026 05:25:51 -0700 (PDT) Received: from debian.lan ([240e:391:eb4:a240::1]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2cf347119dfsm9935955ad.56.2026.07.17.05.25.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 05:25:51 -0700 (PDT) From: Xueyuan Chen To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, baohua@kernel.org, zhaonanzhe@xiaomi.com, hannes@cmpxchg.org, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, chrisl@kernel.org, kasong@tencent.com, shikemeng@huaweicloud.com, nphamcs@gmail.com, bhe@redhat.com, youngjun.park@lge.com, david@kernel.org, ljs@kernel.org, liam@infradead.org, vbabka@kernel.org, rppt@kernel.org, surenb@google.com, qi.zheng@linux.dev, axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com, baolin.wang@linux.alibaba.com, hughd@google.com Subject: [RFC PATCH v3 3/4] mm/vmscan: avoid pointless large folio splits without swap Date: Fri, 17 Jul 2026 20:25:13 +0800 Message-ID: <20260717122514.51514-4-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260717122514.51514-1-xueyuan.chen21@gmail.com> References: <20260717122514.51514-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) --- mm/vmscan.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index bd1b1aa12581..40340a88f78e 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -1260,6 +1260,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)) @@ -1278,10 +1280,11 @@ 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)) + if (!folio_test_large(folio) || ret !=3D -E2BIG) goto activate_locked_split; /* Fallback to swap normal pages */ if (split_folio_to_list(folio, folio_list)) --=20 2.47.3 From nobody Sat Jul 25 05:17:38 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (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 6183C3F1AB6 for ; Fri, 17 Jul 2026 12:26:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784291164; cv=none; b=Fn8w6dR3LGgWv4tYmxG/xOUEw7Svpi7jqjL95ObB/yszHODIvqKh4bwfmVMtTA9JHbV13BIrzHGJpXgLJ0U1CDtl7jVMl7qEvUR5WrtzEkp81bTUlMlTBBcH5Eu1xUhO4tXvVjE0Jqv4gLdVVckA5KoiwIgwxdGarXzETozhqBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784291164; c=relaxed/simple; bh=IC8gzWzxCsIar3IfwGi+djNUC+FAXYvXRt0qdcQ6O8M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DIPYemcJBWzr3Ax96f/TmRGbswG1Yij/VIcjOS51ZiJ/jlBUqvBydhzQ7FDchH3WbOZ4jwhSTCDPCUVxS6ooRqz0EEumaxKyQbdAppYhk/gB6P6SHYKwY0C3S/anTBafg2Iqj0/qqo2B7j1TZ7le2I6xjYBR2RLdDZPFg/HbnII= 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=fIAujvwe; arc=none smtp.client-ip=209.85.214.179 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="fIAujvwe" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2ceeee8c46bso10022075ad.2 for ; Fri, 17 Jul 2026 05:26:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784291159; x=1784895959; 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=H4y0Flvk61D5jK2+voopkUsDY0AemRgTCBdod4M2Kx4=; b=fIAujvwe/u1pvCc8Gmf3QYvSQNtK7FTDI5FiBWFhYoNV/xcM/29xEKARWpaijAfSH0 BNBu0cVXbDPyMzb3JTpQ5/BdeLXVx2gTAHp9cfaNRxFAAknIeEaHqRm9p0ri1IW3NxJE swBWsOIW7zpgxdO4kVgXcIr0Ow5nByQlZix6B1TC5bEBTXAqHxTmAXfja7/8YUj4/3/H UFC/XzD6k62vaByvr3YovcwNvC2zm/xK36qs1y63soNf07kmTttWc1VEerIBsRI08oOj tL1icAKyKd6rEL1GYpzMfhgtkHMrwIdNT5EU2454ruhv1BHg1/ExzdX10FwY7AgE2edu gZYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784291159; x=1784895959; 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=H4y0Flvk61D5jK2+voopkUsDY0AemRgTCBdod4M2Kx4=; b=q5Yyl2vCtSQYHoGHK1+dwE8O4Qlza5K95AH6PAFTRp3KAuoydaR7O2Kv+5SI/pfIjg Qjzm7PXRoUS7sCK5mErQKT6EPWjUJlrWPg0rp34H5vZ9yVVjIFF7R+thr67peva5HdmH ferCMqlIUJIkmgMGrpr5UzoSAF/GmE8kSwzXYFYG3hml8KcGb23c38oEYexFRLW7dpzn aevjfBr5Cbi7DyO77irkIL8sdRSmixercuYy3bAo44JHtElWlu568d0k9rmFiwMG9vRt 6RPrY94RkgOEcR39I1EXwwRguoe5LeD6ZsPAYuIIQ4/9IWHJHExOy24x3pA3MX+4igZM sXXA== X-Gm-Message-State: AOJu0YzyFOPrdovt1dvshY34rh7wFtlbHYUq7bHQUY+QTeDXuQO9xwGg BGRkuN/PGM5tlgfsNn/iBv0eqd5eJrcTrgZDKgNYlMaqicKMpnUpM8Nv X-Gm-Gg: AfdE7cnkUqGDwoM+0PFnOBsVbt0XWaXMBnqg81Vggg6p0Zfi6F8Q2SVSRdFb1aAi1gR vIcM9+sev0A++cWNiPhj4UKWxYXXEsOUROK0zFkrCY2pTcf/EnNVki/UL5TrZMip0AhgbipZw+d 1eUnw9Ylr3ctUB9Y4+KyHmsJMiTdy6Y7LeBVEv+d2RU1OKGGhJeZMHpSkPmcPbjPqcGTRdYvrQv 7PM68WcN6DBGb0ssFo+Bqlhd+7dT8kFBYc1NKqjn5liLSEMRBRYfrVfBMr35I7dFHUjWHHJFvyN sc/tYXBjgBlLhGuu+5RG9ELKC0agGKnF7mAr4jMhaBuFSQu+ANBo8oRUtJcy3za5NVgbj5c/kHZ EoMeAOATvQLVAxGMI3cVlVbwkp7ER11e47ZKtYrp7rYwe/XVHaWdTQEge+Hh77XRUbWKYYVuUse hzEOfAdGHLZ8Fxsc2urq131/v/jmIz/g/vgy9/Uptk296g X-Received: by 2002:a17:903:2f04:b0:2cc:9d9:b8df with SMTP id d9443c01a7336-2cf349c9761mr23369415ad.5.1784291158894; Fri, 17 Jul 2026 05:25:58 -0700 (PDT) Received: from debian.lan ([240e:391:eb4:a240::1]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2cf347119dfsm9935955ad.56.2026.07.17.05.25.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 Jul 2026 05:25:58 -0700 (PDT) From: Xueyuan Chen To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, cgroups@vger.kernel.org, baohua@kernel.org, zhaonanzhe@xiaomi.com, hannes@cmpxchg.org, mhocko@kernel.org, roman.gushchin@linux.dev, shakeel.butt@linux.dev, muchun.song@linux.dev, chrisl@kernel.org, kasong@tencent.com, shikemeng@huaweicloud.com, nphamcs@gmail.com, bhe@redhat.com, youngjun.park@lge.com, david@kernel.org, ljs@kernel.org, liam@infradead.org, vbabka@kernel.org, rppt@kernel.org, surenb@google.com, qi.zheng@linux.dev, axelrasmussen@google.com, yuanchu@google.com, weixugc@google.com, baolin.wang@linux.alibaba.com, hughd@google.com, Xueyuan Chen Subject: [RFC PATCH v3 4/4] mm/shmem: split large folios only on -E2BIG Date: Fri, 17 Jul 2026 20:25:14 +0800 Message-ID: <20260717122514.51514-5-xueyuan.chen21@gmail.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260717122514.51514-1-xueyuan.chen21@gmail.com> References: <20260717122514.51514-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 Signed-off-by: Xueyuan Chen --- mm/shmem.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mm/shmem.c b/mm/shmem.c index 3b5dc21b323c..d76812dd3cef 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1599,6 +1599,7 @@ int shmem_writeout(struct folio *folio, struct swap_i= ocb **plug, struct shmem_sb_info *sbinfo =3D SHMEM_SB(inode->i_sb); pgoff_t index; int nr_pages; + int ret; bool split =3D false; =20 if ((info->flags & SHMEM_F_LOCKED) || sbinfo->noswap) @@ -1679,7 +1680,8 @@ int shmem_writeout(struct folio *folio, struct swap_i= ocb **plug, 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 @@ -1732,7 +1734,7 @@ int shmem_writeout(struct folio *folio, struct swap_i= ocb **plug, swap_cache_del_folio(folio); goto redirty; } - if (nr_pages > 1) + if (ret =3D=3D -E2BIG) goto try_split; redirty: folio_mark_dirty(folio); --=20 2.47.3