typedef struct {
        u16          __softirq_pending;
+#if IS_ENABLED(CONFIG_KVM_INTEL)
+       u8           kvm_cpu_l1tf_flush_l1d;
+#endif
        unsigned int __nmi_count;       /* arch dependent */
 #ifdef CONFIG_X86_LOCAL_APIC
        unsigned int apic_timer_irqs;   /* arch dependent */
 extern u64 arch_irq_stat(void);
 #define arch_irq_stat          arch_irq_stat
 
+
+#if IS_ENABLED(CONFIG_KVM_INTEL)
+static inline void kvm_set_cpu_l1tf_flush_l1d(void)
+{
+       __this_cpu_write(irq_stat.kvm_cpu_l1tf_flush_l1d, 1);
+}
+
+static inline void kvm_clear_cpu_l1tf_flush_l1d(void)
+{
+       __this_cpu_write(irq_stat.kvm_cpu_l1tf_flush_l1d, 0);
+}
+
+static inline bool kvm_get_cpu_l1tf_flush_l1d(void)
+{
+       return __this_cpu_read(irq_stat.kvm_cpu_l1tf_flush_l1d);
+}
+#else /* !IS_ENABLED(CONFIG_KVM_INTEL) */
+static inline void kvm_set_cpu_l1tf_flush_l1d(void) { }
+#endif /* IS_ENABLED(CONFIG_KVM_INTEL) */
+
 #endif /* _ASM_X86_HARDIRQ_H */
 
         * 'always'
         */
        if (static_branch_likely(&vmx_l1d_flush_cond)) {
-               bool flush_l1d = vcpu->arch.l1tf_flush_l1d;
+               bool flush_l1d;
 
                /*
-                * Clear the flush bit, it gets set again either from
-                * vcpu_run() or from one of the unsafe VMEXIT
-                * handlers.
+                * Clear the per-vcpu flush bit, it gets set again
+                * either from vcpu_run() or from one of the unsafe
+                * VMEXIT handlers.
                 */
+               flush_l1d = vcpu->arch.l1tf_flush_l1d;
                vcpu->arch.l1tf_flush_l1d = false;
+
+               /*
+                * Clear the per-cpu flush bit, it gets set again from
+                * the interrupt handlers.
+                */
+               flush_l1d |= kvm_get_cpu_l1tf_flush_l1d();
+               kvm_clear_cpu_l1tf_flush_l1d();
+
                if (!flush_l1d)
                        return;
        }