Blob Blame History Raw
From 61cace627e7140a63e27c7b1f949fc3b44ec120c Mon Sep 17 00:00:00 2001
From: Serhii Popovych <spopovyc@redhat.com>
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 <spopovyc@redhat.com>
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 <lvivier@redhat.com>
RH-Acked-by: David Gibson <dgibson@redhat.com>
RH-Acked-by: Thomas Huth <thuth@redhat.com>

From: David Gibson <david@gibson.dropbear.id.au>

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 <david@gibson.dropbear.id.au>
    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 <david@gibson.dropbear.id.au>
    Reviewed-by: Greg Kurz <groug@kaod.org>
    Reviewed-by: Laurent Vivier <lvivier@redhat.com>

Signed-off-by: Serhii Popovych <spopovyc@redhat.com>
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
---
 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