Re: [PATCH v15 5/9] mm/hwpoison: return -EFAULT when copy fail in copy_mc_[user]_highpage()
From: Ashok Raj <hidden>
Date: 2026-07-02 14:37:57
Also in:
linux-arm-kernel, lkml
On Thu, Jun 18, 2026 at 05:21:19PM +0800, Ruidong Tian wrote:
From: Tong Tiangen <redacted> Currently, copy_mc_[user]_highpage() returns zero on success, or in case of failures, the number of bytes that weren't copied. While tracking the number of not copied works fine for x86 and PPC, There are some difficulties in doing the same thing on ARM64 because there is no available caller-saved register in copy_page()(lib/copy_page.S) to save "bytes not copied", and the following copy_mc_page() will also encounter the same problem. Consider the caller of copy_mc_[user]_highpage() cannot do any processing on the remaining data(The page has hardware errors), they only check if copy was succeeded or not, make the interface more generic by using an error code when copy fails (-EFAULT) or return zero on success.
Agreed on the rationale -- none of the callers can act on partial byte count, so a plain success/-EFAULT is better contract.
quoted hunk ↗ jump to hunk
Signed-off-by: Tong Tiangen <redacted> Reviewed-by: Jonathan Cameron <redacted> Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> Reviewed-by: Shuai Xue <xueshuai@linux.alibaba.com> --- include/linux/highmem.h | 8 ++++---- mm/khugepaged.c | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-)diff --git a/include/linux/highmem.h b/include/linux/highmem.h index af03db851a1d..18dc4aca4aa1 100644 --- a/include/linux/highmem.h +++ b/include/linux/highmem.h@@ -427,8 +427,8 @@ static inline void copy_highpage(struct page *to, struct page *from) /* * If architecture supports machine check exception handling, define the * #MC versions of copy_user_highpage and copy_highpage. They copy a memory - * page with #MC in source page (@from) handled, and return the number - * of bytes not copied if there was a #MC, otherwise 0 for success. + * page with #MC in source page (@from) handled, and return -EFAULT if there + * was a #MC, otherwise 0 for success. */ static inline int copy_mc_user_highpage(struct page *to, struct page *from, unsigned long vaddr, struct vm_area_struct *vma)@@ -447,7 +447,7 @@ static inline int copy_mc_user_highpage(struct page *to, struct page *from, if (ret) memory_failure_queue(page_to_pfn(from), 0); - return ret; + return ret ? -EFAULT : 0; } static inline int copy_mc_highpage(struct page *to, struct page *from)@@ -466,7 +466,7 @@ static inline int copy_mc_highpage(struct page *to, struct page *from) if (ret) memory_failure_queue(page_to_pfn(from), 0); - return ret; + return ret ? -EFAULT : 0; }
the critical part of this change is the semantic flip: the return value goes from a count >= 0 to one that is < 0 on error. You have correctly converted the two call sites in khugepaged.c, but confirm if a tree wide audit has been done. with the caller audit confirmed Reviewed-by: Ashok Raj <redacted>