From nobody Sat Jun 20 15:19:25 2026 Received: from mail-dy1-f170.google.com (mail-dy1-f170.google.com [74.125.82.170]) (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 EC18C39D6E3 for ; Mon, 13 Apr 2026 22:39:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776120001; cv=none; b=F/TOLza06vUehjhci33JHJwX2PTlpDp2MLfM+ryhZnI/Iyy2jyd9kKuZCMUKhZXmuX6s+ydDWzXfua/UjlsEciWwcmcYUwRt4QEIhITvCQxmylwPTfj1Z+nrWm8+1nyMcDl+TYhuTCMOZyRIAfZLcE7j/Oo9qYz7qo4a3zxuXfA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776120001; c=relaxed/simple; bh=bwzNrlVYoUNou2xMQp86JpnGgFyY1zstL7nL+sbvTA4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=vCDFkUe8cgNKcoZGgKoCIc/sa8ZSUJMVlMmFuH4w2k9kDDtbMbw44583RqDEC7Dl3xUOFgGad8rydswbwc8M1vSZqqbTxG/6uNaPJKD7ImodpD3yAWuv0WgomxWHg/4D5gkCuf2/Hq5jxi0NhGZCXduRmXmVBYCeJgPvfvYK+Ig= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=do7dB6if; arc=none smtp.client-ip=74.125.82.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org 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="do7dB6if" Received: by mail-dy1-f170.google.com with SMTP id 5a478bee46e88-2dbb4ad19a5so558342eec.0 for ; Mon, 13 Apr 2026 15:39:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776119998; x=1776724798; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=m5SZlDYq9EPQdnrcj2kdyj1ENxPSAFfrXTE89MwF4qY=; b=do7dB6if7cxILkA2EeOy53SSA4g58QHXWXNsge3fmtC1d7d3z8vau6JLuFIQXFfDdm Ktt70WmUHVgJIhCqOjNhpZ4sIHppxAwW2c0GsCvRxOPqpbOuP4lZp6EkX6Z3QwA8HKFQ 29HVOfVcc/G21wwRo83fWm3FzGGaFl6Uw86hX1eZiWZlt/Bj1BiW4ONFJ4DPc8MbfP1g RHuaYA8kLbLOJdTnaeCOT/BPzWmDWJZoTymQRcdsEkLtOXXAv6Iceg3KUkBSsMAGgYBd tfofMtvv6tsPFJlwkL6E6ecUt8vdpMe6MIuhljY6hJY2CzPq3gYK27Pwwn4525GmOXoY jP9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776119998; x=1776724798; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=m5SZlDYq9EPQdnrcj2kdyj1ENxPSAFfrXTE89MwF4qY=; b=aElsj81xE47z5Fx6KIZo7AaDJBwz7DxPPF4OjlZoonKxcmORaU55+7KRa7CDJ+WQBY t3yMHY1b3EMbKdLS33VndOfnpTl6FilVR5LKiQdNhKwzuumaLLOgW/pv2ORChbxOtO1q tyZhDEOoQuPSiLum7cmfG6Hudl+jWqUiPTFFSt5/y065E7MD7BkkfgCEP4aJ6YP+PnZ4 1LY4ZsvfPH8DwmEyTHkbFgIVssJWVI9ut589Bwen6E4N2K3ncJxF/6BQH+q22had9eXR OG2rLYm7CWJrKEFxLBC0DW2aZeWmIS9kG9fZzWf5WlUa3Y/dB2AR61B4kCsIk8ALWcKU 8A5Q== X-Forwarded-Encrypted: i=1; AFNElJ+klVz7I9l45YaSlX28pQwluix0mMYnN2UlcykPyUC6P/ZXrZ9qjqp01aU5pCF0W9nxgEoaMfQAgB7RA6w=@vger.kernel.org X-Gm-Message-State: AOJu0YzP2H6OtB4KrENNqQUfD0xusM/b6DpWxYZHULNcBTIm9/+dGggL yhXQRKuqtJTcBEVhTlUCNSUBffa3eAK8Cq4dm6DdI6IMWgieTV/vI/+u X-Gm-Gg: AeBDievRA/2aMYufnktl9xEgvt/yoGDNoW/wpNr55gM12rHk3w2B2nEAVeLmxbCT6TX Uv2oXnpTb3JPWoXOgWk1SSMsazJESumSoEv8+cuJIomeSyP49u4kbjiXweufuLQZRG3c4G9LdTe Wbw2qL+sH63WbNaq8FRClRHYGg5wlzpk5Fsl1LbGO5pO3CeZDGyKktaXm7YclDKLI+rvY4MWKB6 y9Xooldy7GC+tNcyo4IY3cPU4kj8vzuUwKa+nr2ZbSN/ZFUZ75Ee/15jnOsm3cH3dBmSDe/njWo E8K7DTnSmmPmq5FRWbAA9aNQGZSdreXE7IyM07W117AjH18Knrtb0tv8K8lHwDzzHFapgKfZ6LY UZmTw+fZ8NY2wH64tUS3zNhWOs2o3VeTR6IkjBgqfiKoZfC8v25BrmGoTFG2QWci7hWbX6wkDuo V1rLTTs4rlbUSxZMWcY4+9w0Y6mAFVC+Tclqw0FV7dyowiSHw4+tcL4Vh334/mdM1+qp4klIvfq 5i+MHjyOAXcLGE= X-Received: by 2002:a05:7301:6086:b0:2d2:c60d:4fc2 with SMTP id 5a478bee46e88-2d5871bc5a9mr9173087eec.4.1776119997625; Mon, 13 Apr 2026 15:39:57 -0700 (PDT) Received: from bbox-1.mtv.corp.google.com ([2a00:79e0:2e7c:8:c871:4088:5cd5:bd1b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2d561cd3138sm18577297eec.14.2026.04.13.15.39.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Apr 2026 15:39:54 -0700 (PDT) Sender: Minchan Kim From: Minchan Kim To: akpm@linux-foundation.org Cc: david@kernel.org, mhocko@suse.com, brauner@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, surenb@google.com, timmurray@google.com, Minchan Kim Subject: [RFC 1/3] mm: process_mrelease: expedite clean file folio reclaim via mmu_gather Date: Mon, 13 Apr 2026 15:39:46 -0700 Message-ID: <20260413223948.556351-2-minchan@kernel.org> X-Mailer: git-send-email 2.54.0.rc0.605.g598a273b03-goog In-Reply-To: <20260413223948.556351-1-minchan@kernel.org> References: <20260413223948.556351-1-minchan@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: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, process_mrelease() unmaps the pages but leaves clean file folios on the LRU list, relying on standard memory reclaim to eventually free them. This delays the immediate recovery of system memory under OOM or container shutdown scenarios. This patch implements an expedited eviction mechanism for clean file folios by integrating directly into the low-level TLB batching infrastructure (mmu_gather). Instead of repeatedly locking and evicting folios one by one inside the unmap loop (zap_present_folio_ptes), we pass the MMF_UNSTABLE flag status down to free_pages_and_swap_cache(). Within this single unified loop, anonymous pages are released via free_swap_cache(), and file-backed folios are symmetrically truncated via mapping_evict_folio(). This avoids introducing unnecessary data structures, preserves TLB flush safety, and removes duplicate tree traversals, resulting in an extremely lean and highly responsive process_mrelease() implementation. Signed-off-by: Minchan Kim --- arch/s390/include/asm/tlb.h | 2 +- include/linux/swap.h | 9 ++++++--- mm/mmu_gather.c | 8 +++++--- mm/swap_state.c | 19 +++++++++++++++++-- 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/arch/s390/include/asm/tlb.h b/arch/s390/include/asm/tlb.h index 619fd41e710e..554842345ccd 100644 --- a/arch/s390/include/asm/tlb.h +++ b/arch/s390/include/asm/tlb.h @@ -62,7 +62,7 @@ static inline bool __tlb_remove_folio_pages(struct mmu_ga= ther *tlb, VM_WARN_ON_ONCE(delay_rmap); VM_WARN_ON_ONCE(page_folio(page) !=3D page_folio(page + nr_pages - 1)); =20 - free_pages_and_swap_cache(encoded_pages, ARRAY_SIZE(encoded_pages)); + free_pages_and_caches(encoded_pages, ARRAY_SIZE(encoded_pages), false); return false; } =20 diff --git a/include/linux/swap.h b/include/linux/swap.h index 62fc7499b408..e7b929b062f8 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -433,7 +433,7 @@ static inline unsigned long total_swapcache_pages(void) =20 void free_swap_cache(struct folio *folio); void free_folio_and_swap_cache(struct folio *folio); -void free_pages_and_swap_cache(struct encoded_page **, int); +void free_pages_and_caches(struct encoded_page **pages, int nr, bool free_= unmapped_file); /* linux/mm/swapfile.c */ extern atomic_long_t nr_swap_pages; extern long total_swap_pages; @@ -510,8 +510,11 @@ static inline void put_swap_device(struct swap_info_st= ruct *si) do { (val)->freeswap =3D (val)->totalswap =3D 0; } while (0) #define free_folio_and_swap_cache(folio) \ folio_put(folio) -#define free_pages_and_swap_cache(pages, nr) \ - release_pages((pages), (nr)); +static inline void free_pages_and_caches(struct encoded_page **pages, + int nr, bool free_unmapped_file) +{ + release_pages(pages, nr); +} =20 static inline void free_swap_cache(struct folio *folio) { diff --git a/mm/mmu_gather.c b/mm/mmu_gather.c index fe5b6a031717..5ce5824db07f 100644 --- a/mm/mmu_gather.c +++ b/mm/mmu_gather.c @@ -100,7 +100,8 @@ void tlb_flush_rmaps(struct mmu_gather *tlb, struct vm_= area_struct *vma) */ #define MAX_NR_FOLIOS_PER_FREE 512 =20 -static void __tlb_batch_free_encoded_pages(struct mmu_gather_batch *batch) +static void __tlb_batch_free_encoded_pages(struct mm_struct *mm, + struct mmu_gather_batch *batch) { struct encoded_page **pages =3D batch->encoded_pages; unsigned int nr, nr_pages; @@ -135,7 +136,8 @@ static void __tlb_batch_free_encoded_pages(struct mmu_g= ather_batch *batch) } } =20 - free_pages_and_swap_cache(pages, nr); + free_pages_and_caches(pages, nr, + mm_flags_test(MMF_UNSTABLE, mm)); pages +=3D nr; batch->nr -=3D nr; =20 @@ -148,7 +150,7 @@ static void tlb_batch_pages_flush(struct mmu_gather *tl= b) struct mmu_gather_batch *batch; =20 for (batch =3D &tlb->local; batch && batch->nr; batch =3D batch->next) - __tlb_batch_free_encoded_pages(batch); + __tlb_batch_free_encoded_pages(tlb->mm, batch); tlb->active =3D &tlb->local; } =20 diff --git a/mm/swap_state.c b/mm/swap_state.c index 6d0eef7470be..e70a52ead6d3 100644 --- a/mm/swap_state.c +++ b/mm/swap_state.c @@ -400,11 +400,22 @@ void free_folio_and_swap_cache(struct folio *folio) folio_put(folio); } =20 +static inline void free_file_cache(struct folio *folio) +{ + if (folio_trylock(folio)) { + mapping_evict_folio(folio_mapping(folio), folio); + folio_unlock(folio); + } +} + /* * Passed an array of pages, drop them all from swapcache and then release * them. They are removed from the LRU and freed if this is their last us= e. + * + * If @free_unmapped_file is true, this function will proactively evict cl= ean + * file-backed folios if they are no longer mapped. */ -void free_pages_and_swap_cache(struct encoded_page **pages, int nr) +void free_pages_and_caches(struct encoded_page **pages, int nr, bool free_= unmapped_file) { struct folio_batch folios; unsigned int refs[PAGEVEC_SIZE]; @@ -413,7 +424,11 @@ void free_pages_and_swap_cache(struct encoded_page **p= ages, int nr) for (int i =3D 0; i < nr; i++) { struct folio *folio =3D page_folio(encoded_page_ptr(pages[i])); =20 - free_swap_cache(folio); + if (folio_test_anon(folio)) + free_swap_cache(folio); + else if (unlikely(free_unmapped_file)) + free_file_cache(folio); + refs[folios.nr] =3D 1; if (unlikely(encoded_page_flags(pages[i]) & ENCODED_PAGE_BIT_NR_PAGES_NEXT)) --=20 2.54.0.rc0.605.g598a273b03-goog From nobody Sat Jun 20 15:19:25 2026 Received: from mail-dl1-f46.google.com (mail-dl1-f46.google.com [74.125.82.46]) (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 47BDC39D6F5 for ; Mon, 13 Apr 2026 22:40:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776120003; cv=none; b=o4sBRijleiOv7VOQN0x6a8rFmMQplT3cfsNdsNUDAQLJj5Pt84vhWnoagUkRuA3J7I94RPx+XuBmwNYlTj5kfUmUXAFpLoiTB7SRZAkK+cn1caQGdToy5NcHX08BM9kB+9bmvcSdHwwziQ1kebXUuXWFBO6NQF2xATJOxXmG7RE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776120003; c=relaxed/simple; bh=c2fSel4Bv1vDWfEzoxvjLThaTXLhrGDvk0p6TS6bUXo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=I3AgsGz+a0Ox37AfQrQa3k6s/lVOHdPiTwVCJAO4aKgMQuFkrIcu3xnmIWwQbHwRUeG7ZkAy0YvaIiK6qu1wBHMvzTbxzigjVzcN7WlYOENlH7hsJk/KiP3ceSFxdQYmGqBh3L2YmDuCuKY41te1V4jnKq8djRlYVsWs14ZV5CU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=PPc5W9lY; arc=none smtp.client-ip=74.125.82.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org 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="PPc5W9lY" Received: by mail-dl1-f46.google.com with SMTP id a92af1059eb24-12c45281a06so3034493c88.1 for ; Mon, 13 Apr 2026 15:40:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776120000; x=1776724800; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=0JOZF/bfe2NwOA9iLtUitP+8vPc1R4qGhKhnJ9x8d3U=; b=PPc5W9lYA/7iXvbqNWw9OZPgDO9/f2LYL7/5ChYQYNIXfg/hTrkwBvnWlT2siNfgK+ rWL3yUpIFvJLD7YGHgOBpBbNHytzpXwKyY/JII0qquAjhuqsewEdyBgx078JZgIq175G T0C4kSrWm5++9jtZIYrS5Sex/nRFDP8U/b1L9MbjaB4bTquNFmq4lJI3/G/goxQEOA50 3fvbtoB9aDRhrcqjsD/HiRlfRkN+NjecGOKr1TywBQzzGJbgHBVH8TMgIXe5+gQlJ2G3 AfwbSsTB0HJFNCXJzZvJn7n7jrOx1a/JnVM6Ypny826fE+hUl1GraQONyH89REH8ztqr mgcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776120000; x=1776724800; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=0JOZF/bfe2NwOA9iLtUitP+8vPc1R4qGhKhnJ9x8d3U=; b=fWt7shPM5G02UZB/9vDh0qdz7/R3eFUjlUxUKQmbhi7Xuq6SOA5eB8Y5Wu271HHyQf Lgr8kpWhdgxrr4Ba78rE8T8JG0g88PKf2mJpuYX0cgxmjR58yfWxR+aZB1EBXkO+u+Ke q2qkuMXqOO6epEIwxV/P7YfGqib4q2zptoG3Ga8canM3pHeDE+8fI7AZc0YbdzWvN3pp L9WH2BgfmI0BZqHH298rkk1tYnxfIa0jTEFhEVYT8fEA0+i20Z5jMCVGqt3WLJvYxuBY tv/XqIuQuTKOwxGjdbWSxW+2oLiHhSVIWq9oF26b6RDZToikk1ZaP5WCxV4x7M0cHugf NzTA== X-Forwarded-Encrypted: i=1; AFNElJ8UGL74hDKPmLkU3tWh7WOTfl5Z1CCfge9ZFSSZ31L29YFmziDvKjuihLqnIY1ccUC2Ls06lhTu/VPHrcI=@vger.kernel.org X-Gm-Message-State: AOJu0Yw+uemKTsJv+T+008UJLV7MkqYsGjoJ2wp5/nNZn8gPSS4f7gLR 0SUhdYaqBzdghVtvt46jv8Wy5bA+jn50ZeAKmK7sbXczdHe8wYlStCjl X-Gm-Gg: AeBDievTAOTcpCxz8GwrozwZUTuvy9yyEV46237DD5iOuMlGKe5GjaRNw9YrBSH+urr O0I5fwWhJE3DYcz4v9QaIVDSXLflrzmAIoemNp9RgWi+7Cas5wZFYvauoOo7XHS7aw6YpnlUecG KBE62dZcB40L9zrnuFbsboMudi6GJjSrygoGIHV+GLuxvJQpbsCeUGUC2WJ6eM/tmiY8++UB5E8 wcVy2g/Di2vo/Rp+YzVmZXoADixW0nv/Pq7NYlsplrZFVKWVPGf8Iy88IR9MUNwvtzBgNO1xKra Y8UbKDs07ImFUxDFL8Dsqswu7tVS5rZkhANtQRmfQnI7oRnUCJzwk8jXYklD5X/QZril6Ivjdw2 D/vsQDnP7pETgh48/WUh9UYhWDJRj5mCfAaCs4Qc7ochdikZvIsUyu6L3pR0UWU60RD0AeuNDJM CEDiNqAKADX7udiKo/+2nAoZtVIqvsARrIQ6uROKe26nQjRKV4xXQSdPBMQX+486Bhu2Oc6lQhj IjD X-Received: by 2002:a05:7022:ec1:b0:12c:2cf8:2f30 with SMTP id a92af1059eb24-12c34ea8a4fmr7509090c88.15.1776119999734; Mon, 13 Apr 2026 15:39:59 -0700 (PDT) Received: from bbox-1.mtv.corp.google.com ([2a00:79e0:2e7c:8:c871:4088:5cd5:bd1b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2d561cd3138sm18577297eec.14.2026.04.13.15.39.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Apr 2026 15:39:58 -0700 (PDT) Sender: Minchan Kim From: Minchan Kim To: akpm@linux-foundation.org Cc: david@kernel.org, mhocko@suse.com, brauner@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, surenb@google.com, timmurray@google.com, Minchan Kim Subject: [RFC 2/3] mm: process_mrelease: skip LRU movement for exclusive file folios Date: Mon, 13 Apr 2026 15:39:47 -0700 Message-ID: <20260413223948.556351-3-minchan@kernel.org> X-Mailer: git-send-email 2.54.0.rc0.605.g598a273b03-goog In-Reply-To: <20260413223948.556351-1-minchan@kernel.org> References: <20260413223948.556351-1-minchan@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: quoted-printable Content-Type: text/plain; charset="utf-8" For the process_mrelease reclaim, skip LRU handling for exclusive file-backed folios since they will be freed soon so pointless to move around in the LRU. This avoids costly LRU movement which accounts for a significant portion of the time during unmap_page_range. - 91.31% 0.00% mmap_exit_test [kernel.kallsyms] [.] exit_mm exit_mm __mmput exit_mmap unmap_vmas - unmap_page_range - 55.75% folio_mark_accessed + 48.79% __folio_batch_add_and_move 4.23% workingset_activation + 12.94% folio_remove_rmap_ptes + 9.86% page_table_check_clear + 3.34% tlb_flush_mmu 1.06% __page_table_check_pte_clear Signed-off-by: Minchan Kim --- mm/memory.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/mm/memory.c b/mm/memory.c index 2f815a34d924..25e17893c919 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1640,6 +1640,8 @@ static __always_inline void zap_present_folio_ptes(st= ruct mmu_gather *tlb, bool delay_rmap =3D false; =20 if (!folio_test_anon(folio)) { + bool skip_mark_accessed; + ptent =3D get_and_clear_full_ptes(mm, addr, pte, nr, tlb->fullmm); if (pte_dirty(ptent)) { folio_mark_dirty(folio); @@ -1648,7 +1650,16 @@ static __always_inline void zap_present_folio_ptes(s= truct mmu_gather *tlb, *force_flush =3D true; } } - if (pte_young(ptent) && likely(vma_has_recency(vma))) + + /* + * For the process_mrelease reclaim, skip LRU handling for exclusive + * file-backed folios since they will be freed soon so pointless + * to move around in the LRU. + */ + skip_mark_accessed =3D mm_flags_test(MMF_UNSTABLE, mm) && + folio_mapcount(folio) < 2; + if (likely(!skip_mark_accessed) && pte_young(ptent) && + likely(vma_has_recency(vma))) folio_mark_accessed(folio); rss[mm_counter(folio)] -=3D nr; } else { --=20 2.54.0.rc0.605.g598a273b03-goog From nobody Sat Jun 20 15:19:25 2026 Received: from mail-dy1-f177.google.com (mail-dy1-f177.google.com [74.125.82.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 048CA342532 for ; Mon, 13 Apr 2026 22:40:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.82.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776120005; cv=none; b=jN+wt2cSIS2NSUYBX8PjDF57bezymXCSIoEh0CqKOZV1ngyszhzi7vqkBK7G5ATt1bkCLSVM5I0XQmAVORZshLK+X/2ybEIfpVQJlaC0Y1Kj2lae2HefT+Gaubpe9juPYpkfCbJzDOqDKtIQrIdRvzDB07n9xINIgrhuPxP8aa8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776120005; c=relaxed/simple; bh=bo4rnRk9gTHnF48ie5YwA3Oq/Ug6de8IrM1VgcfjHyQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=exyqZfyMqETL15szZJhKBG3d6NLmiMEviD7Oe/CDbgFC5/gvCvCGGG/tc/Il4PUy+8M+i3HV/WmoEmx7QmP+vWK5fNHJ9xAe+aQXRCHiWuw6iGZNbn7ql+j7bqGNV5WlZLQVI4JAiebMQGrl3hMvll8k6n14GZ0QeO+JUSOqfYg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=sb9wB+34; arc=none smtp.client-ip=74.125.82.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=kernel.org 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="sb9wB+34" Received: by mail-dy1-f177.google.com with SMTP id 5a478bee46e88-2bd9a485bd6so10326681eec.1 for ; Mon, 13 Apr 2026 15:40:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776120002; x=1776724802; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:from:to:cc:subject:date :message-id:reply-to; bh=cc8QYlKcFUttGHudhBfwFdQ1KDV1t/Eqeu+TLpIwudk=; b=sb9wB+34QdnmYl4Szi4UUjEp+pdgBD1UUIyV5zD23/mV/SIayPv5SD5FMh0GlLxZEA Hk2o99flLBImqH+ER1t4UpDLwePwUSET3Kny3B0isNNENUOMV5Vwlddh5A+NmDjn4aDu CFroTozpm3JW6bT53xorXIvEP7hjiQVnrDtLlEGUMTOsDPT2R03hh/A9K82FHL1nDkrt t8Op0kwmCiyNjuJohcAM8KQyxx+ALV6BK3DRgpHj7K3sd2RMtgtremOaLvknqV09Cg0r 6w2nWqY+KZ3cN4s3IJI6GvivEoLTxmn0EUUZCkqDAKTSaXdPv/WTL8rlNA2A+A10xTeP dieA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776120002; x=1776724802; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:sender:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=cc8QYlKcFUttGHudhBfwFdQ1KDV1t/Eqeu+TLpIwudk=; b=GZBB/1Pyiyp92I9rj8yKDOGrnNIP6/KV4HR1eDTu0UgLrW6MfiaYwtmaOxrJxlgW8O vlbBILTnFy8Al9gt6odL+0EWO01WtFSZuJI/VXa6lcSRZo2DaIH7J1tlxFIsXYf1mPkj QvXIR1SJgIPvRxKTI6VJPuZIQqQ9bTmwxtlLTm85QpySUOgo3O8U+2sszIU7o2IkuvsG b/+tVcEzb0/oAa6pVHp+x7GKoM+mE7TyzW9c6BkB17p1V7bWNGpB56aTMl1kg6jqVdQa 2Ed5nWP4zt6+ZNSkRvtY3+K7aC2s/O2ABzM+P9h/191CHAUvLBK3Xrhl4X9HzJY3nd6r kb6g== X-Forwarded-Encrypted: i=1; AFNElJ9uxcTaLpXbJV1Rb4oiNBBYVlVxdnCcjvv+jNl5Ear+AjGG28uIxIrhSvVQqpM8VXTcJOfgFCouan4+v0U=@vger.kernel.org X-Gm-Message-State: AOJu0YyRm2Qx/cSoXMZC1cFBWl1e/56A+26K3MmXkm/xo2B56N7EiJCZ qRRMZ3TfXX/KTz2wClj1GbIpduWq7l9Uj357AhvDUl9009x6POrqn+Jk X-Gm-Gg: AeBDiev/5nh90SqK6LKQX4G/ObZraDxlPq0yLe4l/npNF6zuSaPyb8CfR9IA8VtPPlU YpayUDERo3uhr7p3z1QLKtzFYbq9Lnzpov0+9Q5tp/jZ2dV0WMblI3/TmafsfedhblyhS7QwLQe 2RyuNbjhE+ECoxBTEu5o/x4thnHm2AeqwUznOQB22ui30lm49v/DQ2k2oH93WC6vwtLqTmGOSBk v7qGJp4XG5UiFKXlsfGUtiZR0j/WRc3OIBfBVPmINL9tg+cPCCw99i9PCm8Fd91Hie5YNNR8v74 7fZ8m/j2LWFp03Qx5dXEEgG4ACG5Mg/1JVQm9Nv/fQXNainM2PRBM4GnBUqpvZ/JCUpnpdkQ/YM eNVqh2E/a9oMDlJWOVTpBV+OOxCKDrW5X1i52P/nEf/PrwPbrhFcPxn/9DOh1tjxiPz85XVpKuC /agEYrHXKbpO48VQI/DYwYbbddJVbbTn3C7v4QzxP8o9zch06FTmZ90W4gsn+XWEW7POe6Iq20t L58 X-Received: by 2002:a05:7300:6d03:b0:2c0:d1ad:cd2e with SMTP id 5a478bee46e88-2d587d82e7emr8217072eec.11.1776120001746; Mon, 13 Apr 2026 15:40:01 -0700 (PDT) Received: from bbox-1.mtv.corp.google.com ([2a00:79e0:2e7c:8:c871:4088:5cd5:bd1b]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2d561cd3138sm18577297eec.14.2026.04.13.15.39.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 Apr 2026 15:40:00 -0700 (PDT) Sender: Minchan Kim From: Minchan Kim To: akpm@linux-foundation.org Cc: david@kernel.org, mhocko@suse.com, brauner@kernel.org, linux-mm@kvack.org, linux-kernel@vger.kernel.org, surenb@google.com, timmurray@google.com, Minchan Kim Subject: [RFC 3/3] mm: process_mrelease: introduce PROCESS_MRELEASE_REAP_KILL flag Date: Mon, 13 Apr 2026 15:39:48 -0700 Message-ID: <20260413223948.556351-4-minchan@kernel.org> X-Mailer: git-send-email 2.54.0.rc0.605.g598a273b03-goog In-Reply-To: <20260413223948.556351-1-minchan@kernel.org> References: <20260413223948.556351-1-minchan@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: quoted-printable Content-Type: text/plain; charset="utf-8" Currently, process_mrelease() requires userspace to send a SIGKILL signal prior to invocation. This separation introduces a race window where the victim task may receive the signal and enter the exit path before the reaper can invoke process_mrelease(). In this case, the victim task frees its memory via the standard, unoptimized exit path, bypassing the expedited clean file folio reclamation optimization introduced in the previous patch (which relies on the MMF_UNSTABLE flag). This patch introduces the PROCESS_MRELEASE_REAP_KILL UAPI flag to support an integrated auto-kill mode. When specified, process_mrelease() directly injects a SIGKILL into the target task. Crucially, this patch utilizes a dedicated signal code (KILL_MRELEASE) during signal injection, belonging to a new SIGKILL si_codes section. This special code ensures that the kernel's signal delivery path reliably intercepts the request and marks the target address space as unstable (MMF_UNSTABLE). This mechanism guarantees that the MMF_UNSTABLE flag is set before either the victim task or the reaper proceeds, ensuring that the expedited reclamation optimization is utilized regardless of scheduling order. Signed-off-by: Minchan Kim --- include/uapi/asm-generic/siginfo.h | 6 ++++++ include/uapi/linux/mman.h | 4 ++++ kernel/signal.c | 4 ++++ mm/oom_kill.c | 20 +++++++++++++++++++- 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/= siginfo.h index 5a1ca43b5fc6..0f59b791dab4 100644 --- a/include/uapi/asm-generic/siginfo.h +++ b/include/uapi/asm-generic/siginfo.h @@ -252,6 +252,12 @@ typedef struct siginfo { #define BUS_MCEERR_AO 5 #define NSIGBUS 5 =20 +/* + * SIGKILL si_codes + */ +#define KILL_MRELEASE 1 /* sent by process_mrelease */ +#define NSIGKILL 1 + /* * SIGTRAP si_codes */ diff --git a/include/uapi/linux/mman.h b/include/uapi/linux/mman.h index e89d00528f2f..4266976b45ad 100644 --- a/include/uapi/linux/mman.h +++ b/include/uapi/linux/mman.h @@ -56,4 +56,8 @@ struct cachestat { __u64 nr_recently_evicted; }; =20 +/* Flags for process_mrelease */ +#define PROCESS_MRELEASE_REAP_KILL (1 << 0) +#define PROCESS_MRELEASE_VALID_FLAGS (PROCESS_MRELEASE_REAP_KILL) + #endif /* _UAPI_LINUX_MMAN_H */ diff --git a/kernel/signal.c b/kernel/signal.c index d65d0fe24bfb..c21b2176dc5e 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -1134,6 +1134,10 @@ static int __send_signal_locked(int sig, struct kern= el_siginfo *info, =20 out_set: signalfd_notify(t, sig); + + if (sig =3D=3D SIGKILL && !is_si_special(info) && + info->si_code =3D=3D KILL_MRELEASE && t->mm) + mm_flags_set(MMF_UNSTABLE, t->mm); sigaddset(&pending->signal, sig); =20 /* Let multiprocess signals appear after on-going forks */ diff --git a/mm/oom_kill.c b/mm/oom_kill.c index 5c6c95c169ee..0b5da5208707 100644 --- a/mm/oom_kill.c +++ b/mm/oom_kill.c @@ -20,6 +20,8 @@ =20 #include #include +#include +#include #include #include #include @@ -1218,13 +1220,29 @@ SYSCALL_DEFINE2(process_mrelease, int, pidfd, unsig= ned int, flags) bool reap =3D false; long ret =3D 0; =20 - if (flags) + if (flags & ~PROCESS_MRELEASE_VALID_FLAGS) return -EINVAL; =20 task =3D pidfd_get_task(pidfd, &f_flags); if (IS_ERR(task)) return PTR_ERR(task); =20 + if (flags & PROCESS_MRELEASE_REAP_KILL) { + struct kernel_siginfo info; + + if (!capable(CAP_KILL)) { + ret =3D -EPERM; + goto put_task; + } + clear_siginfo(&info); + info.si_signo =3D SIGKILL; + info.si_code =3D KILL_MRELEASE; + info.si_pid =3D task_tgid_vnr(current); + info.si_uid =3D from_kuid_munged(current_user_ns(), current_uid()); + + do_send_sig_info(SIGKILL, &info, task, PIDTYPE_TGID); + } + /* * Make sure to choose a thread which still has a reference to mm * during the group exit --=20 2.54.0.rc0.605.g598a273b03-goog