On Mon, Apr 06, 2026 at 04:57:12PM +0000, Anirudh Rayabharam wrote: > 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? >
Yeah, I think it's not sufficient. I'll address this gap. Thanks, Stanislav > Thanks, > Anirudh.

