]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Merge branch 'for-next/set_memory' into for-next/core
authorCatalin Marinas <catalin.marinas@arm.com>
Fri, 28 Nov 2025 15:48:03 +0000 (15:48 +0000)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 28 Nov 2025 15:48:03 +0000 (15:48 +0000)
* 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

1  2 
arch/arm64/mm/pageattr.c

index fe6fdc6249e32852dc5090df62a855fa57c1c7f9,dc05f06a47f2c60f2e098f9e9f4d4b01d47131ea..f0e784b963e6909e678c5e347c5084f1178c6e50
@@@ -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 i;
+       int ret;
  
        if (!PAGE_ALIGNED(addr)) {
                start &= PAGE_MASK;
         */
        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;
                }
        }