| From foo@baz Tue Aug 14 16:14:56 CEST 2018 |
| From: Nicolai Stange <nstange@suse.de> |
| Date: Sun, 29 Jul 2018 13:06:04 +0200 |
| Subject: x86/irq: Let interrupt handlers set kvm_cpu_l1tf_flush_l1d |
| |
| From: Nicolai Stange <nstange@suse.de> |
| |
| commit ffcba43ff66c7dab34ec700debd491d2a4d319b4 upstream |
| |
| 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> |
| Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/x86/include/asm/apic.h | 3 +++ |
| arch/x86/kernel/smp.c | 1 + |
| arch/x86/platform/uv/tlb_uv.c | 1 + |
| 3 files changed, 5 insertions(+) |
| |
| --- a/arch/x86/include/asm/apic.h |
| +++ b/arch/x86/include/asm/apic.h |
| @@ -12,6 +12,7 @@ |
| #include <asm/mpspec.h> |
| #include <asm/msr.h> |
| #include <asm/idle.h> |
| +#include <asm/hardirq.h> |
| |
| #define ARCH_APICTIMER_STOPS_ON_C3 1 |
| |
| @@ -647,6 +648,7 @@ static inline void entering_irq(void) |
| { |
| irq_enter(); |
| exit_idle(); |
| + kvm_set_cpu_l1tf_flush_l1d(); |
| } |
| |
| static inline void entering_ack_irq(void) |
| @@ -659,6 +661,7 @@ static inline void ipi_entering_ack_irq( |
| { |
| irq_enter(); |
| ack_APIC_irq(); |
| + kvm_set_cpu_l1tf_flush_l1d(); |
| } |
| |
| static inline void exiting_irq(void) |
| --- a/arch/x86/kernel/smp.c |
| +++ b/arch/x86/kernel/smp.c |
| @@ -271,6 +271,7 @@ __visible void __irq_entry smp_reschedul |
| /* |
| * KVM uses this interrupt to force a cpu out of guest mode |
| */ |
| + kvm_set_cpu_l1tf_flush_l1d(); |
| } |
| |
| __visible void __irq_entry smp_trace_reschedule_interrupt(struct pt_regs *regs) |
| --- a/arch/x86/platform/uv/tlb_uv.c |
| +++ b/arch/x86/platform/uv/tlb_uv.c |
| @@ -1283,6 +1283,7 @@ void uv_bau_message_interrupt(struct pt_ |
| 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()); |