Skip to content
  • David Gibson's avatar
    exec: Only count mapped memory backends for qemu_getrampagesize() · 7d5489e6
    David Gibson authored
    
    
    qemu_getrampagesize() works out the minimum host page size backing any of
    guest RAM.  This is required in a few places, such as for POWER8 PAPR KVM
    guests, because limitations of the hardware virtualization mean the guest
    can't use pagesizes larger than the host pages backing its memory.
    
    However, it currently checks against *every* memory backend, whether or not
    it is actually mapped into guest memory at the moment.  This is incorrect.
    
    This can cause a problem attempting to add memory to a POWER8 pseries KVM
    guest which is configured to allow hugepages in the guest (e.g.
    -machine cap-hpt-max-page-size=16m).  If you attempt to add non-hugepage,
    you can (correctly) create a memory backend, however it (correctly) will
    throw an error when you attempt to map that memory into the guest by
    'device_add'ing a pc-dimm.
    
    What's not correct is that if you then reset the guest a startup check
    against qemu_getrampagesize() will cause a fatal error because of the new
    memory object, even though it's not mapped into the guest.
    
    This patch corrects the problem by adjusting find_max_supported_pagesize()
    (called from qemu_getrampagesize() via object_child_foreach) to exclude
    non-mapped memory backends.
    
    Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
    Reviewed-by: Igor Mammedov's avatarIgor Mammedov <imammedo@redhat.com>
    Acked-by: David Hildenbrand's avatarDavid Hildenbrand <david@redhat.com>
    7d5489e6