On Thu, Jun 18, 2026 at 05:21:19PM +0800, Ruidong Tian wrote: > From: Tong Tiangen <[email protected]> > > 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 <[email protected]> > Reviewed-by: Jonathan Cameron <[email protected]> > Reviewed-by: Mauro Carvalho Chehab <[email protected]> > Reviewed-by: Shuai Xue <[email protected]> > --- > 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 <[email protected]>
