On 2/26/2025 7:49 AM, David Hildenbrand wrote:
On 24.02.25 22:14, Jane Chu wrote:
When a process consumes a UE in a page, the memory failure handler
attempts to collect information for a potential SIGBUS.
If the page is an anonymous page, page_mapped_in_vma(page, vma) is
invoked in order to
1. retrieve the vaddr from the process' address space,
2. verify that the vaddr is indeed mapped to the poisoned page,
where 'page' is the precise small page with UE.
It's been observed that when injecting poison to a non-head subpage
of an anonymous hugetlb page, no SIGBUS show up; while injecting to
the head page produces a SIGBUS. The casue is that, though
hugetlb_walk()
returns a valid pmd entry (on x86), but check_pte() detects mismatch
between the head page per the pmd and the input subpage. Thus the vaddr
is considered not mapped to the subpage and the process is not collected
for SIGBUS purpose. This is the calling stack
collect_procs_anon
page_mapped_in_vma
page_vma_mapped_walk
hugetlb_walk
huge_pte_lock
check_pte
Why can't we require callers to never pass in subpages of hugetlb
pages, and sanity check that this is the case?
Because for memory-failure handling, we want to pin point to the exact
small page even if the small page is part of a huge page, so that if
userspace could manage to recover, they don't have to recover the clean
subpages. Please refer to 376907f3a0b34 ("mm/memory-failure: pass the
folio and the page to collect_procs()") for the change.
thanks,
-jane