mm/hugetlb: add missing VM_FAULT_SET_HINDEX in hugetlb_fault
authorOscar Salvador <osalvador@suse.de>
Thu, 9 May 2024 10:01:47 +0000 (12:01 +0200)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 11 May 2024 22:41:36 +0000 (15:41 -0700)
Patch series "Minor fixups for hugetlb fault path".

This series contains a couple of fixups for hugetlb_fault and hugetlb_wp
respectively, where a VM_FAULT_SET_HINDEX call was missing.

I did not bother with a Fixes tag because the missing piece here is that
we will not report to userspace the right extension of the faulty area by
adjusting struct kernel_siginfo.si_addr_lsb, but I do not consider that to
be a big issue because I assume that userspace already knows the size of
the mapping anyway.

This patch (of 2):

commit af19487f00f3 ("mm: make PTE_MARKER_SWAPIN_ERROR more general")
added the code to handle pte_markers in hugetlb faulting path.  In case of
an UFFD_POISON event, a PTE_MARKER_POISONED will be created and we will
return VM_FAULT_HWPOISON_LARGE upon detecting that in the fault path.  Add
the missing VM_FAULT_SET_HINDEX, so the right si_addr_lsb will be passed
to userspace to report the extension of the faulty area.

Link: https://lkml.kernel.org/r/20240509100148.22384-1-osalvador@suse.de
Link: https://lkml.kernel.org/r/20240509100148.22384-2-osalvador@suse.de
Signed-off-by: Oscar Salvador <osalvador@suse.de>
Acked-by: Peter Xu <peterx@redhat.com>
Acked-by: Axel Rasmussen <axelrasmussen@google.com>
Cc: Liu Shixin <liushixin2@huawei.com>
Cc: Muchun Song <muchun.song@linux.dev>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/hugetlb.c

index 33d175add04475a5a2664c8559888e4ecf757dd4..262456daf3274735e2edd9ba764c9830e4441a76 100644 (file)
@@ -6485,7 +6485,8 @@ vm_fault_t hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
                                pte_marker_get(pte_to_swp_entry(vmf.orig_pte));
 
                        if (marker & PTE_MARKER_POISONED) {
-                               ret = VM_FAULT_HWPOISON_LARGE;
+                               ret = VM_FAULT_HWPOISON_LARGE |
+                                     VM_FAULT_SET_HINDEX(hstate_index(h));
                                goto out_mutex;
                        }
                }