summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Gibson <david@gibson.dropbear.id.au>2017-12-01 16:05:33 +1100
committerMichael Roth <mdroth@linux.vnet.ibm.com>2017-12-06 18:12:45 -0600
commit5f214279d456a52bf738887005af0e8d29c358b0 (patch)
tree891ae8f4a3516af148688200f7036f3ee1adbf97
parent9c7714afd7b574245c86c6bad40ecbcc2992aeec (diff)
downloadqemu-5f214279d456a52bf738887005af0e8d29c358b0.tar.gz
spapr: Include "pre-plugged" DIMMS in ram size calculation at reset
At guest reset time, we allocate a hash page table (HPT) for the guest based on the guest's RAM size. If dynamic HPT resizing is not available we use the maximum RAM size, if it is we use the current RAM size. But the "current RAM size" calculation is incorrect - we just use the "base" ram_size from the machine structure. This doesn't include any pluggable DIMMs that are already plugged at reset time. This means that if you try to start a 'pseries' machine with a DIMM specified on the command line that's much larger than the "base" RAM size, then the guest will get a woefully inadequate HPT. This can lead to a guest freeze during boot as it runs out of HPT space during initial MMU setup. Signed-off-by: David Gibson <david@gibson.dropbear.id.au> Reviewed-by: Greg Kurz <groug@kaod.org> Tested-by: Greg Kurz <groug@kaod.org> (cherry picked from commit 768a20f3a491ed4afce73ebb65347d55251c0ebd) *drop dep on 9aa3397f Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
-rw-r--r--hw/ppc/spapr.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 8630281d0e..8edac5d930 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1366,7 +1366,10 @@ void spapr_setup_hpt_and_vrma(sPAPRMachineState *spapr)
&& !spapr_ovec_test(spapr->ov5_cas, OV5_HPT_RESIZE))) {
hpt_shift = spapr_hpt_shift_for_ramsize(MACHINE(spapr)->maxram_size);
} else {
- hpt_shift = spapr_hpt_shift_for_ramsize(MACHINE(spapr)->ram_size);
+ uint64_t current_ram_size;
+
+ current_ram_size = MACHINE(spapr)->ram_size + pc_existing_dimms_capacity(&error_abort);
+ hpt_shift = spapr_hpt_shift_for_ramsize(current_ram_size);
}
spapr_reallocate_hpt(spapr, hpt_shift, &error_fatal);