From nobody Tue Apr 7 14:03:40 2026 Received: from mail-qv1-f53.google.com (mail-qv1-f53.google.com [209.85.219.53]) (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 9CCDE1AAE28 for ; Thu, 26 Feb 2026 00:32:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772065970; cv=none; b=BdSF0XsGNxlFONRgFrb90+OjtoLymFOHpRmnjHA5+gzQQSlbZ5k8JavH5FVGi9a8Q4CKYL5RfSJlDUH3B6umpK+BQgO81YyNLOhvfj5Z1IZZKOEtTNcZwc2kZrJSnwF97WxRDX2B438LnaG+hXTHNLVKgoufw7wOv+sP+EdtPNQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772065970; c=relaxed/simple; bh=0uqpssBjjzZIDIyRdPs1cdjLmIfMndVCjQBQA9Qb+Xo=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=OdguhWYeDkVM//9Wk+b7fWb3hdW/OJw3zL8JNla3YPaSuh7FShzLk3E41dyBQRk+HiuxFTLj6YKEP4swHrRxstjIYgz2+XpmnF1b2ls0mUDmQxLAN/R/uIRuepkcHpZRRh76GK904aWIEUgKuPHMZj4mF+MXnXHksBzIZHHxLeo= 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=kP5sTj90; arc=none smtp.client-ip=209.85.219.53 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="kP5sTj90" Received: by mail-qv1-f53.google.com with SMTP id 6a1803df08f44-897023602b1so4349106d6.0 for ; Wed, 25 Feb 2026 16:32:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772065966; x=1772670766; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=Ht+6aiKcLO5UeELKaqdbgm4IHdAivvgizKUqvMkq7j4=; b=kP5sTj90wneVDwC4M6EYlcT6Fec3T3/IBRDN6CG4m9YFUHCihz0JrNsG2BO1BiVk4N iq8F0S34Fe7Wp55wPFJv6PIeIVYUfbfvmjiAeEXSPnP6RD+gZ5rySgK6ckJTMzVvFXwr y4skW+KISz1/armmuwErVk6hV/aRFvH28ZwH0zjO9TnrwtzOoZriPN36tWTFNplcGZkN 54l+6NQC2OmkOgynhwMQctHnwiIT3iT6th1m3HPHKfs4N9XRR7QDrYXABehOCAjtjZxQ 8VnIxNqOp0XE/kn/9g6rMC9Um0Y6ZmgIjuNOkCv59acMdq8gUSE/VumWSS37Cnv5qyB/ dfRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772065966; x=1772670766; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=Ht+6aiKcLO5UeELKaqdbgm4IHdAivvgizKUqvMkq7j4=; b=Mi8P/tvzcGV6XPkvc3fL4MBR7gND3of2W3FQjG5NIngpmqq+qfAf9GC9puC2eMwK8m hheE+WOWHOVKWD7cHjUgY+hSAjWjGWfwDxQ+pONIuYaCI3TM4B2LU0f7NPu277KOCBwu UVa995rdCVfqt1v6SKzWF9j/s55B0cuuiEeXpUAkTQQGkmm14oGXZqZlbvw8ZLaBpeCn AEp7gXLR7GxWQPYg9VUNV6PJ6gsDjdkxEFtLkr7dd2ZYrZmMD73aeBgM/pUBsWaoghtq OEtcprlTVPKo7WzwPqv4jLTJGPZkyFL8tdU5D9OLvvkRIodPwKXH1qPkLMVp3iBlTcge hKoQ== X-Gm-Message-State: AOJu0YzDVuBo3cNnNC1zsqs/flP31sNhg4pspBr3cWfKODbwv++avRRM /OVzYL3bloyflH5Qv2zzDUQrA4bpPJkRe3pnJTXkaZj1FzCMVpedargm5rfWXSi7 X-Gm-Gg: ATEYQzy5/iH3C6D7yYFdqTdXVnVSdV4fjmz+W3EhQdnvWJdlc8yu1AHuEFs6wTuoWto +sNpYNWGlyWk9AJdquHbSkeQXwih/YOUz0v3Wsq+Y4bHnk8R1HyQIHEodBLzCZZ3C0PRZ/YLwpZ Q5qqdeF/EVTCV5jV2VieiU/p3Kg6Yps9v6MhK19VT7L80n9jepsKzRHjH41X/U84PcDclqjqgJR sgTdA+lwFlYadkWmGKA/9guUYhvUJZkDtjHRI21EBKEtDXmoKw04GuGk1iZmX+ADkPu8bVnKxVM PhxxGZ9G8yNYVtpZOnBzBv+2iQBeviEYMRX0lCZfSZPc3DpioZErJ+TXyS+YDuy19JF026aQ7JJ NcoNwiOze3dakJrjspZo73PnecJEU1a30FC4DrjeRrJAUCi4gI+lerSQzwEQ57RPAFoCy7N6GaE pKT1LHm5Cbf4JOdB/bB9NX9gil X-Received: by 2002:a17:902:ea0a:b0:2ad:d77c:bf6a with SMTP id d9443c01a7336-2ae034c0c73mr600925ad.26.1772059058501; Wed, 25 Feb 2026 14:37:38 -0800 (PST) Received: from barry-desktop.hub ([47.72.129.29]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2adfb5c3b01sm2761535ad.31.2026.02.25.14.37.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Feb 2026 14:37:37 -0800 (PST) From: Barry Song <21cnbao@gmail.com> To: akpm@linux-foundation.org, linux-mm@kvack.org Cc: linux-kernel@vger.kernel.org, Barry Song , wangzicheng , Suren Baghdasaryan , Lei Liu , "Matthew Wilcox (Oracle)" , Axel Rasmussen , Yuanchu Xie , Wei Xu , Kairui Song , Tangquan Zheng Subject: [PATCH RFC] mm/mglru: lazily activate folios while folios are really mapped Date: Thu, 26 Feb 2026 11:37:12 +1300 Message-ID: <20260225223712.3685-1-21cnbao@gmail.com> X-Mailer: git-send-email 2.48.1 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 MGLRU activates folios when a new folio is added and lru_gen_in_fault() returns true. The problem is that when a page fault occurs at address N, readahead may bring in many folios around N, and those folios are also activated even though many of them may never be accessed. A previous attempt by Lei Liu proposed introducing a separate LRU for readahead[1], but that approach is likely over-designed. This patch instead activates folios lazily, only when they are actually mapped, so that unused folios do not occupy higher- priority positions in the LRU and become harder to reclaim. A similar optimization could also be applied to swapin readahead, but this RFC limits the change to file-backed folios for now. Based on Tangquan's observations, this can significantly reduce file refaults on Android devices when using MGLRU. BTW, it seems somewhat odd that all LRU APIs are defined in swap.c and swap.h. [1] https://lore.kernel.org/linux-mm/20250916072226.220426-1-liulei.rjpt@vi= vo.com/ Cc: wangzicheng Cc: Suren Baghdasaryan Cc: Lei Liu Cc: Matthew Wilcox (Oracle) Cc: Axel Rasmussen Cc: Yuanchu Xie Cc: Wei Xu Cc: Kairui Song Cc: Tangquan Zheng Signed-off-by: Barry Song --- include/linux/swap.h | 1 + mm/filemap.c | 2 ++ mm/swap.c | 16 +++++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/include/linux/swap.h b/include/linux/swap.h index 62fc7499b408..ce88ec560527 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -335,6 +335,7 @@ void folio_add_lru(struct folio *); void folio_add_lru_vma(struct folio *, struct vm_area_struct *); void mark_page_accessed(struct page *); void folio_mark_accessed(struct folio *); +void folio_activate_on_mapped(struct folio *folio); =20 static inline bool folio_may_be_lru_cached(struct folio *folio) { diff --git a/mm/filemap.c b/mm/filemap.c index 6cd7974d4ada..0b8f383facdb 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -3567,6 +3567,7 @@ vm_fault_t filemap_fault(struct vm_fault *vmf) } } =20 + folio_activate_on_mapped(folio); if (!lock_folio_maybe_drop_mmap(vmf, folio, &fpin)) goto out_retry; =20 @@ -3926,6 +3927,7 @@ vm_fault_t filemap_map_pages(struct vm_fault *vmf, nr_pages, &rss, &mmap_miss, file_end); =20 folio_unlock(folio); + folio_activate_on_mapped(folio); } while ((folio =3D next_uptodate_folio(&xas, mapping, end_pgoff)) !=3D N= ULL); add_mm_counter(vma->vm_mm, folio_type, rss); pte_unmap_unlock(vmf->pte, vmf->ptl); diff --git a/mm/swap.c b/mm/swap.c index bb19ccbece46..e50b1e794ef1 100644 --- a/mm/swap.c +++ b/mm/swap.c @@ -488,6 +488,19 @@ void folio_mark_accessed(struct folio *folio) } EXPORT_SYMBOL(folio_mark_accessed); =20 +void folio_activate_on_mapped(struct folio *folio) +{ + if (lru_gen_enabled() && lru_gen_in_fault() && + !(current->flags & PF_MEMALLOC) && + !folio_test_active(folio) && + !folio_test_unevictable(folio)) { + if (folio_test_lru(folio)) + folio_activate(folio); + else /* still in lru cache */ + __lru_cache_activate_folio(folio); + } +} + /** * folio_add_lru - Add a folio to an LRU list. * @folio: The folio to be added to the LRU. @@ -506,7 +519,8 @@ void folio_add_lru(struct folio *folio) /* see the comment in lru_gen_folio_seq() */ if (lru_gen_enabled() && !folio_test_unevictable(folio) && lru_gen_in_fault() && !(current->flags & PF_MEMALLOC)) - folio_set_active(folio); + if (!folio_is_file_lru(folio)) + folio_set_active(folio); =20 folio_batch_add_and_move(folio, lru_add); } --=20 2.39.3 (Apple Git-146)