With the upcoming introduction of movable pages, a region doesn't guarantee always having large pages mapped. Both mapping on fault and unmapping during PTE invalidation may not be 2M-aligned, while the hypervisor requires both the GFN and page count to be 2M-aligned to use the large page flag.
Update the logic for large page mapping in mshv_region_remap_pages() to require both page_offset and page_count to be PMD-aligned. Signed-off-by: Stanislav Kinsburskii <[email protected]> Reviewed-by: Nuno Das Neves <[email protected]> --- drivers/hv/mshv_root_main.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c index ef36d8115d8a..73aaa149c14c 100644 --- a/drivers/hv/mshv_root_main.c +++ b/drivers/hv/mshv_root_main.c @@ -34,6 +34,8 @@ #include "mshv.h" #include "mshv_root.h" +#define VALUE_PMD_ALIGNED(c) (!((c) & (PTRS_PER_PMD - 1))) + MODULE_AUTHOR("Microsoft"); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Microsoft Hyper-V root partition VMM interface /dev/mshv"); @@ -1100,7 +1102,9 @@ mshv_region_remap_pages(struct mshv_mem_region *region, u32 map_flags, if (page_offset + page_count > region->nr_pages) return -EINVAL; - if (region->flags.large_pages) + if (region->flags.large_pages && + VALUE_PMD_ALIGNED(region->start_gfn + page_offset) && + VALUE_PMD_ALIGNED(page_count)) map_flags |= HV_MAP_GPA_LARGE_PAGE; /* ask the hypervisor to map guest ram */
