diff options
| author | Stanislav Kinsburskii <skinsburskii@linux.microsoft.com> | 2025-12-03 21:40:56 +0000 |
|---|---|---|
| committer | Wei Liu <wei.liu@kernel.org> | 2025-12-05 23:20:25 +0000 |
| commit | abceb4297bf88340ce06016895babe292510a262 (patch) | |
| tree | e9077791e5bdc8db50f289890d814b91cf4b4f13 /drivers/hv/mshv_root.h | |
| parent | e950c30a1051d27fd6dd9a48c53ffbc41ee773f2 (diff) | |
mshv: Fix huge page handling in memory region traversal
The previous code assumed that if a region's first page was huge, the
entire region consisted of huge pages and stored this in a large_pages
flag. This premise is incorrect not only for movable regions (where
pages can be split and merged on invalidate callbacks or page faults),
but even for pinned regions: THPs can be split and merged during
allocation, so a large, pinned region may contain a mix of huge and
regular pages.
This change removes the large_pages flag and replaces region-wide
assumptions with per-chunk inspection of the actual page size when
mapping, unmapping, sharing, and unsharing. This makes huge page
handling correct for mixed-page regions and avoids relying on stale
metadata that can easily become invalid as memory is remapped.
Signed-off-by: Stanislav Kinsburskii <skinsburskii@linux.microsoft.com>
Reviewed-by: Anirudh Rayabharam (Microsoft) <anirudh@anirudhrb.com>
Reviewed-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
Signed-off-by: Wei Liu <wei.liu@kernel.org>
Diffstat (limited to 'drivers/hv/mshv_root.h')
| -rw-r--r-- | drivers/hv/mshv_root.h | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/hv/mshv_root.h b/drivers/hv/mshv_root.h index 0366f416c2f0..ff3374f13691 100644 --- a/drivers/hv/mshv_root.h +++ b/drivers/hv/mshv_root.h @@ -77,9 +77,8 @@ struct mshv_mem_region { u64 start_uaddr; u32 hv_map_flags; struct { - u64 large_pages: 1; /* 2MiB */ u64 range_pinned: 1; - u64 reserved: 62; + u64 reserved: 63; } flags; struct mshv_partition *partition; struct page *pages[]; |
