From: Pedro Falcato <pfalcato@suse.de>
To: Nickolai Zeldovich <nickolai@csail.mit.edu>
Cc: Andrew Morton <akpm@linux-foundation.org>,
"Liam R. Howlett" <liam@infradead.org>,
Lorenzo Stoakes <ljs@kernel.org>,
Vlastimil Babka <vbabka@kernel.org>,
Jann Horn <jannh@google.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v1] mm/mlock: use a long for the page count in mlock_fixup()
Date: Wed, 14 Oct 2026 15:08:25 +0100 [thread overview]
Message-ID: <as-MrR-l80xoMnWE@pedro-suse.tail5790ac.ts.net> (raw)
In-Reply-To: <20261014131358.780240-1-nickolai@csail.mit.edu>
On Wed, Oct 14, 2026 at 09:13:58AM -0400, Nickolai Zeldovich wrote:
> mlock_fixup() adjusts mm->locked_vm, an unsigned long, by the number of
> pages whose VM_LOCKED state it changes, but computes that number in an
> int:
>
> int nr_pages;
> ...
> nr_pages = (end - start) >> PAGE_SHIFT;
> ...
> mm->locked_vm += nr_pages;
>
> When a single VMA range of 2^31 pages (8 TiB with 4 KiB pages) or more
> is locked or unlocked, the count is truncated to 32 bits and then
> sign-extended, so locked_vm is changed by the wrong amount, while
> munmap(), mremap() and the other paths that maintain locked_vm use the
> full unsigned long page count.
>
> Such a range is reachable on 64-bit architectures with a 47-bit or
> larger user address space (x86_64, arm64 with 48-bit VA, riscv64 Sv48)
> by a task with CAP_IPC_LOCK or a raised RLIMIT_MEMLOCK, which do_mlock()
> checks against the full untruncated length. It costs nothing with
> MAP_NORESERVE and MLOCK_ONFAULT/MCL_ONFAULT, since then no page is
> populated. On x86_64, after
>
> p = mmap(NULL, 8UL << 40, PROT_READ | PROT_WRITE,
> MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0);
> mlock2(p, 8UL << 40, MLOCK_ONFAULT);
>
> VmLck in /proc/self/status reads 18446744065119617024 kB instead of
> 8589934592 kB; munmap() of the region then subtracts the true size and
> leaves VmLck at 18446744056529682432 kB instead of 0. With 16 TiB,
> locked_vm is not changed at all, VmLck stays 0 kB, and after the task
> drops CAP_IPC_LOCK or lowers RLIMIT_MEMLOCK, mlock(), mmap(MAP_LOCKED)
> and the other mlock_future_ok() and account_locked_vm() users enforce
> RLIMIT_MEMLOCK against that count, so they let the task lock memory
> beyond its limit (or, in the 8 TiB case, refuse every further lock).
> The error persists for the life of the mm; unlocking the range in pieces
> skews it further. The wrong count is per-mm accounting only: it does
> not change which pages are locked.
>
> The int has been there since before git history (the variable was named
> "pages" until it was renamed in 2.6.28); every other updater of
> locked_vm uses an unsigned long or long count. Make nr_pages a long,
> which holds the page count of any user range and its negation, so the
> existing sign handling is unchanged.
>
> Found by formal verification of mm/mlock.c against the kernel binary.
>
> Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
> Assisted-by: LLM
> Signed-off-by: Nickolai Zeldovich <nickolai@csail.mit.edu>
Reviewed-by: Pedro Falcato <pfalcato@suse.de>
LGTM, thanks!
--
Pedro
prev parent reply other threads:[~2026-10-14 14:08 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-14 13:13 Nickolai Zeldovich
2026-10-14 14:08 ` Pedro Falcato [this message]
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=as-MrR-l80xoMnWE@pedro-suse.tail5790ac.ts.net \
--to=pfalcato@suse.de \
--cc=akpm@linux-foundation.org \
--cc=jannh@google.com \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=nickolai@csail.mit.edu \
--cc=vbabka@kernel.org \
/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
all inboxes | Powered by JetHome®