mshv_region_handle_gfn_fault() faults in PTRS_PER_PMD HV pages (2 MiB), sized for a single 2 MiB SLAT mapping. When the host page is larger than HV_HYP_PAGE_SIZE (e.g. arm64 16 KiB or 64 KiB), the range covers fewer than PTRS_PER_PMD host pages, so a subsequent guest fault re-enters HMM for offsets the same host folio already backs.
Scale MSHV_MAP_FAULT_IN_PAGES by PAGE_SIZE / HV_HYP_PAGE_SIZE (clamped to at least 1) so the fault range covers one huge page on whichever side has the larger one. No functional change for the H == V case; on H > V hosts the fault grows from 2 MiB to one host huge page. Signed-off-by: Stanislav Kinsburskii <[email protected]> --- drivers/hv/mshv_regions.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/hv/mshv_regions.c b/drivers/hv/mshv_regions.c index 807fff43deb43..057fc83895d37 100644 --- a/drivers/hv/mshv_regions.c +++ b/drivers/hv/mshv_regions.c @@ -17,7 +17,8 @@ #include "mshv_root.h" -#define MSHV_MAP_FAULT_IN_PAGES PTRS_PER_PMD +#define MSHV_MAP_FAULT_IN_PAGES \ + (PTRS_PER_PMD * max_t(unsigned long, 1, PAGE_SIZE / HV_HYP_PAGE_SIZE)) #define MSHV_INVALID_PFN ULONG_MAX static inline bool mshv_pfn_valid(unsigned long pfn)

