On Wed, Apr 01, 2026 at 10:12:46PM +0000, Stanislav Kinsburskii wrote: > Two specific operations don't require PFN iteration: region unmapping > and region remapping with no access. For unmapping, all frames in MSHV > memory regions are guaranteed to be mapped with page access, so we can > unmap them all without checking individual PFNs. For remapping with no > access, all frames are already mapped with page access, allowing us to > unmap them all in one pass. > > Since neither operation needs PFN validation, iterating over PFNs is > redundant. Batch operations into large page-aligned chunks followed by > remaining pages. This eliminates PFN traversal for these operations, > requires no additional hypercalls compared to the PFN-checking approach, > and provides the simplest possible sequential execution path. > > The optimization utilizes HV_MAP_GPA_LARGE_PAGE and > HV_UNMAP_GPA_LARGE_PAGE flags for aligned portions, processing only the > remainder with base page granularity. This removes mshv_region_chunk_unmap() > and mshv_region_process_range() helper functions, reducing code complexity. > > Signed-off-by: Stanislav Kinsburskii <[email protected]> > --- > drivers/hv/mshv_regions.c | 65 > ++++++++++++++++++++++++++++++++------------- > 1 file changed, 46 insertions(+), 19 deletions(-) > > diff --git a/drivers/hv/mshv_regions.c b/drivers/hv/mshv_regions.c > index 2c4215381e0b..a92381219758 100644 > --- a/drivers/hv/mshv_regions.c > +++ b/drivers/hv/mshv_regions.c > @@ -449,27 +449,27 @@ static int mshv_region_pin(struct mshv_region *region) > return ret < 0 ? ret : -ENOMEM; > } > > -static int mshv_region_chunk_unmap(struct mshv_region *region, > - u32 flags, > - u64 pfn_offset, u64 pfn_count, > - bool huge_page) > +static int mshv_region_unmap(struct mshv_region *region) > { > - if (!pfn_valid(region->mreg_pfns[pfn_offset])) > - return 0; > + u64 aligned_pages, remaining_pages; > + int ret = 0; > > - if (huge_page) > - flags |= HV_UNMAP_GPA_LARGE_PAGE; > + aligned_pages = ALIGN_DOWN(region->nr_pfns, PTRS_PER_PMD);
Why is it sufficient to check just the number of pages to determine whether we need to use the HV_UNMAP_GPA_LARGE_PAGE? Don't we need to check the alignment of the start address as well? Thanks, Anirudh.

