Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ffcba43f authored by Nicolai Stange's avatar Nicolai Stange Committed by Thomas Gleixner
Browse files

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: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarNicolai Stange <nstange@suse.de>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 447ae316
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -10,6 +10,7 @@
#include <asm/fixmap.h>
#include <asm/fixmap.h>
#include <asm/mpspec.h>
#include <asm/mpspec.h>
#include <asm/msr.h>
#include <asm/msr.h>
#include <asm/hardirq.h>


#define ARCH_APICTIMER_STOPS_ON_C3	1
#define ARCH_APICTIMER_STOPS_ON_C3	1


@@ -514,6 +515,7 @@ extern void irq_exit(void);
static inline void entering_irq(void)
static inline void entering_irq(void)
{
{
	irq_enter();
	irq_enter();
	kvm_set_cpu_l1tf_flush_l1d();
}
}


static inline void entering_ack_irq(void)
static inline void entering_ack_irq(void)
@@ -526,6 +528,7 @@ static inline void ipi_entering_ack_irq(void)
{
{
	irq_enter();
	irq_enter();
	ack_APIC_irq();
	ack_APIC_irq();
	kvm_set_cpu_l1tf_flush_l1d();
}
}


static inline void exiting_irq(void)
static inline void exiting_irq(void)
+1 −0
Original line number Original line Diff line number Diff line
@@ -261,6 +261,7 @@ __visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs)
{
{
	ack_APIC_irq();
	ack_APIC_irq();
	inc_irq_stat(irq_resched_count);
	inc_irq_stat(irq_resched_count);
	kvm_set_cpu_l1tf_flush_l1d();


	if (trace_resched_ipi_enabled()) {
	if (trace_resched_ipi_enabled()) {
		/*
		/*
+1 −0
Original line number Original line Diff line number Diff line
@@ -1285,6 +1285,7 @@ void uv_bau_message_interrupt(struct pt_regs *regs)
	struct msg_desc msgdesc;
	struct msg_desc msgdesc;


	ack_APIC_irq();
	ack_APIC_irq();
	kvm_set_cpu_l1tf_flush_l1d();
	time_start = get_cycles();
	time_start = get_cycles();


	bcp = &per_cpu(bau_control, smp_processor_id());
	bcp = &per_cpu(bau_control, smp_processor_id());