[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PULL 17/17] ppc: Disable huge page support if it is not avai
From: |
David Gibson |
Subject: |
[Qemu-ppc] [PULL 17/17] ppc: Disable huge page support if it is not available for main RAM |
Date: |
Thu, 23 Jun 2016 15:48:46 +1000 |
From: Thomas Huth <address@hidden>
On powerpc, we must only signal huge page support to the guest if
all memory areas are capable of supporting huge pages. The commit
2d103aae8765 ("fix hugepage support when using memory-backend-file")
already fixed the case when the user specified the mem-path property
for NUMA memory nodes instead of using the global "-mem-path" option.
However, there is one more case where it currently can go wrong.
When specifying additional memory DIMMs without using NUMA, e.g.
qemu-system-ppc64 -enable-kvm ... -m 1G,slots=2,maxmem=2G \
-device pc-dimm,id=dimm-mem1,memdev=mem1 -object \
memory-backend-file,policy=default,mem-path=/...,size=1G,id=mem1
the code in getrampagesize() currently assumes that huge pages
are possible since they are enabled for the mem1 object. But
since the main RAM is not backed by a huge page filesystem,
the guest Linux kernel then crashes very quickly after being
started. So in case the we've got "normal" memory without NUMA
and without the global "-mem-path" option, we must not announce
huge pages to the guest. Since this is likely a mis-configuration
by the user, also spill out a message in this case.
Signed-off-by: Thomas Huth <address@hidden>
Signed-off-by: David Gibson <address@hidden>
---
target-ppc/kvm.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
index e14da60..884d564 100644
--- a/target-ppc/kvm.c
+++ b/target-ppc/kvm.c
@@ -27,6 +27,7 @@
#include "qemu/timer.h"
#include "sysemu/sysemu.h"
#include "sysemu/kvm.h"
+#include "sysemu/numa.h"
#include "kvm_ppc.h"
#include "sysemu/cpus.h"
#include "sysemu/device_tree.h"
@@ -388,7 +389,21 @@ static long getrampagesize(void)
object_child_foreach(memdev_root, find_max_supported_pagesize, &hpsize);
- return (hpsize == LONG_MAX) ? getpagesize() : hpsize;
+ if (hpsize == LONG_MAX) {
+ return getpagesize();
+ }
+
+ if (nb_numa_nodes == 0 && hpsize > getpagesize()) {
+ /* No NUMA nodes and normal RAM without -mem-path ==> no huge pages! */
+ static bool warned;
+ if (!warned) {
+ error_report("Huge page support disabled (n/a for main memory).");
+ warned = true;
+ }
+ return getpagesize();
+ }
+
+ return hpsize;
}
static bool kvm_valid_page_size(uint32_t flags, long rampgsize, uint32_t shift)
--
2.5.5
- [Qemu-ppc] [PULL 00/17] ppc-for-2.7 queue 20160623, David Gibson, 2016/06/23
- [Qemu-ppc] [PULL 02/17] tests: Use '+=' to add additional tests, not '=', David Gibson, 2016/06/23
- [Qemu-ppc] [PULL 01/17] powerpc/mm: Update the WIMG check during H_ENTER, David Gibson, 2016/06/23
- [Qemu-ppc] [PULL 17/17] ppc: Disable huge page support if it is not available for main RAM,
David Gibson <=
- [Qemu-ppc] [PULL 06/17] memory: Add reporting of supported page sizes, David Gibson, 2016/06/23
- [Qemu-ppc] [PULL 03/17] ppc64: disable gen_pause() for linux-user mode, David Gibson, 2016/06/23
- [Qemu-ppc] [PULL 11/17] ppc: Fix generation if ISI/DSI vs. HV mode, David Gibson, 2016/06/23
- [Qemu-ppc] [PULL 13/17] ppc: Add real mode CI load/store instructions for P7 and P8, David Gibson, 2016/06/23
- [Qemu-ppc] [PULL 07/17] ppc: Fix rfi/rfid/hrfi/... emulation, David Gibson, 2016/06/23
- [Qemu-ppc] [PULL 08/17] ppc: define a default LPCR value, David Gibson, 2016/06/23