[PATCH v15 5/9] mm/hwpoison: return -EFAULT when copy fail in copy_mc_[user]_highpage()
Ashok Raj
ashok.raj at oss.qualcomm.com
Thu Jul 2 07:37:43 PDT 2026
On Thu, Jun 18, 2026 at 05:21:19PM +0800, Ruidong Tian wrote:
> From: Tong Tiangen <tongtiangen at huawei.com>
>
> 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.
>
> Signed-off-by: Tong Tiangen <tongtiangen at huawei.com>
> Reviewed-by: Jonathan Cameron <Jonathan.Cameron at huawei.com>
> Reviewed-by: Mauro Carvalho Chehab <mchehab+huawei at kernel.org>
> Reviewed-by: Shuai Xue <xueshuai at 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 <ashok.raj at oss.qualcomm.com>
More information about the linux-arm-kernel
mailing list