#endif
 
+#ifndef __HAVE_ARCH_COPY_HIGHPAGE
+
+static inline void copy_highpage(struct page *to, struct page *from)
+{
+       char *vfrom, *vto;
+
+       vfrom = kmap_local_page(from);
+       vto = kmap_local_page(to);
+       copy_page(vto, vfrom);
+       kmsan_copy_page_meta(to, from);
+       kunmap_local(vto);
+       kunmap_local(vfrom);
+}
+
+#endif
+
 #ifdef copy_mc_to_kernel
+/*
+ * 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.
+ */
 static inline int copy_mc_user_highpage(struct page *to, struct page *from,
                                        unsigned long vaddr, struct vm_area_struct *vma)
 {
 
        return ret;
 }
-#else
-static inline int copy_mc_user_highpage(struct page *to, struct page *from,
-                                       unsigned long vaddr, struct vm_area_struct *vma)
-{
-       copy_user_highpage(to, from, vaddr, vma);
-       return 0;
-}
-#endif
 
-#ifndef __HAVE_ARCH_COPY_HIGHPAGE
-
-static inline void copy_highpage(struct page *to, struct page *from)
+static inline int copy_mc_highpage(struct page *to, struct page *from)
 {
+       unsigned long ret;
        char *vfrom, *vto;
 
        vfrom = kmap_local_page(from);
        vto = kmap_local_page(to);
-       copy_page(vto, vfrom);
-       kmsan_copy_page_meta(to, from);
+       ret = copy_mc_to_kernel(vto, vfrom, PAGE_SIZE);
+       if (!ret)
+               kmsan_copy_page_meta(to, from);
        kunmap_local(vto);
        kunmap_local(vfrom);
+
+       return ret;
+}
+#else
+static inline int copy_mc_user_highpage(struct page *to, struct page *from,
+                                       unsigned long vaddr, struct vm_area_struct *vma)
+{
+       copy_user_highpage(to, from, vaddr, vma);
+       return 0;
 }
 
+static inline int copy_mc_highpage(struct page *to, struct page *from)
+{
+       copy_highpage(to, from);
+       return 0;
+}
 #endif
 
 static inline void memcpy_page(struct page *dst_page, size_t dst_off,