exec: Introduce qemu_maxrampagesize() and rename qemu_getrampagesize()
Rename qemu_getrampagesize() to qemu_minrampagesize(). While at it, properly rename find_max_supported_pagesize() to find_min_backend_pagesize(). s390x is actually interested into the maximum ram pagesize, so introduce and use qemu_maxrampagesize(). Add a TODO, indicating that looking at any mapped memory backends is not 100% correct in some cases. Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20190417113143.5551-3-david@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
9138977b18
commit
905b7ee4d6
44
exec.c
44
exec.c
@ -1688,7 +1688,7 @@ void ram_block_dump(Monitor *mon)
|
||||
* when we actually open and map them. Iterate over the file
|
||||
* descriptors instead, and use qemu_fd_getpagesize().
|
||||
*/
|
||||
static int find_max_supported_pagesize(Object *obj, void *opaque)
|
||||
static int find_min_backend_pagesize(Object *obj, void *opaque)
|
||||
{
|
||||
long *hpsize_min = opaque;
|
||||
|
||||
@ -1704,7 +1704,27 @@ static int find_max_supported_pagesize(Object *obj, void *opaque)
|
||||
return 0;
|
||||
}
|
||||
|
||||
long qemu_getrampagesize(void)
|
||||
static int find_max_backend_pagesize(Object *obj, void *opaque)
|
||||
{
|
||||
long *hpsize_max = opaque;
|
||||
|
||||
if (object_dynamic_cast(obj, TYPE_MEMORY_BACKEND)) {
|
||||
HostMemoryBackend *backend = MEMORY_BACKEND(obj);
|
||||
long hpsize = host_memory_backend_pagesize(backend);
|
||||
|
||||
if (host_memory_backend_is_mapped(backend) && (hpsize > *hpsize_max)) {
|
||||
*hpsize_max = hpsize;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* TODO: We assume right now that all mapped host memory backends are
|
||||
* used as RAM, however some might be used for different purposes.
|
||||
*/
|
||||
long qemu_minrampagesize(void)
|
||||
{
|
||||
long hpsize = LONG_MAX;
|
||||
long mainrampagesize;
|
||||
@ -1724,7 +1744,7 @@ long qemu_getrampagesize(void)
|
||||
*/
|
||||
memdev_root = object_resolve_path("/objects", NULL);
|
||||
if (memdev_root) {
|
||||
object_child_foreach(memdev_root, find_max_supported_pagesize, &hpsize);
|
||||
object_child_foreach(memdev_root, find_min_backend_pagesize, &hpsize);
|
||||
}
|
||||
if (hpsize == LONG_MAX) {
|
||||
/* No additional memory regions found ==> Report main RAM page size */
|
||||
@ -1747,8 +1767,24 @@ long qemu_getrampagesize(void)
|
||||
|
||||
return hpsize;
|
||||
}
|
||||
|
||||
long qemu_maxrampagesize(void)
|
||||
{
|
||||
long pagesize = qemu_mempath_getpagesize(mem_path);
|
||||
Object *memdev_root = object_resolve_path("/objects", NULL);
|
||||
|
||||
if (memdev_root) {
|
||||
object_child_foreach(memdev_root, find_max_backend_pagesize,
|
||||
&pagesize);
|
||||
}
|
||||
return pagesize;
|
||||
}
|
||||
#else
|
||||
long qemu_getrampagesize(void)
|
||||
long qemu_minrampagesize(void)
|
||||
{
|
||||
return getpagesize();
|
||||
}
|
||||
long qemu_maxrampagesize(void)
|
||||
{
|
||||
return getpagesize();
|
||||
}
|
||||
|
@ -347,7 +347,7 @@ static void cap_hpt_maxpagesize_apply(SpaprMachineState *spapr,
|
||||
warn_report("Many guests require at least 64kiB hpt-max-page-size");
|
||||
}
|
||||
|
||||
spapr_check_pagesize(spapr, qemu_getrampagesize(), errp);
|
||||
spapr_check_pagesize(spapr, qemu_minrampagesize(), errp);
|
||||
}
|
||||
|
||||
static bool spapr_pagesize_cb(void *opaque, uint32_t seg_pshift,
|
||||
@ -609,7 +609,7 @@ static SpaprCapabilities default_caps_with_cpu(SpaprMachineState *spapr,
|
||||
uint8_t mps;
|
||||
|
||||
if (kvmppc_hpt_needs_host_contiguous_pages()) {
|
||||
mps = ctz64(qemu_getrampagesize());
|
||||
mps = ctz64(qemu_minrampagesize());
|
||||
} else {
|
||||
mps = 34; /* allow everything up to 16GiB, i.e. everything */
|
||||
}
|
||||
|
@ -188,7 +188,7 @@ static void s390_memory_init(ram_addr_t mem_size)
|
||||
* Configure the maximum page size. As no memory devices were created
|
||||
* yet, this is the page size of initial memory only.
|
||||
*/
|
||||
s390_set_max_pagesize(qemu_getrampagesize(), &local_err);
|
||||
s390_set_max_pagesize(qemu_maxrampagesize(), &local_err);
|
||||
if (local_err) {
|
||||
error_report_err(local_err);
|
||||
exit(EXIT_FAILURE);
|
||||
|
@ -148,7 +148,7 @@ int vfio_spapr_create_window(VFIOContainer *container,
|
||||
uint64_t pagesize = memory_region_iommu_get_min_page_size(iommu_mr);
|
||||
unsigned entries, bits_total, bits_per_level, max_levels;
|
||||
struct vfio_iommu_spapr_tce_create create = { .argsz = sizeof(create) };
|
||||
long rampagesize = qemu_getrampagesize();
|
||||
long rampagesize = qemu_minrampagesize();
|
||||
|
||||
/*
|
||||
* The host might not support the guest supported IOMMU page size,
|
||||
|
@ -73,7 +73,8 @@ static inline unsigned long int ramblock_recv_bitmap_offset(void *host_addr,
|
||||
|
||||
bool ramblock_is_pmem(RAMBlock *rb);
|
||||
|
||||
long qemu_getrampagesize(void);
|
||||
long qemu_minrampagesize(void);
|
||||
long qemu_maxrampagesize(void);
|
||||
|
||||
/**
|
||||
* qemu_ram_alloc_from_file,
|
||||
|
@ -2136,7 +2136,7 @@ uint64_t kvmppc_rma_size(uint64_t current_size, unsigned int hash_shift)
|
||||
/* Find the largest hardware supported page size that's less than
|
||||
* or equal to the (logical) backing page size of guest RAM */
|
||||
kvm_get_smmu_info(&info, &error_fatal);
|
||||
rampagesize = qemu_getrampagesize();
|
||||
rampagesize = qemu_minrampagesize();
|
||||
best_page_shift = 0;
|
||||
|
||||
for (i = 0; i < KVM_PPC_PAGE_SIZES_MAX_SZ; i++) {
|
||||
|
Loading…
Reference in New Issue
Block a user