From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B3ABE340419 for ; Thu, 9 Jul 2026 08:16:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783584985; cv=none; b=RWgEEHIGs+M3zw001eGBaLzZMGB6c6Gcj2Mf4MerkOYzMfZsNB68RVVss0Q0dWDJ5++Xg4reAfMOtVLTo1jsIhtGdL6WEJ+ppvx0s8XtcTfaQC5goyVzJG9kgTo/fX+heqabnfKPCcgGdSHnMOQ/pJzsTB22BQizXzhJ97r08PE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783584985; c=relaxed/simple; bh=w3IQAGftNCOn2OYakatGFony49VvN4wAAtAPqOrbxYc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=BaDvzTuaCNYhWBaVR5pkrJo1ium9hTfXRIWNJr8GN+396Mcsd+oG3FUKBTSG8i8wcQVqOhyHafMJgBt32hBeOQlSiqi84yCKuZ1a+jBikNdjgqzoPz6BCGjJj60tjC2BZ+AvNnSCbaZGC0loAnnmExLgYbhTVhqj/oLTAlVB/vE= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=KuxHGu1V; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="KuxHGu1V" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 212BF1F000E9; Thu, 9 Jul 2026 08:16:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1783584984; bh=be/KDcZu0XNj3r86q48lIBlT1klEYS3GusmySQe8xtY=; h=From:To:Cc:Subject:Date:In-Reply-To:References; b=KuxHGu1VTFKY9Gufa7FXu5TZuiSoVKqknBTVofwvkw3zGVItEc4ax6m8wXnEJOTWH IgGbhXq+cVnzjp2bN2W9R91kwKs0h58Bwq5HYMcIRrqPBJki2G2j7ZXGpIgx1NpCYY Ca5Oa71jcmCvcEAKRRju6p02fSwUVBKoFa8YgpYdcWpFCejYU2QqdxlVpVcXaxO30u +617JyzyIyaM7Qa2DnZPh5LptRF9hdbvIJfqDZuwd8m297dpvpqEBMJbnUfq5ImuWr lJjDBObAZVViWExBAXKaOsEXRYZMdqs7sL4Z/iro7YXR1ApIrlxm0jxwlMVW/hgk5V Y0+VNRyFuNGyA== From: "Barry Song (Xiaomi)" To: akpm@linux-foundation.org, david@kernel.org, linux-mm@kvack.org, ljs@kernel.org Cc: baolin.wang@linux.alibaba.com, dev.jain@arm.com, lance.yang@linux.dev, liam@infradead.org, linux-kernel@vger.kernel.org, npache@redhat.com, ryan.roberts@arm.com, ziy@nvidia.com, vbabka@kernel.org, rppt@kernel.org, surenb@google.com, mhocko@suse.com, "Barry Song (Xiaomi)" Subject: [RFC PATCH v2 2/2] mm: improve large folio reuse for LRU-cached folios Date: Thu, 9 Jul 2026 16:15:36 +0800 Message-Id: <20260709081536.82768-3-baohua@kernel.org> X-Mailer: git-send-email 2.39.3 (Apple Git-146) In-Reply-To: <20260709081536.82768-1-baohua@kernel.org> References: <20260709081536.82768-1-baohua@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Large folios may now reside in the per-CPU LRU cache. Before attempting to reuse them, drain the local LRU cache, which can still be beneficial in cases where the folios are likely to remain in this CPU's LRU cache: int main(int argc, char *argv[]) { int i; while (1) { volatile int *p = mmap(0, SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); for (int i = 0; i < SIZE / sizeof(int); i++) p[i] = i; madvise((void *)p, SIZE, MADV_PAGEOUT); if (!fork()) _exit(0); for (int i = 0; i < SIZE / sizeof(int); i++) p[i] = i; munmap((void *)p, SIZE); } return 0; } Signed-off-by: Barry Song (Xiaomi) --- mm/memory.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mm/memory.c b/mm/memory.c index 5689b7cff76c..1d08ed5ba99b 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4136,6 +4136,19 @@ static bool __wp_can_reuse_large_anon_folio(struct folio *folio, folio_unlock(folio); } + if (folio_may_be_lru_cached(folio) && !folio_test_lru(folio)) { + if (folio_ref_count(folio) > folio_large_mapcount(folio) + 1) + return false; + /* + * A global LRU drain is too expensive, but a local drain + * can still be beneficial. For example, large folios that + * have just been swapped in and fall back from + * do_swap_page() to do_wp_page() are likely still in this + * CPU's LRU cache. + */ + lru_add_drain(); + } + if (folio_large_mapcount(folio) != folio_ref_count(folio)) return false; -- 2.39.3 (Apple Git-146)