[PATCH 4/7] maccess: Use a scoped guard for page faults

From: Muhammad Usama Anjum

Date: Mon Aug 24 2026 - 12:11:35 EST


Kernel nofault copy and string paths open-code page-fault disable and
enable around label-based loops, duplicating cleanup on success and
failure.

Use a page-fault scope guard instead. Leaving the scope now re-enables
page faults on both paths without separate cleanup at the fault label.

No functional change.

Signed-off-by: Muhammad Usama Anjum <usama.anjum@xxxxxxx>
---
mm/maccess.c | 53 +++++++++++++++++++++++++---------------------------
1 file changed, 25 insertions(+), 28 deletions(-)

diff --git a/mm/maccess.c b/mm/maccess.c
index c59a0e092d24a..f695ceefe6fcc 100644
--- a/mm/maccess.c
+++ b/mm/maccess.c
@@ -38,18 +38,17 @@ long copy_from_kernel_nofault(void *dst, const void *src, size_t size)
if (!size)
return 0;

- pagefault_disable();
- if (!(align & 7))
- copy_from_kernel_nofault_loop(dst, src, size, u64, Efault);
- if (!(align & 3))
- copy_from_kernel_nofault_loop(dst, src, size, u32, Efault);
- if (!(align & 1))
- copy_from_kernel_nofault_loop(dst, src, size, u16, Efault);
- copy_from_kernel_nofault_loop(dst, src, size, u8, Efault);
- pagefault_enable();
+ scoped_guard(pagefault) {
+ if (!(align & 7))
+ copy_from_kernel_nofault_loop(dst, src, size, u64, Efault);
+ if (!(align & 3))
+ copy_from_kernel_nofault_loop(dst, src, size, u32, Efault);
+ if (!(align & 1))
+ copy_from_kernel_nofault_loop(dst, src, size, u16, Efault);
+ copy_from_kernel_nofault_loop(dst, src, size, u8, Efault);
+ }
return 0;
Efault:
- pagefault_enable();
return -EFAULT;
}
EXPORT_SYMBOL_GPL(copy_from_kernel_nofault);
@@ -73,18 +72,17 @@ long copy_to_kernel_nofault(void *dst, const void *src, size_t size)
if (!IS_ENABLED(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS))
align = (unsigned long)dst | (unsigned long)src;

- pagefault_disable();
- if (!(align & 7))
- copy_to_kernel_nofault_loop(dst, src, size, u64, Efault);
- if (!(align & 3))
- copy_to_kernel_nofault_loop(dst, src, size, u32, Efault);
- if (!(align & 1))
- copy_to_kernel_nofault_loop(dst, src, size, u16, Efault);
- copy_to_kernel_nofault_loop(dst, src, size, u8, Efault);
- pagefault_enable();
+ scoped_guard(pagefault) {
+ if (!(align & 7))
+ copy_to_kernel_nofault_loop(dst, src, size, u64, Efault);
+ if (!(align & 3))
+ copy_to_kernel_nofault_loop(dst, src, size, u32, Efault);
+ if (!(align & 1))
+ copy_to_kernel_nofault_loop(dst, src, size, u16, Efault);
+ copy_to_kernel_nofault_loop(dst, src, size, u8, Efault);
+ }
return 0;
Efault:
- pagefault_enable();
return -EFAULT;
}

@@ -97,18 +95,17 @@ long strncpy_from_kernel_nofault(char *dst, const void *unsafe_addr, long count)
if (!copy_from_kernel_nofault_allowed(unsafe_addr, count))
return -ERANGE;

- pagefault_disable();
- do {
- __get_kernel_nofault(dst, src, u8, Efault);
- dst++;
- src++;
- } while (dst[-1] && src - unsafe_addr < count);
- pagefault_enable();
+ scoped_guard(pagefault) {
+ do {
+ __get_kernel_nofault(dst, src, u8, Efault);
+ dst++;
+ src++;
+ } while (dst[-1] && src - unsafe_addr < count);
+ }

dst[-1] = '\0';
return src - unsafe_addr;
Efault:
- pagefault_enable();
dst[0] = '\0';
return -EFAULT;
}
--
2.47.3