[PATCH V1 13/13] mshv: pin all ram mem regions if partition has device passthru

Mukesh R
2026-04-22T02:33:59Z

Given the sporadic errors, mostly from high end devices, when regions are
not pinned and a PCI device is passthru'd to a VM, for now, force all
regions for the VM to be pinned. Even tho VFIO may pin them, the regions
would still be marked movable, so do it upfront in mshv.

Signed-off-by: Mukesh R <mrathor@linux.microsoft.com>
---
drivers/hv/mshv_root.h | 6 ++++++
drivers/hv/mshv_root_main.c | 5 ++++-
2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/drivers/hv/mshv_root.h b/drivers/hv/mshv_root.h
index b9880d0bdc4d..32260df84f86 100644
--- a/drivers/hv/mshv_root.h
+++ b/drivers/hv/mshv_root.h
@@ -141,6 +141,7 @@ struct mshv_partition {
pid_t pt_vmm_tgid;
bool import_completed;
bool pt_initialized;
+ bool pt_regions_pinned;
#if IS_ENABLED(CONFIG_DEBUG_FS)
struct dentry *pt_stats_dentry;
struct dentry *pt_vp_dentry;
@@ -277,6 +278,11 @@ static inline bool mshv_partition_encrypted(struct mshv_partition *partition)
return partition->isolation_type == HV_PARTITION_ISOLATION_TYPE_SNP;
}

+static inline bool mshv_pt_regions_pinned(struct mshv_partition *pt)
+{
+ return pt->pt_regions_pinned || mshv_partition_encrypted(pt);
+}
+
struct mshv_partition *mshv_partition_get(struct mshv_partition *partition);
void mshv_partition_put(struct mshv_partition *partition);
struct mshv_partition *mshv_partition_find(u64 partition_id) __must_hold(RCU);
diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
index a7864463961b..251cf88a2b0b 100644
--- a/drivers/hv/mshv_root_main.c
+++ b/drivers/hv/mshv_root_main.c
@@ -1333,7 +1333,7 @@ static int mshv_partition_create_region(struct mshv_partition *partition,

if (is_mmio)
rg->mreg_type = MSHV_REGION_TYPE_MMIO;
- else if (mshv_partition_encrypted(partition) ||
+ else if (mshv_pt_regions_pinned(partition) ||
!mshv_region_movable_init(rg))
rg->mreg_type = MSHV_REGION_TYPE_MEM_PINNED;
else
@@ -1406,6 +1406,9 @@ static int mshv_prepare_pinned_region(struct mshv_mem_region *region)
goto err_out;
}

+ /* For now, all regions must be pinned if there is device passthru. */
+ partition->pt_regions_pinned = true;
+
return 0;

invalidate_region:
--
2.51.2.vfs.0.1