yeahuh / rpms / qemu-kvm

Forked from rpms/qemu-kvm 2 years ago
Clone

Blame SOURCES/kvm-spapr-Enable-DD2.3-accelerated-count-cache-flush-in-.patch

902636
From eb121ffa97c1c25d7853d51b4c8209c0bb521deb Mon Sep 17 00:00:00 2001
902636
From: David Gibson <dgibson@redhat.com>
902636
Date: Fri, 7 Feb 2020 00:57:04 +0000
902636
Subject: [PATCH 1/7] spapr: Enable DD2.3 accelerated count cache flush in
902636
 pseries-5.0 machine
902636
902636
RH-Author: David Gibson <dgibson@redhat.com>
902636
Message-id: <20200207005704.194428-1-dgibson@redhat.com>
902636
Patchwork-id: 93737
902636
O-Subject: [RHEL-AV-8.2 qemu-kvm PATCHv2] spapr: Enable DD2.3 accelerated count cache flush in pseries-5.0 machine
902636
Bugzilla: 1796240
902636
RH-Acked-by: Danilo de Paula <ddepaula@redhat.com>
902636
RH-Acked-by: Laurent Vivier <lvivier@redhat.com>
902636
RH-Acked-by: Thomas Huth <thuth@redhat.com>
902636
902636
From: David Gibson <david@gibson.dropbear.id.au>
902636
902636
For POWER9 DD2.2 cpus, the best current Spectre v2 indirect branch
902636
mitigation is "count cache disabled", which is configured with:
902636
    -machine cap-ibs=fixed-ccd
902636
However, this option isn't available on DD2.3 CPUs with KVM, because they
902636
don't have the count cache disabled.
902636
902636
For POWER9 DD2.3 cpus, it is "count cache flush with assist", configured
902636
with:
902636
    -machine cap-ibs=workaround,cap-ccf-assist=on
902636
However this option isn't available on DD2.2 CPUs with KVM, because they
902636
don't have the special CCF assist instruction this relies on.
902636
902636
On current machine types, we default to "count cache flush w/o assist",
902636
that is:
902636
    -machine cap-ibs=workaround,cap-ccf-assist=off
902636
This runs, with mitigation on both DD2.2 and DD2.3 host cpus, but has a
902636
fairly significant performance impact.
902636
902636
It turns out we can do better.  The special instruction that CCF assist
902636
uses to trigger a count cache flush is a no-op on earlier CPUs, rather than
902636
trapping or causing other badness.  It doesn't, of itself, implement the
902636
mitigation, but *if* we have count-cache-disabled, then the count cache
902636
flush is unnecessary, and so using the count cache flush mitigation is
902636
harmless.
902636
902636
Therefore for the new pseries-5.0 machine type, enable cap-ccf-assist by
902636
default.  Along with that, suppress throwing an error if cap-ccf-assist
902636
is selected but KVM doesn't support it, as long as KVM *is* giving us
902636
count-cache-disabled.  To allow TCG to work out of the box, even though it
902636
doesn't implement the ccf flush assist, downgrade the error in that case to
902636
a warning.  This matches several Spectre mitigations where we allow TCG
902636
to operate for debugging, since we don't really make guarantees about TCG
902636
security properties anyway.
902636
902636
While we're there, make the TCG warning for this case match that for other
902636
mitigations.
902636
902636
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
902636
Tested-by: Michael Ellerman <mpe@ellerman.id.au>
902636
(cherry picked from commit 37965dfe4dffa3ac49438337417608e7f346b58a)
902636
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
902636
902636
Conflicts:
902636
	hw/ppc/spapr.c
902636
902636
Adjusted machine version compatibility code to the RHEL machine types
902636
rather than the upstream machine types.
902636
902636
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1796240
902636
Brew: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=26285002
902636
Branch: rhel-av-8.2.0
902636
Upstream: Merged for qemu-5.0
902636
902636
Signed-off-by: David Gibson <dgibson@redhat.com>
902636
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
902636
---
902636
 hw/ppc/spapr.c      |  4 +++-
902636
 hw/ppc/spapr_caps.c | 21 +++++++++++++++++----
902636
 2 files changed, 20 insertions(+), 5 deletions(-)
902636
902636
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
902636
index c12862d..a330f03 100644
902636
--- a/hw/ppc/spapr.c
902636
+++ b/hw/ppc/spapr.c
902636
@@ -4440,7 +4440,7 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
902636
     smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 16; /* 64kiB */
902636
     smc->default_caps.caps[SPAPR_CAP_NESTED_KVM_HV] = SPAPR_CAP_OFF;
902636
     smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_ON;
902636
-    smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF;
902636
+    smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_ON;
902636
     spapr_caps_add_properties(smc, &error_abort);
902636
     smc->irq = &spapr_irq_dual;
902636
     smc->dr_phb_enabled = true;
902636
@@ -4904,6 +4904,8 @@ static void spapr_machine_rhel810_class_options(MachineClass *mc)
902636
                      hw_compat_rhel_8_1_len);
902636
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
902636
 
902636
+    /* from pseries-4.2 */
902636
+    smc->default_caps.caps[SPAPR_CAP_CCF_ASSIST] = SPAPR_CAP_OFF;
902636
 }
902636
 
902636
 DEFINE_SPAPR_MACHINE(rhel810, "rhel8.1.0", false);
902636
diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c
902636
index 805f385..6e6fb28 100644
902636
--- a/hw/ppc/spapr_caps.c
902636
+++ b/hw/ppc/spapr_caps.c
902636
@@ -492,11 +492,24 @@ static void cap_ccf_assist_apply(SpaprMachineState *spapr, uint8_t val,
902636
     uint8_t kvm_val = kvmppc_get_cap_count_cache_flush_assist();
902636
 
902636
     if (tcg_enabled() && val) {
902636
-        /* TODO - for now only allow broken for TCG */
902636
-        error_setg(errp,
902636
-"Requested count cache flush assist capability level not supported by tcg,"
902636
-                   " try appending -machine cap-ccf-assist=off");
902636
+        /* TCG doesn't implement anything here, but allow with a warning */
902636
+        warn_report("TCG doesn't support requested feature, cap-ccf-assist=on");
902636
     } else if (kvm_enabled() && (val > kvm_val)) {
902636
+        uint8_t kvm_ibs = kvmppc_get_cap_safe_indirect_branch();
902636
+
902636
+        if (kvm_ibs == SPAPR_CAP_FIXED_CCD) {
902636
+            /*
902636
+             * If we don't have CCF assist on the host, the assist
902636
+             * instruction is a harmless no-op.  It won't correctly
902636
+             * implement the cache count flush *but* if we have
902636
+             * count-cache-disabled in the host, that flush is
902636
+             * unnnecessary.  So, specifically allow this case.  This
902636
+             * allows us to have better performance on POWER9 DD2.3,
902636
+             * while still working on POWER9 DD2.2 and POWER8 host
902636
+             * cpus.
902636
+             */
902636
+            return;
902636
+        }
902636
         error_setg(errp,
902636
 "Requested count cache flush assist capability level not supported by kvm,"
902636
                    " try appending -machine cap-ccf-assist=off");
902636
-- 
902636
1.8.3.1
902636