From: Nicolai Stange Date: Sun, 29 Jul 2018 11:06:04 +0000 (+0200) Subject: x86/irq: Let interrupt handlers set kvm_cpu_l1tf_flush_l1d X-Git-Tag: v4.1.12-124.31.3~606 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=a734e913fb5c0573c33e3bf95159b60dd798e17e;p=users%2Fjedix%2Flinux-maple.git x86/irq: Let interrupt handlers set kvm_cpu_l1tf_flush_l1d 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 Signed-off-by: Nicolai Stange Signed-off-by: Thomas Gleixner Orabug: 28220674 CVE: CVE-2018-3646 (cherry picked from commit ffcba43ff66c7dab34ec700debd491d2a4d319b4) Signed-off-by: Mihai Carabas Reviewed-by: Darren Kenny Reviewed-by: Boris Ostrovsky Conflicts: arch/x86/include/asm/apic.h arch/x86/kernel/smp.c Contextual: different content --- diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h index 1349b2842a55..49aec5b04641 100644 --- a/arch/x86/include/asm/apic.h +++ b/arch/x86/include/asm/apic.h @@ -13,6 +13,7 @@ #include #include #include +#include #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) diff --git a/arch/x86/kernel/irq_work.c b/arch/x86/kernel/irq_work.c index 15d741ddfeeb..bbb6971c31a5 100644 --- a/arch/x86/kernel/irq_work.c +++ b/arch/x86/kernel/irq_work.c @@ -9,11 +9,13 @@ #include #include #include +#include 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) diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c index be8e1bde07aa..5ecd3f9bc6f8 100644 --- a/arch/x86/kernel/smp.c +++ b/arch/x86/kernel/smp.c @@ -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(); } diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c index e4b6d8f41705..e6cd65aefc07 100644 --- a/arch/x86/platform/uv/tlb_uv.c +++ b/arch/x86/platform/uv/tlb_uv.c @@ -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());