From: Catalin Marinas Date: Fri, 28 Nov 2025 15:48:03 +0000 (+0000) Subject: Merge branch 'for-next/set_memory' into for-next/core X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=edde060637b92607f3522252c03d64ad06369933;p=thirdparty%2Fkernel%2Flinux.git Merge branch 'for-next/set_memory' into for-next/core * for-next/set_memory: : Fix + documentation for the arm64 change_memory_common() arm64/mm: Document why linear map split failure upon vm_reset_perms is not problematic arm64/pageattr: Propagate return value from __change_memory_common --- edde060637b92607f3522252c03d64ad06369933 diff --cc arch/arm64/mm/pageattr.c index fe6fdc6249e32,dc05f06a47f2c..f0e784b963e69 --- a/arch/arm64/mm/pageattr.c +++ b/arch/arm64/mm/pageattr.c @@@ -148,6 -148,8 +148,7 @@@ static int change_memory_common(unsigne unsigned long size = PAGE_SIZE * numpages; unsigned long end = start + size; struct vm_struct *area; + int ret; - int i; if (!PAGE_ALIGNED(addr)) { start &= PAGE_MASK; @@@ -183,11 -185,20 +184,13 @@@ */ if (rodata_full && (pgprot_val(set_mask) == PTE_RDONLY || pgprot_val(clear_mask) == PTE_RDONLY)) { - /* - * Note: One may wonder what happens if the calls to - * set_area_direct_map() in vm_reset_perms() fail due ENOMEM on - * linear map split failure. Observe that we care about those - * calls to succeed *only* for the region whose permissions - * are not default. Such a region is guaranteed to be - * pte-mapped, because the below call can change those - * permissions to non-default only after splitting that region. - */ - for (i = 0; i < area->nr_pages; i++) { - ret = __change_memory_common((u64)page_address(area->pages[i]), - PAGE_SIZE, set_mask, clear_mask); + unsigned long idx = (start - (unsigned long)kasan_reset_tag(area->addr)) + >> PAGE_SHIFT; + for (; numpages; idx++, numpages--) { - __change_memory_common((u64)page_address(area->pages[idx]), - PAGE_SIZE, set_mask, clear_mask); ++ ret = __change_memory_common((u64)page_address(area->pages[idx]), ++ PAGE_SIZE, set_mask, clear_mask); + if (ret) + return ret; } }