Skip to content

Commit 0c2988a

Browse files
Dev Jainctmarinas
authored andcommitted
arm64/mm: Document why linear map split failure upon vm_reset_perms is not problematic
Consider the following code path: (1) vmalloc -> (2) set_vm_flush_reset_perms -> (3) set_memory_ro/set_memory_rox -> .... (4) use the mapping .... -> (5) vfree -> (6) vm_reset_perms -> (7) set_area_direct_map. Or, it may happen that we encounter failure at (3) and directly jump to (5). In both cases, (7) may fail due to linear map split failure. But, we care about its success *only* for the region which got successfully changed by (3). Such a region is guaranteed to be pte-mapped. The TLDR is that (7) will surely succeed for the regions we care about. Signed-off-by: Dev Jain <dev.jain@arm.com> Reviewed-by: Ryan Roberts <ryan.roberts@arm.com> Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
1 parent e5efd56 commit 0c2988a

1 file changed

Lines changed: 9 additions & 0 deletions

File tree

arch/arm64/mm/pageattr.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,15 @@ static int change_memory_common(unsigned long addr, int numpages,
185185
*/
186186
if (rodata_full && (pgprot_val(set_mask) == PTE_RDONLY ||
187187
pgprot_val(clear_mask) == PTE_RDONLY)) {
188+
/*
189+
* Note: One may wonder what happens if the calls to
190+
* set_area_direct_map() in vm_reset_perms() fail due ENOMEM on
191+
* linear map split failure. Observe that we care about those
192+
* calls to succeed *only* for the region whose permissions
193+
* are not default. Such a region is guaranteed to be
194+
* pte-mapped, because the below call can change those
195+
* permissions to non-default only after splitting that region.
196+
*/
188197
for (i = 0; i < area->nr_pages; i++) {
189198
ret = __change_memory_common((u64)page_address(area->pages[i]),
190199
PAGE_SIZE, set_mask, clear_mask);

0 commit comments

Comments
 (0)