From 61cace627e7140a63e27c7b1f949fc3b44ec120c Mon Sep 17 00:00:00 2001 From: Serhii Popovych Date: Wed, 22 Nov 2017 13:35:31 +0100 Subject: [PATCH 1/7] spapr: Correct RAM size calculation for HPT resizing RH-Author: Serhii Popovych Message-id: <1511357731-4779-1-git-send-email-spopovyc@redhat.com> Patchwork-id: 77778 O-Subject: [RHV7.5 qemu-kvm-rhev PATCH v2] spapr: Correct RAM size calculation for HPT resizing Bugzilla: 1499647 RH-Acked-by: Laurent Vivier RH-Acked-by: David Gibson RH-Acked-by: Thomas Huth From: David Gibson The only thing making this change distinct from one in upstream is get_plugged_memory_size() function which isn't present in 2.10.x branch and it is a part of new QMP interface command which we do not want to introduce in downstream. So assuming that we replace get_plugged_memory_size() with direct call to pc_existing_dimms_capacity(). commit db50f280cf5f714e64ff2b134aae138908f07502 Author: David Gibson Date: Wed Oct 11 00:16:57 2017 +1100 spapr: Correct RAM size calculation for HPT resizing In order to prevent the guest from forcing the allocation of large amounts of qemu memory (or host kernel memory, in the case of KVM HV), we limit the size of Hashed Page Table (HPT) it is allowed to allocated, based on its RAM size. However, the current calculation is not correct: it only adds up the size of plugged memory, ignoring the base memory size. This patch corrects it. While we're there, use get_plugged_memory_size() instead of directly calling pc_existing_dimms_capacity(). The only difference is that it will abort on failure, which is right: a failure here indicates something wrong within qemu. Signed-off-by: David Gibson Reviewed-by: Greg Kurz Reviewed-by: Laurent Vivier Signed-off-by: Serhii Popovych Signed-off-by: Miroslav Rezanina --- hw/ppc/spapr_hcall.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c index b503299..217358d 100644 --- a/hw/ppc/spapr_hcall.c +++ b/hw/ppc/spapr_hcall.c @@ -472,7 +472,7 @@ static target_ulong h_resize_hpt_prepare(PowerPCCPU *cpu, target_ulong flags = args[0]; int shift = args[1]; sPAPRPendingHPT *pending = spapr->pending_hpt; - uint64_t current_ram_size = MACHINE(spapr)->ram_size; + uint64_t current_ram_size; int rc; if (spapr->resize_hpt == SPAPR_RESIZE_HPT_DISABLED) { @@ -494,7 +494,8 @@ static target_ulong h_resize_hpt_prepare(PowerPCCPU *cpu, return H_PARAMETER; } - current_ram_size = pc_existing_dimms_capacity(&error_fatal); + current_ram_size = MACHINE(spapr)->ram_size + + pc_existing_dimms_capacity(&error_fatal); /* We only allow the guest to allocate an HPT one order above what * we'd normally give them (to stop a small guest claiming a huge -- 1.8.3.1