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