Commit f91bc8f6 authored by Magnus Kulke's avatar Magnus Kulke Committed by Wei Liu
Browse files

mshv: Allow mappings that overlap in uaddr



Currently the MSHV driver rejects mappings that would overlap in
userspace.

Some VMMs require the same memory to be mapped to different parts of
the guest's address space, and so working around this restriction is
difficult.

The hypervisor itself doesn't prohibit mappings that overlap in uaddr,
(really in SPA; system physical addresses), so supporting this in the
driver doesn't require any extra work: only the checks need to be
removed.

Since no userspace code until now has been able to overlap regions in
userspace, relaxing this constraint can't break any existing code.

Signed-off-by: default avatarMagnus Kulke <magnuskulke@linux.microsoft.com>
Signed-off-by: default avatarNuno Das Neves <nunodasneves@linux.microsoft.com>
Reviewed-by: default avatarMichael Kelley <mhklinux@outlook.com>
Signed-off-by: default avatarWei Liu <wei.liu@kernel.org>
parent ba9eb9b8
Loading
Loading
Loading
Loading
+2 −6
Original line number Diff line number Diff line
@@ -1188,12 +1188,8 @@ static int mshv_partition_create_region(struct mshv_partition *partition,

	/* Reject overlapping regions */
	hlist_for_each_entry(rg, &partition->pt_mem_regions, hnode) {
		u64 rg_size = rg->nr_pages << HV_HYP_PAGE_SHIFT;

		if ((mem->guest_pfn + nr_pages <= rg->start_gfn ||
		     rg->start_gfn + rg->nr_pages <= mem->guest_pfn) &&
		    (mem->userspace_addr + mem->size <= rg->start_uaddr ||
		     rg->start_uaddr + rg_size <= mem->userspace_addr))
		if (mem->guest_pfn + nr_pages <= rg->start_gfn ||
		    rg->start_gfn + rg->nr_pages <= mem->guest_pfn)
			continue;

		return -EEXIST;
+1 −1
Original line number Diff line number Diff line
@@ -89,7 +89,7 @@ enum {
 * @rsvd: MBZ
 *
 * Map or unmap a region of userspace memory to Guest Physical Addresses (GPA).
 * Mappings can't overlap in GPA space or userspace.
 * Mappings can't overlap in GPA space.
 * To unmap, these fields must match an existing mapping.
 */
struct mshv_user_mem_region {