|
|
26ba25 |
From b6a062c64f9639558a88f46edc3dd76b54b26bb5 Mon Sep 17 00:00:00 2001
|
|
|
26ba25 |
From: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
26ba25 |
Date: Thu, 13 Dec 2018 15:51:59 +0000
|
|
|
26ba25 |
Subject: [PATCH 1/5] x86: host-phys-bits-limit option
|
|
|
26ba25 |
|
|
|
26ba25 |
RH-Author: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
26ba25 |
Message-id: <20181213155200.20300-2-ehabkost@redhat.com>
|
|
|
26ba25 |
Patchwork-id: 83479
|
|
|
26ba25 |
O-Subject: [RHEL8/rhel qemu-kvm PATCH 1/2] x86: host-phys-bits-limit option
|
|
|
26ba25 |
Bugzilla: 1598284
|
|
|
26ba25 |
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
26ba25 |
RH-Acked-by: Pankaj Gupta <pagupta@redhat.com>
|
|
|
26ba25 |
RH-Acked-by: Bandan Das <bsd@redhat.com>
|
|
|
26ba25 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
26ba25 |
|
|
|
26ba25 |
Some downstream distributions of QEMU set host-phys-bits=on by
|
|
|
26ba25 |
default. This worked very well for most use cases, because
|
|
|
26ba25 |
phys-bits really didn't have huge consequences. The only
|
|
|
26ba25 |
difference was on the CPUID data seen by guests, and on the
|
|
|
26ba25 |
handling of reserved bits.
|
|
|
26ba25 |
|
|
|
26ba25 |
This changed in KVM commit 855feb673640 ("KVM: MMU: Add 5 level
|
|
|
26ba25 |
EPT & Shadow page table support"). Now choosing a large
|
|
|
26ba25 |
phys-bits value for a VM has bigger impact: it will make KVM use
|
|
|
26ba25 |
5-level EPT even when it's not really necessary. This means
|
|
|
26ba25 |
using the host phys-bits value may not be the best choice.
|
|
|
26ba25 |
|
|
|
26ba25 |
Management software could address this problem by manually
|
|
|
26ba25 |
configuring phys-bits depending on the size of the VM and the
|
|
|
26ba25 |
amount of MMIO address space required for hotplug. But this is
|
|
|
26ba25 |
not trivial to implement.
|
|
|
26ba25 |
|
|
|
26ba25 |
However, there's another workaround that would work for most
|
|
|
26ba25 |
cases: keep using the host phys-bits value, but only if it's
|
|
|
26ba25 |
smaller than 48. This patch makes this possible by introducing a
|
|
|
26ba25 |
new "-cpu" option: "host-phys-bits-limit". Management software
|
|
|
26ba25 |
or users can make sure they will always use 4-level EPT using:
|
|
|
26ba25 |
"host-phys-bits=on,host-phys-bits-limit=48".
|
|
|
26ba25 |
|
|
|
26ba25 |
This behavior is still not enabled by default because QEMU
|
|
|
26ba25 |
doesn't enable host-phys-bits=on by default. But users,
|
|
|
26ba25 |
management software, or downstream distributions may choose to
|
|
|
26ba25 |
change their defaults using the new option.
|
|
|
26ba25 |
|
|
|
26ba25 |
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
26ba25 |
Message-Id: <20181211192527.13254-1-ehabkost@redhat.com>
|
|
|
26ba25 |
Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
|
|
|
26ba25 |
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
|
26ba25 |
---
|
|
|
26ba25 |
target/i386/cpu.c | 5 +++++
|
|
|
26ba25 |
target/i386/cpu.h | 3 +++
|
|
|
26ba25 |
2 files changed, 8 insertions(+)
|
|
|
26ba25 |
|
|
|
26ba25 |
diff --git a/target/i386/cpu.c b/target/i386/cpu.c
|
|
|
26ba25 |
index a44912c..c37cd1e 100644
|
|
|
26ba25 |
--- a/target/i386/cpu.c
|
|
|
26ba25 |
+++ b/target/i386/cpu.c
|
|
|
26ba25 |
@@ -4826,6 +4826,10 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp)
|
|
|
26ba25 |
if (cpu->host_phys_bits) {
|
|
|
26ba25 |
/* The user asked for us to use the host physical bits */
|
|
|
26ba25 |
cpu->phys_bits = host_phys_bits;
|
|
|
26ba25 |
+ if (cpu->host_phys_bits_limit &&
|
|
|
26ba25 |
+ cpu->phys_bits > cpu->host_phys_bits_limit) {
|
|
|
26ba25 |
+ cpu->phys_bits = cpu->host_phys_bits_limit;
|
|
|
26ba25 |
+ }
|
|
|
26ba25 |
}
|
|
|
26ba25 |
|
|
|
26ba25 |
/* Print a warning if the user set it to a value that's not the
|
|
|
26ba25 |
@@ -5377,6 +5381,7 @@ static Property x86_cpu_properties[] = {
|
|
|
26ba25 |
DEFINE_PROP_BOOL("kvm", X86CPU, expose_kvm, true),
|
|
|
26ba25 |
DEFINE_PROP_UINT32("phys-bits", X86CPU, phys_bits, 0),
|
|
|
26ba25 |
DEFINE_PROP_BOOL("host-phys-bits", X86CPU, host_phys_bits, false),
|
|
|
26ba25 |
+ DEFINE_PROP_UINT8("host-phys-bits-limit", X86CPU, host_phys_bits_limit, 0),
|
|
|
26ba25 |
DEFINE_PROP_BOOL("fill-mtrr-mask", X86CPU, fill_mtrr_mask, true),
|
|
|
26ba25 |
DEFINE_PROP_UINT32("level", X86CPU, env.cpuid_level, UINT32_MAX),
|
|
|
26ba25 |
DEFINE_PROP_UINT32("xlevel", X86CPU, env.cpuid_xlevel, UINT32_MAX),
|
|
|
26ba25 |
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
|
|
|
26ba25 |
index 4a3ef4b..58d5430 100644
|
|
|
26ba25 |
--- a/target/i386/cpu.h
|
|
|
26ba25 |
+++ b/target/i386/cpu.h
|
|
|
26ba25 |
@@ -1418,6 +1418,9 @@ struct X86CPU {
|
|
|
26ba25 |
/* if true override the phys_bits value with a value read from the host */
|
|
|
26ba25 |
bool host_phys_bits;
|
|
|
26ba25 |
|
|
|
26ba25 |
+ /* if set, limit maximum value for phys_bits when host_phys_bits is true */
|
|
|
26ba25 |
+ uint8_t host_phys_bits_limit;
|
|
|
26ba25 |
+
|
|
|
26ba25 |
/* Stop SMI delivery for migration compatibility with old machines */
|
|
|
26ba25 |
bool kvm_no_smi_migration;
|
|
|
26ba25 |
|
|
|
26ba25 |
--
|
|
|
26ba25 |
1.8.3.1
|
|
|
26ba25 |
|