[PATCH 4/7] maccess: Use a scoped guard to re-enable page faults
From: Muhammad Usama Anjum
Date: Mon Aug 24 2026 - 12:11:49 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