On Tue, May 20, 2025 at 03:53:10PM +0200, Paolo Bonzini wrote: > On 5/20/25 13:30, Magnus Kulke wrote: > > Qemu maps regions of userland multiple times into the guest. The MSHV > > kernel driver detects those overlapping regions and rejects those > > mappings. > > Can you explain what you see? QEMU doesn't do that, just look at KVM code:
Hey Paolo, I appreciate that you took a look so swiftly, we'll try to accomodate and post a fixed series up soon. I think what I am referring to is a "memory region alias", e.g. in this mtree output (machine q35 + seabios): 00000000000e0000-00000000000fffff (prio 1, rom): alias isa-bios @pc.bios 0000000000020000-000000000003ffff ... 00000000fffc0000-00000000ffffffff (prio 0, rom): pc.bios parts of the bios are mapped into different regions on the guest. a code path for such a mapping that is refused by the MSHV kernel driver would start in hw/i386/pc.c:894 memory_region_init_alias(ram_below_4g, NULL, "ram-below-4g", machine->ram, 0, x86ms->below_4g_mem_size); memory_region_add_subregion(system_memory, 0, ram_below_4g); eventually that ends up in a hv call that registers a region, but the userspace_addr of pc.bios is already registered, so the mapping of an alias slice is rejected by the kernel driver. best, magnus > > static bool kvm_check_memslot_overlap(struct kvm_memslots *slots, int id, > gfn_t start, gfn_t end) > { > struct kvm_memslot_iter iter; > > kvm_for_each_memslot_in_gfn_range(&iter, slots, start, end) { > if (iter.slot->id != id) > return true; > } > > return false; > } > > ... > > if ((change == KVM_MR_CREATE || change == KVM_MR_MOVE) && > kvm_check_memslot_overlap(slots, id, base_gfn, base_gfn + npages)) > return -EEXIST; > > > Paolo >