]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
x86/irq: Let interrupt handlers set kvm_cpu_l1tf_flush_l1d
authorNicolai Stange <nstange@suse.de>
Sun, 29 Jul 2018 11:06:04 +0000 (13:06 +0200)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Sat, 11 Aug 2018 00:44:50 +0000 (20:44 -0400)
The last missing piece to having vmx_l1d_flush() take interrupts after
VMEXIT into account is to set the kvm_cpu_l1tf_flush_l1d per-cpu flag on
irq entry.

Issue calls to kvm_set_cpu_l1tf_flush_l1d() from entering_irq(),
ipi_entering_ack_irq(), smp_reschedule_interrupt() and
uv_bau_message_interrupt().

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Nicolai Stange <nstange@suse.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Orabug: 28220674
CVE: CVE-2018-3646

(cherry picked from commit ffcba43ff66c7dab34ec700debd491d2a4d319b4)

Signed-off-by: Mihai Carabas <mihai.carabas@oracle.com>
Reviewed-by: Darren Kenny <darren.kenny@oracle.com>
Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Conflicts:
arch/x86/include/asm/apic.h
arch/x86/kernel/smp.c
Contextual: different content

arch/x86/include/asm/apic.h
arch/x86/kernel/irq_work.c
arch/x86/kernel/smp.c
arch/x86/platform/uv/tlb_uv.c

index 1349b2842a55ca52329fe9a637e941f0e15ceda3..49aec5b04641095c59420a1eed20e8fc812991dc 100644 (file)
@@ -13,6 +13,7 @@
 #include <asm/mpspec.h>
 #include <asm/msr.h>
 #include <asm/idle.h>
+#include <asm/hardirq.h>
 
 #define ARCH_APICTIMER_STOPS_ON_C3     1
 
@@ -644,6 +645,7 @@ static inline void entering_irq(void)
 {
        irq_enter();
        exit_idle();
+       kvm_set_cpu_l1tf_flush_l1d();
 }
 
 static inline void entering_ack_irq(void)
index 15d741ddfeeb7c4497e28052e1ad7ea08e68c252..bbb6971c31a5f5fefe13af7f6678df31a1b21901 100644 (file)
@@ -9,11 +9,13 @@
 #include <linux/hardirq.h>
 #include <asm/apic.h>
 #include <asm/trace/irq_vectors.h>
+#include <asm/hardirq.h>
 
 static inline void irq_work_entering_irq(void)
 {
        irq_enter();
        ack_APIC_irq();
+       kvm_set_cpu_l1tf_flush_l1d();
 }
 
 static inline void __smp_irq_work_interrupt(void)
index be8e1bde07aa47ff373f0245e0f4b7d6d2edcfd5..5ecd3f9bc6f89f13f3ef79a681b5b6d87d9eb802 100644 (file)
@@ -253,6 +253,7 @@ finish:
 static inline void __smp_reschedule_interrupt(void)
 {
        inc_irq_stat(irq_resched_count);
+       kvm_set_cpu_l1tf_flush_l1d();
        scheduler_ipi();
 }
 
index e4b6d8f417053b7251262542d3a65f7db6644212..e6cd65aefc07fe40aa0cf4ef9147830f25900fe4 100644 (file)
@@ -1310,6 +1310,7 @@ void uv_bau_message_interrupt(struct pt_regs *regs)
        struct msg_desc msgdesc;
 
        ack_APIC_irq();
+       kvm_set_cpu_l1tf_flush_l1d();
        time_start = get_cycles();
 
        bcp = &per_cpu(bau_control, smp_processor_id());