From: Andrew Morton <akpm@linux-foundation.org>
To: "David Hildenbrand (Arm)" <david@kernel.org>
Cc: Pedro Falcato <pfalcato@suse.de>,
Johannes Weiner <hannes@cmpxchg.org>,
Michal Hocko <mhocko@kernel.org>, Qi Zheng <qi.zheng@linux.dev>,
Shakeel Butt <shakeel.butt@linux.dev>,
Lorenzo Stoakes <ljs@kernel.org>,
Kairui Song <kasong@tencent.com>, Barry Song <baohua@kernel.org>,
Axel Rasmussen <axelrasmussen@google.com>,
Yuanchu Xie <yuanchu@google.com>, Wei Xu <weixugc@google.com>,
Baoquan He <baoquan.he@linux.dev>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
"Liam R. Howlett" <liam@infradead.org>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>, Kees Cook <kees@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Jann Horn <jannh@google.com>, Hugh Dickins <hughd@google.com>,
Pasha Tatashin <pasha.tatashin@soleen.com>,
Pratyush Yadav <pratyush@kernel.org>,
"Matthew Wilcox (Oracle)" <willy@infradead.org>,
Jan Kara <jack@suse.cz>, Zi Yan <ziy@nvidia.com>,
Lance Yang <lance.yang@linux.dev>,
Rik van Riel <riel@surriel.com>, Harry Yoo <harry@kernel.org>,
Alistair Popple <apopple@nvidia.com>,
Nico Pache <nico.pache@linux.dev>,
Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
Usama Arif <usama.arif@linux.dev>,
Kiryl Shutsemau <kas@kernel.org>,
Matthew Brost <matthew.brost@intel.com>,
John Hubbard <jhubbard@nvidia.com>, Peter Xu <peterx@redhat.com>,
Will Deacon <will@kernel.org>,
"Aneesh Kumar K.V" <aneesh.kumar@kernel.org>,
Nick Piggin <npiggin@gmail.com>,
Oscar Salvador <osalvador@suse.de>,
Minchan Kim <minchan@kernel.org>,
Muchun Song <muchun.song@linux.dev>, Xu Xin <xu.xin@linux.dev>,
Chengming Zhou <chengming.zhou@linux.dev>,
Chris Li <chrisl@kernel.org>,
Kemeng Shi <shikemeng@huaweicloud.com>,
Nhat Pham <nphamcs@gmail.com>,
Youngjun Park <youngjun.park@lge.com>,
Gregory Price <gourry@gourry.net>,
Joshua Hahn <joshua.hahnjy@gmail.com>,
Rakie Kim <rakie.kim@sk.com>,
Ying Huang <ying.huang@linux.alibaba.com>,
Jason Gunthorpe <jgg@ziepe.ca>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
kexec@lists.infradead.org, linux-fsdevel@vger.kernel.org,
linux-arch@vger.kernel.org, linux-cxl@vger.kernel.org,
Josef Bacik <josef@toxicpanda.com>,
stable@vger.kernel.org
Subject: Re: [PATCH 07/46] mm/filemap: don't lose a folio lock wakeup to a signal
Date: Tue, 27 Oct 2026 19:17:37 -0700 [thread overview]
Message-ID: <20261027191737.c757411fbe53f98b1596eebd@linux-foundation.org> (raw)
In-Reply-To: <11b91d57-85e6-47d0-87ab-5fa8624e8068@kernel.org>
On Tue, 27 Oct 2026 20:18:18 +0100 "David Hildenbrand (Arm)" <david@kernel.org> wrote:
> On 10/27/26 17:10, Pedro Falcato wrote:
> > On Tue, Oct 27, 2026 at 12:17:27AM +0100, David Hildenbrand (Arm) wrote:
> >> From: Josef Bacik <josef@toxicpanda.com>
> >>
> >> An exclusive waiter in folio_wait_bit_common() can leave the wait loop
> >> because of a fatal signal, then be woken by folio_unlock() before
> >> finish_wait(). If the waker did not hand over the lock, the waiter returns
> >> -EINTR without trying to acquire it.
> >>
> >> folio_wake_bit() stops after waking the first exclusive waiter, so this
> >> loses the wakeup and can leave other waiters asleep indefinitely on an
> >> unlocked folio.
> >>
> >> After finish_wait(), let a waiter woken without a lock handoff try once
> >> more to acquire the lock. If successful, return success so the caller's
> >> eventual unlock wakes the next waiter. Otherwise, the current lock owner
> >> will do so.
> >
> > Has this been reproduced? I feel like this would've been found out by now?
>
> Let me dig ... I don't find mention in the notes, but I was told that most of
> these things have reproducers.
>
> I guess it's harder to hit in practice, because you need a fatal signal and then
> keep the other waiter alive while nobody else will take that lock in a timely
> fashion.
>
> I asked codex to try writing one but it refuses for security reasons :)
Yeah, I keep hitting that. Sometimes it can be worked around by asking
the same thing in a different way.
Anyway, how's this:
I tested this fix with a small, purpose-built kernel module in an
x86-64 QEMU/KVM guest. It reproduces the lost wakeup on the unpatched
kernel and passes with the patch applied.
The module allocates and locks a folio, then queues two exclusive
waiters. The first uses __folio_lock_killable(); the second uses
folio_lock(). It sends SIGKILL to the first waiter and uses an x86-64
kprobe on finish_wait() to hold that waiter after it leaves the wait
loop. The coordinator then unlocks the folio, waking the first waiter
without handing over the lock. Without the fix, the first waiter
returns -EINTR and the second remains asleep on an unlocked folio.
With the fix, the first waiter acquires the folio lock, unlocks it and
wakes the second waiter.
This is a module rather than a userspace program because it needs
access to the folio lock, the internal exclusive wait queue, and a
kprobe at finish_wait() to force the specific race. A userspace
program cannot directly observe or synchronize these kernel states.
Results:
Unpatched: 7.3.0-rc5-g6ead605f7c7a-dirty
first=-4, first_done=1, second_done=0, locked=0
REPRODUCED: second waiter asleep on unlocked folio
Patched: 7.3.0-rc5-g73cfeb4a61fc-dirty
first=0, first_done=1, second_done=1, locked=0
PASS: first waiter took lock; second waiter progressed
Both runs recorded flags=0x1->0x3 and probe_timeout=0, confirming that
the first waiter was woken without WQ_FLAG_DONE and that the
instrumented synchronization did not time out.
I've attached the module source and Makefile.
// SPDX-License-Identifier: GPL-2.0
/*
* Deterministic-ish, VM-only regression test for the missing exclusive
* folio lock wakeup when a killable waiter is interrupted by SIGKILL.
*
* Requires x86-64, CONFIG_KPROBES, CONFIG_MODULES and at least 2 vCPUs.
* Never use on a production machine. No mm/filemap.c modifications.
*/
#include <linux/completion.h>
#include <linux/cpumask.h>
#include <linux/delay.h>
#include <linux/errno.h>
#include <linux/gfp.h>
#include <linux/init.h>
#include <linux/jiffies.h>
#include <linux/kprobes.h>
#include <linux/kthread.h>
#include <linux/mm.h>
#include <linux/module.h>
#include <linux/pagemap.h>
#include <linux/sched.h>
#include <linux/sched/signal.h>
#include <linux/signal.h>
#include <linux/smp.h>
#include <linux/wait.h>
#define PREFIX "folio-wakeup-repro: "
#define STATE_WAIT_MS 3000
#define PROBE_HOLD_MS 500
#define RESULT_WAIT_MS 300
#if !defined(CONFIG_X86_64)
#error "This test's kprobe register access requires x86-64"
#endif
static struct folio *test_folio;
static struct task_struct *first_task, *second_task;
static DECLARE_COMPLETION(first_done);
static DECLARE_COMPLETION(second_done);
static atomic_t probe_hit = ATOMIC_INIT(0);
static atomic_t release_probe = ATOMIC_INIT(0);
static atomic_t probe_expired = ATOMIC_INIT(0);
static unsigned int flags_before, flags_after;
static int first_ret = -999;
static bool initial_lock_held;
static bool second_got_lock;
static int finish_wait_probe(struct kprobe *kp, struct pt_regs *regs)
{
struct wait_queue_entry *wait;
unsigned long deadline;
(void)kp;
if (current != READ_ONCE(first_task))
return 0;
/* SysV x86-64: finish_wait(q, wait), wait is argument #2. */
wait = (struct wait_queue_entry *)regs->si;
WRITE_ONCE(flags_before, READ_ONCE(wait->flags));
atomic_set(&probe_hit, 1);
/* kprobe handlers cannot sleep. Pin this waiter to another CPU. */
deadline = jiffies + msecs_to_jiffies(PROBE_HOLD_MS);
while (!atomic_read(&release_probe)) {
if (time_after_eq(jiffies, deadline)) {
atomic_set(&probe_expired, 1);
break;
}
cpu_relax();
}
WRITE_ONCE(flags_after, READ_ONCE(wait->flags));
return 0;
}
static struct kprobe finish_probe = {
.symbol_name = "finish_wait",
.pre_handler = finish_wait_probe,
};
static int first_fn(void *arg)
{
int ret;
(void)arg;
allow_signal(SIGKILL);
ret = __folio_lock_killable(test_folio);
WRITE_ONCE(first_ret, ret);
if (!ret)
folio_unlock(test_folio);
complete(&first_done);
return 0;
}
static int second_fn(void *arg)
{
(void)arg;
folio_lock(test_folio);
WRITE_ONCE(second_got_lock, true);
folio_unlock(test_folio);
complete(&second_done);
return 0;
}
static bool wait_for_state(struct task_struct *t, unsigned int state)
{
unsigned long deadline = jiffies + msecs_to_jiffies(STATE_WAIT_MS);
while (time_before(jiffies, deadline)) {
if (READ_ONCE(t->__state) == state)
return true;
msleep(1);
}
return false;
}
static bool wait_for_probe(void)
{
unsigned long deadline = jiffies + msecs_to_jiffies(STATE_WAIT_MS);
while (time_before(jiffies, deadline)) {
if (atomic_read(&probe_hit))
return true;
msleep(1);
}
return false;
}
/*
* Never unload while a worker remains asleep. If the original wakeup was
* lost, temporarily lock and unlock the now-unlocked folio to wake it.
*/
static bool drain_workers(void)
{
int i;
atomic_set(&release_probe, 1);
if (initial_lock_held) {
initial_lock_held = false;
folio_unlock(test_folio);
}
for (i = 0; i < 100; ++i) {
if ((!first_task || completion_done(&first_done)) &&
(!second_task || completion_done(&second_done)))
return true;
if (folio_trylock(test_folio))
folio_unlock(test_folio);
msleep(10);
}
pr_err(PREFIX "cleanup failed: a worker is still blocked; "
"module must remain loaded\n");
return false;
}
static int __init wakeup_test_init(void)
{
int ret;
bool a_done, b_done, lost;
int cpu, coord_cpu;
cpumask_var_t original_affinity;
bool affinity_changed = false;
pr_info(PREFIX "start\n");
if (num_online_cpus() < 2 ||
cpumask_weight(current->cpus_ptr) < 2) {
pr_err(PREFIX "need two available online CPUs\n");
return -EINVAL;
}
if (!alloc_cpumask_var(&original_affinity, GFP_KERNEL))
return -ENOMEM;
cpumask_copy(original_affinity, current->cpus_ptr);
coord_cpu = cpumask_first(original_affinity);
cpu = cpumask_next(coord_cpu, original_affinity);
if (cpu >= nr_cpu_ids || !cpu_online(coord_cpu) ||
!cpu_online(cpu)) {
free_cpumask_var(original_affinity);
return -EINVAL;
}
ret = set_cpus_allowed_ptr(current, cpumask_of(coord_cpu));
if (ret) {
free_cpumask_var(original_affinity);
return ret;
}
affinity_changed = true;
test_folio = folio_alloc(GFP_KERNEL, 0);
if (!test_folio) {
set_cpus_allowed_ptr(current, original_affinity);
free_cpumask_var(original_affinity);
return -ENOMEM;
}
folio_lock(test_folio);
initial_lock_held = true;
ret = register_kprobe(&finish_probe);
if (ret) {
pr_err(PREFIX "register_kprobe(finish_wait): %d\n", ret);
goto out_no_probe;
}
first_task = kthread_create(first_fn, NULL, "folio-wait-a");
if (IS_ERR(first_task)) {
ret = PTR_ERR(first_task);
first_task = NULL;
goto out_probe;
}
kthread_bind(first_task, cpu);
wake_up_process(first_task);
if (!wait_for_state(first_task, TASK_KILLABLE)) {
pr_err(PREFIX "first task did not block killably\n");
goto inconclusive;
}
second_task = kthread_run(second_fn, NULL, "folio-wait-b");
if (IS_ERR(second_task)) {
ret = PTR_ERR(second_task);
second_task = NULL;
pr_err(PREFIX "second thread creation: %d\n", ret);
goto inconclusive;
}
if (!wait_for_state(second_task, TASK_UNINTERRUPTIBLE)) {
pr_err(PREFIX "second task did not block\n");
goto inconclusive;
}
/* A is the first exclusive waiter; B is behind it. */
ret = send_sig(SIGKILL, first_task, 1);
if (ret) {
pr_err(PREFIX "send_sig: %d\n", ret);
goto inconclusive;
}
if (!wait_for_probe()) {
pr_err(PREFIX "did not reach finish_wait probe\n");
goto inconclusive;
}
if (!(READ_ONCE(flags_before) & WQ_FLAG_EXCLUSIVE) ||
(READ_ONCE(flags_before) &
(WQ_FLAG_WOKEN | WQ_FLAG_DONE | WQ_FLAG_CUSTOM))) {
pr_warn(PREFIX "wrong initial wait flags: %#x\n",
READ_ONCE(flags_before));
goto inconclusive;
}
/* A is halted just before finish_wait. Unlock wakes A, not B. */
folio_unlock(test_folio);
initial_lock_held = false;
atomic_set(&release_probe, 1);
a_done = wait_for_completion_timeout(&first_done,
msecs_to_jiffies(RESULT_WAIT_MS));
b_done = wait_for_completion_timeout(&second_done,
msecs_to_jiffies(RESULT_WAIT_MS));
lost = a_done && !b_done && READ_ONCE(first_ret) == -EINTR &&
!folio_test_locked(test_folio);
pr_info(PREFIX "first=%d first_done=%d second_done=%d "
"flags=%#x->%#x probe_timeout=%d locked=%d\n",
READ_ONCE(first_ret), a_done, b_done,
READ_ONCE(flags_before), READ_ONCE(flags_after),
atomic_read(&probe_expired), folio_test_locked(test_folio));
if (atomic_read(&probe_expired) ||
!(READ_ONCE(flags_after) & WQ_FLAG_WOKEN))
pr_warn(PREFIX "INCONCLUSIVE: wakeup not synchronized\n");
else if (lost)
pr_err(PREFIX "REPRODUCED: second waiter asleep "
"on unlocked folio\n");
else if (a_done && b_done && READ_ONCE(first_ret) == 0 &&
READ_ONCE(second_got_lock))
pr_info(PREFIX "PASS: first waiter took lock; "
"second waiter progressed\n");
else
pr_warn(PREFIX "INCONCLUSIVE: unexpected completion state\n");
goto out_probe;
inconclusive:
pr_warn(PREFIX "INCONCLUSIVE: setup or timing failed\n");
out_probe:
if (!drain_workers()) {
/* Do not free module text or folio while workers run. */
pr_emerg(PREFIX "unrecoverable blocked thread: "
"module pinned; reboot test VM\n");
__module_get(THIS_MODULE);
if (affinity_changed)
set_cpus_allowed_ptr(current, original_affinity);
free_cpumask_var(original_affinity);
return 0;
}
if (first_task)
kthread_stop(first_task);
if (second_task)
kthread_stop(second_task);
unregister_kprobe(&finish_probe);
out_no_probe:
if (initial_lock_held)
folio_unlock(test_folio);
folio_put(test_folio);
test_folio = NULL;
if (affinity_changed)
set_cpus_allowed_ptr(current, original_affinity);
free_cpumask_var(original_affinity);
return ret < 0 && !first_task && !second_task ? ret : 0;
}
static void __exit wakeup_test_exit(void)
{
if (test_folio)
pr_emerg(PREFIX "threads still active, unsafe unload\n");
}
module_init(wakeup_test_init);
module_exit(wakeup_test_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("folio exclusive-waiter signal lost-wakeup reproducer");
obj-m += folio-wakeup-repro.o
KDIR ?= /lib/modules/$(shell uname -r)/build
.PHONY: all clean
all:
$(MAKE) -C $(KDIR) M=$(CURDIR) modules
clean:
$(MAKE) -C $(KDIR) M=$(CURDIR) clean
next prev parent reply other threads:[~2026-10-28 2:17 UTC|newest]
Thread overview: 166+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-26 23:17 [PATCH 00/46] mm: various (urgent?) fixes David Hildenbrand (Arm)
2026-10-26 23:17 ` [PATCH 01/46] mm/mglru: don't use stack pointers when walking PUD and PMD tables David Hildenbrand (Arm)
2026-10-27 1:32 ` Rik van Riel
2026-10-27 3:05 ` Qi Zheng
2026-10-27 7:20 ` Dev Jain
2026-10-27 8:06 ` Lorenzo Stoakes (ARM)
2026-10-27 19:06 ` David Hildenbrand (Arm)
2026-10-28 16:54 ` Kairui Song
2026-10-27 10:22 ` Kairui Song
2026-10-27 20:07 ` Harry Yoo
2026-10-27 20:24 ` Barry Song
2026-10-28 8:24 ` Baolin Wang
2026-10-28 10:29 ` Pedro Falcato
2026-10-28 16:09 ` Kiryl Shutsemau
2026-10-26 23:17 ` [PATCH 02/46] fork: take mmap_lock before copying mm_struct David Hildenbrand (Arm)
2026-10-27 1:38 ` Rik van Riel
2026-10-27 8:18 ` Vlastimil Babka (SUSE)
2026-10-27 9:45 ` Barry Song
2026-10-27 10:38 ` Pedro Falcato
2026-10-27 19:07 ` David Hildenbrand (Arm)
2026-10-27 19:48 ` Barry Song
2026-10-28 8:20 ` David Hildenbrand (Arm)
2026-10-28 12:55 ` Pedro Falcato
2026-10-27 13:56 ` Harry Yoo
2026-10-28 16:19 ` Kiryl Shutsemau
2026-10-26 23:17 ` [PATCH 03/46] mm/memfd: check for real shmem inodes before accessing shmem state David Hildenbrand (Arm)
2026-10-27 2:04 ` Rik van Riel
2026-10-27 8:13 ` Mike Rapoport
2026-10-27 13:42 ` David Hildenbrand (Arm)
2026-10-27 14:41 ` Pratyush Yadav
2026-10-28 16:53 ` Pasha Tatashin
2026-10-26 23:17 ` [PATCH 04/46] mm/memfd: make f_pos accesses atomic David Hildenbrand (Arm)
2026-10-27 2:06 ` Rik van Riel
2026-10-27 3:34 ` Gregory Price
2026-10-27 8:44 ` Lorenzo Stoakes (ARM)
2026-10-27 19:09 ` David Hildenbrand (Arm)
2026-10-27 8:15 ` Mike Rapoport
2026-10-27 8:46 ` Lorenzo Stoakes (ARM)
2026-10-27 10:39 ` Pedro Falcato
2026-10-28 16:40 ` Kiryl Shutsemau
2026-10-28 16:55 ` Pasha Tatashin
2026-10-26 23:17 ` [PATCH 05/46] mm/truncate: look again if a folio left the mapping David Hildenbrand (Arm)
2026-10-27 2:17 ` Rik van Riel
2026-10-28 16:54 ` Kiryl Shutsemau
2026-10-26 23:17 ` [PATCH 06/46] mm/filemap: read mapping->a_ops->free_folio under i_lock David Hildenbrand (Arm)
2026-10-27 2:43 ` Rik van Riel
2026-10-27 19:10 ` David Hildenbrand (Arm)
2026-10-27 15:47 ` Pedro Falcato
2026-10-26 23:17 ` [PATCH 07/46] mm/filemap: don't lose a folio lock wakeup to a signal David Hildenbrand (Arm)
2026-10-27 3:03 ` Rik van Riel
2026-10-27 16:10 ` Pedro Falcato
2026-10-27 19:18 ` David Hildenbrand (Arm)
2026-10-28 2:17 ` Andrew Morton [this message]
2026-10-27 22:02 ` Rik van Riel
2026-10-26 23:17 ` [PATCH 08/46] mm/filemap: finish fault cleanup before dropping the fault lock David Hildenbrand (Arm)
2026-10-28 19:26 ` Thadeu Lima de Souza Cascardo
2026-10-26 23:17 ` [PATCH 09/46] mm/rmap: handle device-exclusive entries in folio_referenced_one() David Hildenbrand (Arm)
2026-10-27 20:25 ` Harry Yoo
2026-10-27 21:22 ` Barry Song
2026-10-28 7:51 ` Dev Jain
2026-10-28 8:08 ` David Hildenbrand (Arm)
2026-10-28 9:09 ` Lorenzo Stoakes (ARM)
2026-10-26 23:17 ` [PATCH 10/46] mm/huge_memory: fix list corruption when deferred_split_scan() races with deferred_split_folio() David Hildenbrand (Arm)
2026-10-27 14:10 ` Johannes Weiner
2026-10-27 15:15 ` David Hildenbrand (Arm)
2026-10-27 18:03 ` Mani Tofigh
2026-10-27 19:19 ` David Hildenbrand (Arm)
2026-10-28 0:14 ` Mani Tofigh
2026-10-28 10:41 ` Lance Yang
2026-10-26 23:17 ` [PATCH 11/46] mm/huge_memory: properly handle refcounted PUD mappings on fork David Hildenbrand (Arm)
2026-10-27 21:10 ` Zi Yan
2026-10-28 13:05 ` Pedro Falcato
2026-10-28 13:12 ` Lance Yang
2026-10-26 23:17 ` [PATCH 12/46] mm/huge_memory: fix livelock on device private folio David Hildenbrand (Arm)
2026-10-28 2:08 ` Zi Yan
2026-10-28 15:04 ` Lance Yang
2026-10-26 23:17 ` [PATCH 13/46] mm/huge_memory: fix truncate racing with PMD zapping David Hildenbrand (Arm)
2026-10-28 2:54 ` Zi Yan
2026-10-28 8:16 ` David Hildenbrand (Arm)
2026-10-28 12:43 ` Pedro Falcato
2026-10-28 15:54 ` Lance Yang
2026-10-26 23:17 ` [PATCH 14/46] mm/huge_memory: fix zapping migration entries for device-private THPs David Hildenbrand (Arm)
2026-10-28 2:58 ` Zi Yan
2026-10-28 8:25 ` Dev Jain
2026-10-26 23:17 ` [PATCH 15/46] mm/khugepaged: always recheck the pmd in try_collapse_pte_mapped_thp() David Hildenbrand (Arm)
2026-10-26 23:17 ` [PATCH 16/46] mm/khugepaged: fix PMD table lock leak " David Hildenbrand (Arm)
2026-10-26 23:17 ` [PATCH 17/46] mm/khugepaged: preserve dirty bits when collapsing PTE-mapped THPs David Hildenbrand (Arm)
2026-10-28 13:30 ` Pedro Falcato
2026-10-26 23:17 ` [PATCH 18/46] mm/khugepaged: check if PTE table is empty in try_collapse_pte_mapped_thp() David Hildenbrand (Arm)
2026-10-26 23:17 ` [PATCH 19/46] mm/gup: recheck the PUD under PTL in follow_pud_mask() David Hildenbrand (Arm)
2026-10-26 23:17 ` [PATCH 20/46] mm/gup: fix clearing folios in memfd_pin_folios() David Hildenbrand (Arm)
2026-10-27 15:00 ` Pratyush Yadav
2026-10-27 19:20 ` David Hildenbrand (Arm)
2026-10-28 11:40 ` Pratyush Yadav
2026-10-27 19:43 ` Samiullah Khawaja
2026-10-26 23:17 ` [PATCH 21/46] mm/gup: fix out-of-bounds write for nr_pages == 0 in GUP-fast David Hildenbrand (Arm)
2026-10-27 9:37 ` Lorenzo Stoakes (ARM)
2026-10-27 9:40 ` Muchun Song
2026-10-26 23:17 ` [PATCH 22/46] mm/gup: check for overflow when converting nr_pages to bytes " David Hildenbrand (Arm)
2026-10-27 9:34 ` Lorenzo Stoakes (ARM)
2026-10-27 9:44 ` Muchun Song
2026-10-27 21:31 ` Barry Song
2026-10-26 23:17 ` [PATCH 23/46] mm/userfaultfd: write-lock the VMA before waking waiters when unregistering David Hildenbrand (Arm)
2026-10-27 8:16 ` Mike Rapoport
2026-10-27 8:43 ` Lorenzo Stoakes (ARM)
2026-10-27 17:38 ` Suren Baghdasaryan
2026-10-27 19:21 ` David Hildenbrand (Arm)
2026-10-26 23:17 ` [PATCH 24/46] mm/userfaultfd: wake all waiters on unregister David Hildenbrand (Arm)
2026-10-27 8:17 ` Mike Rapoport
2026-10-27 8:36 ` Lorenzo Stoakes (ARM)
2026-10-26 23:17 ` [PATCH 25/46] mm/userfaultfd: wake waiters when registration modes are removed David Hildenbrand (Arm)
2026-10-27 5:10 ` Gregory Price
2026-10-27 8:24 ` Lorenzo Stoakes (ARM)
2026-10-27 19:31 ` David Hildenbrand (Arm)
2026-10-27 8:21 ` Mike Rapoport
2026-10-27 8:31 ` Lorenzo Stoakes (ARM)
2026-10-26 23:17 ` [PATCH 26/46] mm/mmu_gather: fix flushing ranges with 4 GiB or larger David Hildenbrand (Arm)
2026-10-27 3:06 ` Qi Zheng
2026-10-27 3:40 ` Gregory Price
2026-10-27 7:35 ` Dev Jain
2026-10-27 19:25 ` David Hildenbrand (Arm)
2026-10-27 9:50 ` Muchun Song
2026-10-27 15:42 ` Pedro Falcato
2026-10-26 23:17 ` [PATCH 27/46] mm/mmu_notifier: finish non-blocking interval invalidation on error David Hildenbrand (Arm)
2026-10-27 9:33 ` Lorenzo Stoakes (ARM)
2026-10-26 23:17 ` [PATCH 28/46] mm/mmu_notifier: set ->mm only after mmgrab() David Hildenbrand (Arm)
2026-10-27 3:42 ` Gregory Price
2026-10-27 8:50 ` Lorenzo Stoakes (ARM)
2026-10-26 23:17 ` [PATCH 29/46] mm/mremap: use pudp_huge_get_and_clear() when moving huge PUDs David Hildenbrand (Arm)
2026-10-28 13:28 ` Pedro Falcato
2026-10-26 23:17 ` [PATCH 30/46] mm/mremap: recheck PUDs under the page table lock David Hildenbrand (Arm)
2026-10-28 13:26 ` Pedro Falcato
2026-10-26 23:17 ` [PATCH 31/46] mm/mremap: fix moving PUD leaves David Hildenbrand (Arm)
2026-10-28 13:20 ` Pedro Falcato
2026-10-26 23:17 ` [PATCH 32/46] mm/memory_hotplug: avoid races in pfn_to_online_page() with dying pgmap David Hildenbrand (Arm)
2026-10-27 12:13 ` Lance Yang
2026-10-27 19:41 ` David Hildenbrand (Arm)
2026-10-28 4:32 ` Lance Yang
2026-10-26 23:17 ` [PATCH 33/46] mm/madvise: fix data loss from MADV_FREE on a KSM page David Hildenbrand (Arm)
2026-10-26 23:17 ` [PATCH 34/46] mm/memory: reject remote COW faults on PFN mappings David Hildenbrand (Arm)
2026-10-27 16:34 ` Pedro Falcato
2026-10-26 23:17 ` [PATCH 35/46] mm: fix unmap_mapping_range() beyond 4 GiB on 32-bit David Hildenbrand (Arm)
2026-10-27 16:27 ` Pedro Falcato
2026-10-26 23:17 ` [PATCH 36/46] mm: fix unkillable fault loop on MAP_DROPPABLE memory David Hildenbrand (Arm)
2026-10-26 23:17 ` [PATCH 37/46] mm: fix deadlock of mremap() against UFFDIO_MOVE David Hildenbrand (Arm)
2026-10-27 9:23 ` Lorenzo Stoakes (ARM)
2026-10-27 9:46 ` Muchun Song
2026-10-26 23:17 ` [PATCH 38/46] mm/ksm: reset the unstable trees of all nodes David Hildenbrand (Arm)
2026-10-27 9:14 ` Lorenzo Stoakes (ARM)
2026-10-28 16:56 ` Pasha Tatashin
2026-10-26 23:17 ` [PATCH 39/46] mm/ksm: fix use of a freed anon_vma at swap-in David Hildenbrand (Arm)
2026-10-26 23:18 ` [PATCH 40/46] mm/ksm: check large swap-cache folios before mapping them David Hildenbrand (Arm)
2026-10-27 9:00 ` Lorenzo Stoakes (ARM)
2026-10-26 23:18 ` [PATCH 41/46] mm/vma: call ->may_split() before a partial merge David Hildenbrand (Arm)
2026-10-27 3:45 ` Gregory Price
2026-10-26 23:18 ` [PATCH 42/46] mm/huge_memory: split huge PUDs when adjusting VMA boundaries David Hildenbrand (Arm)
2026-10-26 23:18 ` [PATCH 43/46] mm/vma: don't leak the charge for stack growth David Hildenbrand (Arm)
2026-10-27 16:25 ` Pedro Falcato
2026-10-27 20:32 ` Harry Yoo
2026-10-28 8:18 ` David Hildenbrand (Arm)
2026-10-26 23:18 ` [PATCH 44/46] mm/cma: don't release CMA pages still in use David Hildenbrand (Arm)
2026-10-27 8:55 ` Lorenzo Stoakes (ARM)
2026-10-27 9:48 ` Muchun Song
2026-10-26 23:18 ` [PATCH 45/46] mm/memory-tiers: unregister empty tiers outside memory_tier_lock David Hildenbrand (Arm)
2026-10-26 23:18 ` [PATCH 46/46] fs/proc/task_mmu: refuse addresses beyond 32 bits on 32bit David Hildenbrand (Arm)
2026-10-27 16:13 ` Pedro Falcato
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261027191737.c757411fbe53f98b1596eebd@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=aneesh.kumar@kernel.org \
--cc=apopple@nvidia.com \
--cc=axelrasmussen@google.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=baoquan.he@linux.dev \
--cc=chengming.zhou@linux.dev \
--cc=chrisl@kernel.org \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=gourry@gourry.net \
--cc=hannes@cmpxchg.org \
--cc=harry@kernel.org \
--cc=hughd@google.com \
--cc=jack@suse.cz \
--cc=jannh@google.com \
--cc=jgg@ziepe.ca \
--cc=jhubbard@nvidia.com \
--cc=josef@toxicpanda.com \
--cc=joshua.hahnjy@gmail.com \
--cc=kas@kernel.org \
--cc=kasong@tencent.com \
--cc=kees@kernel.org \
--cc=kexec@lists.infradead.org \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=matthew.brost@intel.com \
--cc=mhocko@kernel.org \
--cc=mhocko@suse.com \
--cc=minchan@kernel.org \
--cc=muchun.song@linux.dev \
--cc=nico.pache@linux.dev \
--cc=nphamcs@gmail.com \
--cc=npiggin@gmail.com \
--cc=osalvador@suse.de \
--cc=pasha.tatashin@soleen.com \
--cc=peterx@redhat.com \
--cc=peterz@infradead.org \
--cc=pfalcato@suse.de \
--cc=pratyush@kernel.org \
--cc=qi.zheng@linux.dev \
--cc=rakie.kim@sk.com \
--cc=riel@surriel.com \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shakeel.butt@linux.dev \
--cc=shikemeng@huaweicloud.com \
--cc=stable@vger.kernel.org \
--cc=surenb@google.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=weixugc@google.com \
--cc=will@kernel.org \
--cc=willy@infradead.org \
--cc=xu.xin@linux.dev \
--cc=ying.huang@linux.alibaba.com \
--cc=youngjun.park@lge.com \
--cc=yuanchu@google.com \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox