Re: [PATCH 1/2] arm64/pageattr: Propagate return value from __change_memory_common

From: Dev Jain

Date: Wed Nov 19 2025 - 23:10:44 EST



On 19/11/25 11:33 pm, Catalin Marinas wrote:
On Wed, Nov 12, 2025 at 11:57:15AM +0530, Dev Jain wrote:
The rodata=on security measure requires that any code path which does
vmalloc -> set_memory_ro/set_memory_rox must protect the linear map alias
too. Therefore, if such a call fails, we must abort set_memory_* and caller
must take appropriate action; currently we are suppressing the error, and
there is a real chance of such an error arising post commit a166563e7ec3
("arm64: mm: support large block mapping when rodata=full"). Therefore,
propagate any error to the caller.

Fixes: a166563e7ec3 ("arm64: mm: support large block mapping when rodata=full")
Signed-off-by: Dev Jain <dev.jain@xxxxxxx>
---
v1 of this patch: https://lore.kernel.org/all/20251103061306.82034-1-dev.jain@xxxxxxx/
I have dropped stable since no real chance of failure was there.
I couldn't figure out from the comments on v1 whether Will's concern was
addressed:

https://lore.kernel.org/all/aQn4EwKar66UZ7rz@willie-the-truck/

IOW, is the patch necessary? What are the failure scenarios and what

The patch is necessary because rodata=on requires us to proceed with
set_memory_* *only* if the linear map alias permission change was successful.
If we still go ahead with the set_memory_*, you now have memory in
RO state, whereas the linear map alias is in RW state, defeating the purpose
of rodata = on.

does the caller do? It's good to propagate an error to the caller but
patch also changes the current behaviour by bailing out earlier.

The caller will get to know that set_memory_* failed. Since we may have
bailed out partially in between the linear map alias permission change,
we must also ensure that we change that memory back to RW - vm_reset_perms()
will ensure that, and that change back to RW is *guaranteed* to succeed
in the calls to set_area_direct_map() in vm_reset_perms(): as explained
in the next patch, since that memory is non-RW, it is guaranteed to be
pte-mapped.

Now, it is the responsibility of the caller to pass VM_FLUSH_RESET_PERMS
*before* it does set_memory_ro/set_memory_rox. If it doesn't, then the
code is broken as is (Ryan noted earlier how this is a fragility in the
vmalloc API and we should do something about it).