[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