All of lore.kernel.org
 help / color / mirror / Atom feed
* [MODERATED] [PATCH v3 1/8] kvm: handle host mode irqs 1
  2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
@ 2018-07-21 20:16 ` Nicolai Stange
  2018-07-21 20:25 ` [MODERATED] [PATCH v3 2/8] kvm: handle host mode irqs 2 Nicolai Stange
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-07-21 20:16 UTC (permalink / raw)
  To: speck

vmx_l1d_flush() gets invoked only if ->l1tf_flush_l1d is true. There's
no point in setting ->l1tf_flush_l1d to true from there again.

Don't do that.

Signed-off-by: Nicolai Stange <nstange@suse.de>
---
 arch/x86/kvm/vmx.c | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index b4b8e8cb4a7e..695e161ffb36 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -9691,15 +9691,15 @@ static void vmx_l1d_flush(struct kvm_vcpu *vcpu)
 	/*
 	 * This code is only executed when the the flush mode is 'cond' or
 	 * 'always'
-	 *
-	 * If 'flush always', keep the flush bit set, otherwise clear
-	 * it. The flush bit gets set again either from vcpu_run() or from
-	 * one of the unsafe VMEXIT handlers.
 	 */
-	if (static_branch_unlikely(&vmx_l1d_flush_always))
-		vcpu->arch.l1tf_flush_l1d = true;
-	else
+	if (!static_branch_unlikely(&vmx_l1d_flush_always)) {
+		/*
+		 * Clear the flush bit, it gets set again either from
+		 * vcpu_run() or from one of the unsafe VMEXIT
+		 * handlers.
+		 */
 		vcpu->arch.l1tf_flush_l1d = false;
+	}
 
 	vcpu->stat.l1d_flush++;
 
-- 
2.13.7

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [MODERATED] [PATCH v3 2/8] kvm: handle host mode irqs 2
  2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
  2018-07-21 20:16 ` [MODERATED] [PATCH v3 1/8] kvm: handle host mode irqs 1 Nicolai Stange
@ 2018-07-21 20:25 ` Nicolai Stange
  2018-07-21 20:35 ` [MODERATED] [PATCH v3 3/8] kvm: handle host mode irqs 3 Nicolai Stange
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-07-21 20:25 UTC (permalink / raw)
  To: speck

The vmx_l1d_flush_always static key is only ever evaluated if
vmx_l1d_should_flush is enabled. In that case however, there are only two
L1d flushing modes possible: "always" and "conditional".

The "conditional" mode's implementation tends to require more
sophisticated logic than the "always" mode.

Avoid inverted logic by replacing the 'vmx_l1d_flush_always' static key
with a 'vmx_l1d_flush_cond' one.

There is no change in functionality.

Signed-off-by: Nicolai Stange <nstange@suse.de>
---
 arch/x86/kvm/vmx.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 695e161ffb36..5139738cc5a9 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -189,7 +189,7 @@ module_param(ple_window_max, uint, 0444);
 extern const ulong vmx_return;
 
 static DEFINE_STATIC_KEY_FALSE(vmx_l1d_should_flush);
-static DEFINE_STATIC_KEY_FALSE(vmx_l1d_flush_always);
+static DEFINE_STATIC_KEY_FALSE(vmx_l1d_flush_cond);
 static DEFINE_MUTEX(vmx_l1d_flush_mutex);
 
 /* Storage for pre module init parameter parsing */
@@ -263,10 +263,10 @@ static int vmx_setup_l1d_flush(enum vmx_l1d_flush_state l1tf)
 	else
 		static_branch_disable(&vmx_l1d_should_flush);
 
-	if (l1tf == VMENTER_L1D_FLUSH_ALWAYS)
-		static_branch_enable(&vmx_l1d_flush_always);
+	if (l1tf == VMENTER_L1D_FLUSH_COND)
+		static_branch_enable(&vmx_l1d_flush_cond);
 	else
-		static_branch_disable(&vmx_l1d_flush_always);
+		static_branch_disable(&vmx_l1d_flush_cond);
 	return 0;
 }
 
@@ -9692,7 +9692,7 @@ static void vmx_l1d_flush(struct kvm_vcpu *vcpu)
 	 * This code is only executed when the the flush mode is 'cond' or
 	 * 'always'
 	 */
-	if (!static_branch_unlikely(&vmx_l1d_flush_always)) {
+	if (static_branch_likely(&vmx_l1d_flush_cond)) {
 		/*
 		 * Clear the flush bit, it gets set again either from
 		 * vcpu_run() or from one of the unsafe VMEXIT
-- 
2.13.7

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [MODERATED] [PATCH v3 3/8] kvm: handle host mode irqs 3
  2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
  2018-07-21 20:16 ` [MODERATED] [PATCH v3 1/8] kvm: handle host mode irqs 1 Nicolai Stange
  2018-07-21 20:25 ` [MODERATED] [PATCH v3 2/8] kvm: handle host mode irqs 2 Nicolai Stange
@ 2018-07-21 20:35 ` Nicolai Stange
  2018-07-22 11:38 ` [MODERATED] [PATCH v3 8/8] kvm: handle host mode irqs 8 Nicolai Stange
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-07-21 20:35 UTC (permalink / raw)
  To: speck

Currently, vmx_vcpu_run() checks if ->l1tf_flush_l1d is set and invokes
vmx_l1d_flush() if so.

This test is unncessary for the "always flush L1d" mode.

Move the check to vmx_l1d_flush()'s conditional mode code path.

Notes:
- vmx_l1d_flush() is likely to get inlined anyway and thus, there's no
  extra function call.
- This change inverts the (static) branch prediction, but there hadn't been
  any explicit likely()/unlikely() annotations before and so I decided
  to leave it as is.

Signed-off-by: Nicolai Stange <nstange@suse.de>
---
 arch/x86/kvm/vmx.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 5139738cc5a9..ec955b870756 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -9693,12 +9693,16 @@ static void vmx_l1d_flush(struct kvm_vcpu *vcpu)
 	 * 'always'
 	 */
 	if (static_branch_likely(&vmx_l1d_flush_cond)) {
+		bool flush_l1d = vcpu->arch.l1tf_flush_l1d;
+
 		/*
 		 * Clear the flush bit, it gets set again either from
 		 * vcpu_run() or from one of the unsafe VMEXIT
 		 * handlers.
 		 */
 		vcpu->arch.l1tf_flush_l1d = false;
+		if (!flush_l1d)
+			return;
 	}
 
 	vcpu->stat.l1d_flush++;
@@ -10228,10 +10232,8 @@ static void __noclone vmx_vcpu_run(struct kvm_vcpu *vcpu)
 	evmcs_rsp = static_branch_unlikely(&enable_evmcs) ?
 		(unsigned long)&current_evmcs->host_rsp : 0;
 
-	if (static_branch_unlikely(&vmx_l1d_should_flush)) {
-		if (vcpu->arch.l1tf_flush_l1d)
-			vmx_l1d_flush(vcpu);
-	}
+	if (static_branch_unlikely(&vmx_l1d_should_flush))
+		vmx_l1d_flush(vcpu);
 
 	asm(
 		/* Store host registers */
-- 
2.13.7

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [MODERATED] [PATCH v3 8/8] kvm: handle host mode irqs 8
  2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
                   ` (2 preceding siblings ...)
  2018-07-21 20:35 ` [MODERATED] [PATCH v3 3/8] kvm: handle host mode irqs 3 Nicolai Stange
@ 2018-07-22 11:38 ` Nicolai Stange
  2018-07-27 10:46 ` [MODERATED] [PATCH v3 4/8] kvm: handle host mode irqs 4 Nicolai Stange
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-07-22 11:38 UTC (permalink / raw)
  To: speck

For VMEXITs caused by external interrupts, vmx_handle_external_intr()
indirectly calls into the interrupt handlers through the host's IDT.

It follows that these interrupts get accounted for in the
kvm_cpu_l1tf_flush_l1d per-cpu flag.

The subsequently executed vmx_l1d_flush() will thus be aware that some
interrupts have happened and conduct a L1d flush anyway.

Setting ->l1tf_flush_l1d from vmx_handle_external_intr() isn't needed
anymore. Drop it.

Signed-off-by: Nicolai Stange <nstange@suse.de>
---
 arch/x86/kvm/vmx.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 33892ddd229f..c6594fe38437 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -9983,7 +9983,6 @@ static void vmx_handle_external_intr(struct kvm_vcpu *vcpu)
 			[ss]"i"(__KERNEL_DS),
 			[cs]"i"(__KERNEL_CS)
 			);
-		vcpu->arch.l1tf_flush_l1d = true;
 	}
 }
 STACK_FRAME_NON_STANDARD(vmx_handle_external_intr);
-- 
2.13.7

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [MODERATED] [PATCH v3 4/8] kvm: handle host mode irqs 4
  2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
                   ` (3 preceding siblings ...)
  2018-07-22 11:38 ` [MODERATED] [PATCH v3 8/8] kvm: handle host mode irqs 8 Nicolai Stange
@ 2018-07-27 10:46 ` Nicolai Stange
  2018-07-27 11:22 ` [MODERATED] [PATCH v3 5/8] kvm: handle host mode irqs 5 Nicolai Stange
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-07-27 10:46 UTC (permalink / raw)
  To: speck

An upcoming patch will extend KVM's L1TF mitigation in conditional mode
to also cover interrupts after VMEXITs. For tracking those, stores to a
new per-cpu flag from interrupt handlers will become necessary.

In order to improve cache locality, this new flag will be added to x86's
irq_cpustat_t.

Make some space available there by shrinking the ->softirq_pending bitfield
from 32 to 16 bits: the number of bits actually used is only
NR_SOFTIRQS == 10.

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Nicolai Stange <nstange@suse.de>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 arch/x86/include/asm/hardirq.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/hardirq.h b/arch/x86/include/asm/hardirq.h
index 740a428acf1e..cd43dffa6fb4 100644
--- a/arch/x86/include/asm/hardirq.h
+++ b/arch/x86/include/asm/hardirq.h
@@ -6,7 +6,7 @@
 #include <linux/irq.h>
 
 typedef struct {
-	unsigned int __softirq_pending;
+	u16 __softirq_pending;
 	unsigned int __nmi_count;	/* arch dependent */
 #ifdef CONFIG_X86_LOCAL_APIC
 	unsigned int apic_timer_irqs;	/* arch dependent */
-- 
2.13.7

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [MODERATED] [PATCH v3 5/8] kvm: handle host mode irqs 5
  2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
                   ` (4 preceding siblings ...)
  2018-07-27 10:46 ` [MODERATED] [PATCH v3 4/8] kvm: handle host mode irqs 4 Nicolai Stange
@ 2018-07-27 11:22 ` Nicolai Stange
  2018-07-29 10:15 ` [MODERATED] [PATCH v3 6/8] kvm: handle host mode irqs 6 Nicolai Stange
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-07-27 11:22 UTC (permalink / raw)
  To: speck

Part of the L1TF mitigation for vmx includes flushing the L1d cache upon
VMENTRY.

L1d flushes are costly and two modes of operations are provided to users:
"always" and the more selective "conditional" mode.

If operating in the latter, the cache would get flushed only if a host side
code path considered unconfined had been traversed. "Unconfined" in this
context means that it might have pulled in sensitive data like user data
or kernel crypto keys.

The need for L1d flushes is tracked by means of the per-vcpu flag
->l1tf_flush_l1d. KVM exit handlers considered unconfined set it. A
vmx_l1d_flush() subsequently invoked before the next VMENTER will conduct a
L1d flush based on its value and reset that flag again.

Currently, interrupts delivered "normally" while in root operation between
VMEXIT and VMENTER are not taken into account. Part of the reason is that
these don't leave any traces and thus, the vmx code is unable to tell if
any such has happened.

As proposed by Paolo Bonzini, prepare for tracking all interrupts by
introducing a new per-cpu flag, "kvm_cpu_l1tf_flush_l1d". It will be in
strong analogy to the per-vcpu ->l1tf_flush_l1d.

A later patch will make interrupt handlers set it.

For the sake of cache locality, group kvm_cpu_l1tf_flush_l1d into x86'
per-cpu irq_cpustat_t as suggested by Peter Zijlstra.

Provide the helpers kvm_set_cpu_l1tf_flush_l1d(),
kvm_clear_cpu_l1tf_flush_l1d() and kvm_get_cpu_l1tf_flush_l1d(). Make them
trivial resp. non-existent for !CONFIG_KVM_INTEL as appropriate.

Let vmx_l1d_flush() handle kvm_cpu_l1tf_flush_l1d in the same way as
->l1tf_flush_l1d.

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Suggested-by: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Nicolai Stange <nstange@suse.de>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
---
 arch/x86/include/asm/hardirq.h | 24 ++++++++++++++++++++++++
 arch/x86/kvm/vmx.c             | 17 +++++++++++++----
 2 files changed, 37 insertions(+), 4 deletions(-)

diff --git a/arch/x86/include/asm/hardirq.h b/arch/x86/include/asm/hardirq.h
index cd43dffa6fb4..6a189be51468 100644
--- a/arch/x86/include/asm/hardirq.h
+++ b/arch/x86/include/asm/hardirq.h
@@ -7,6 +7,9 @@
 
 typedef struct {
 	u16 __softirq_pending;
+#if IS_ENABLED(CONFIG_KVM_INTEL)
+	unsigned char kvm_cpu_l1tf_flush_l1d;
+#endif
 	unsigned int __nmi_count;	/* arch dependent */
 #ifdef CONFIG_X86_LOCAL_APIC
 	unsigned int apic_timer_irqs;	/* arch dependent */
@@ -58,4 +61,25 @@ extern u64 arch_irq_stat_cpu(unsigned int cpu);
 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 */
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index ec955b870756..33892ddd229f 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -9693,14 +9693,23 @@ static void vmx_l1d_flush(struct kvm_vcpu *vcpu)
 	 * '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;
 	}
-- 
2.13.7

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [MODERATED] [PATCH v3 6/8] kvm: handle host mode irqs 6
  2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
                   ` (5 preceding siblings ...)
  2018-07-27 11:22 ` [MODERATED] [PATCH v3 5/8] kvm: handle host mode irqs 5 Nicolai Stange
@ 2018-07-29 10:15 ` Nicolai Stange
  2018-07-29 11:06 ` [MODERATED] [PATCH v3 7/8] kvm: handle host mode irqs 7 Nicolai Stange
  2018-08-03 14:18 ` [PATCH v3 0/8] kvm: handle host mode irqs 0 Thomas Gleixner
  8 siblings, 0 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-07-29 10:15 UTC (permalink / raw)
  To: speck

The next patch in this series will have to make the definition of
irq_cpustat_t available to entering_irq().

Inclusion of asm/hardirq.h into asm/apic.h would cause circular header
dependencies like

  asm/smp.h
    asm/apic.h
      asm/hardirq.h
        linux/irq.h
          linux/topology.h
            linux/smp.h
              asm/smp.h

or

  linux/gfp.h
    linux/mmzone.h
      asm/mmzone.h
        asm/mmzone_64.h
          asm/smp.h
            asm/apic.h
              asm/hardirq.h
                linux/irq.h
                  linux/irqdesc.h
                    linux/kobject.h
                      linux/sysfs.h
                        linux/kernfs.h
                          linux/idr.h
                            linux/gfp.h

and others.

This causes compilation errors because of the header guards becoming
effective in the second inclusion: symbols/macros that had been defined
before wouldn't be available to intermediate headers in the #include chain
anymore.

A possible workaround would be to move the definition of irq_cpustat_t
into its own header and include that from both, asm/hardirq.h and
asm/apic.h.

However, this wouldn't solve the real problem, namely asm/harirq.h
unnecessarily pulling in all the linux/irq.h cruft: nothing in
asm/hardirq.h itself requires it. Also, note that there are some other
archs, like e.g. arm64, which don't have that #include in their
asm/hardirq.h.

Remove the linux/irq.h #include from x86' asm/hardirq.h.

Fix resulting compilation errors by adding appropriate #includes to *.c
files as needed.

Note that some of these *.c files could be cleaned up a bit wrt. to their
set of #includes, but that should better be done from separate patches, if
at all.

Signed-off-by: Nicolai Stange <nstange@suse.de>
---
 arch/x86/include/asm/dmi.h                                   | 2 +-
 arch/x86/include/asm/hardirq.h                               | 1 -
 arch/x86/include/asm/kvm_host.h                              | 1 +
 arch/x86/kernel/apic/apic.c                                  | 1 +
 arch/x86/kernel/apic/io_apic.c                               | 1 +
 arch/x86/kernel/apic/msi.c                                   | 1 +
 arch/x86/kernel/apic/vector.c                                | 1 +
 arch/x86/kernel/fpu/core.c                                   | 1 +
 arch/x86/kernel/hpet.c                                       | 1 +
 arch/x86/kernel/i8259.c                                      | 1 +
 arch/x86/kernel/idt.c                                        | 1 +
 arch/x86/kernel/irq.c                                        | 1 +
 arch/x86/kernel/irq_32.c                                     | 1 +
 arch/x86/kernel/irq_64.c                                     | 1 +
 arch/x86/kernel/irqinit.c                                    | 1 +
 arch/x86/kernel/smpboot.c                                    | 1 +
 arch/x86/kernel/time.c                                       | 1 +
 arch/x86/mm/pti.c                                            | 1 +
 arch/x86/platform/intel-mid/device_libs/platform_mrfld_wdt.c | 1 +
 arch/x86/xen/enlighten.c                                     | 1 +
 drivers/gpu/drm/i915/i915_pmu.c                              | 1 +
 drivers/gpu/drm/i915/intel_lpe_audio.c                       | 1 +
 drivers/pci/controller/pci-hyperv.c                          | 1 +
 23 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/arch/x86/include/asm/dmi.h b/arch/x86/include/asm/dmi.h
index 0ab2ab27ad1f..b825cb201251 100644
--- a/arch/x86/include/asm/dmi.h
+++ b/arch/x86/include/asm/dmi.h
@@ -4,8 +4,8 @@
 
 #include <linux/compiler.h>
 #include <linux/init.h>
+#include <linux/io.h>
 
-#include <asm/io.h>
 #include <asm/setup.h>
 
 static __always_inline __init void *dmi_alloc(unsigned len)
diff --git a/arch/x86/include/asm/hardirq.h b/arch/x86/include/asm/hardirq.h
index 6a189be51468..30070b41cdbd 100644
--- a/arch/x86/include/asm/hardirq.h
+++ b/arch/x86/include/asm/hardirq.h
@@ -3,7 +3,6 @@
 #define _ASM_X86_HARDIRQ_H
 
 #include <linux/threads.h>
-#include <linux/irq.h>
 
 typedef struct {
 	u16 __softirq_pending;
diff --git a/arch/x86/include/asm/kvm_host.h b/arch/x86/include/asm/kvm_host.h
index 57d418061c55..37749429afd9 100644
--- a/arch/x86/include/asm/kvm_host.h
+++ b/arch/x86/include/asm/kvm_host.h
@@ -17,6 +17,7 @@
 #include <linux/tracepoint.h>
 #include <linux/cpumask.h>
 #include <linux/irq_work.h>
+#include <linux/irq.h>
 
 #include <linux/kvm.h>
 #include <linux/kvm_para.h>
diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c
index 8703caa9d6db..f93a21b01072 100644
--- a/arch/x86/kernel/apic/apic.c
+++ b/arch/x86/kernel/apic/apic.c
@@ -56,6 +56,7 @@
 #include <asm/hypervisor.h>
 #include <asm/cpu_device_id.h>
 #include <asm/intel-family.h>
+#include <asm/irq_regs.h>
 
 unsigned int num_processors;
 
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index 3982f79d2377..ff0d14cd9e82 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -33,6 +33,7 @@
 
 #include <linux/mm.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/init.h>
 #include <linux/delay.h>
 #include <linux/sched.h>
diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
index ce503c99f5c4..72a94401f9e0 100644
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -12,6 +12,7 @@
  */
 #include <linux/mm.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/pci.h>
 #include <linux/dmar.h>
 #include <linux/hpet.h>
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index 35aaee4fc028..c9b773401fd8 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -11,6 +11,7 @@
  * published by the Free Software Foundation.
  */
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/seq_file.h>
 #include <linux/init.h>
 #include <linux/compiler.h>
diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c
index f92a6593de1e..2ea85b32421a 100644
--- a/arch/x86/kernel/fpu/core.c
+++ b/arch/x86/kernel/fpu/core.c
@@ -10,6 +10,7 @@
 #include <asm/fpu/signal.h>
 #include <asm/fpu/types.h>
 #include <asm/traps.h>
+#include <asm/irq_regs.h>
 
 #include <linux/hardirq.h>
 #include <linux/pkeys.h>
diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
index 346b24883911..b0acb22e5a46 100644
--- a/arch/x86/kernel/hpet.c
+++ b/arch/x86/kernel/hpet.c
@@ -1,6 +1,7 @@
 #include <linux/clocksource.h>
 #include <linux/clockchips.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/export.h>
 #include <linux/delay.h>
 #include <linux/errno.h>
diff --git a/arch/x86/kernel/i8259.c b/arch/x86/kernel/i8259.c
index 86c4439f9d74..519649ddf100 100644
--- a/arch/x86/kernel/i8259.c
+++ b/arch/x86/kernel/i8259.c
@@ -5,6 +5,7 @@
 #include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/timex.h>
 #include <linux/random.h>
 #include <linux/init.h>
diff --git a/arch/x86/kernel/idt.c b/arch/x86/kernel/idt.c
index 74383a3780dc..01adea278a71 100644
--- a/arch/x86/kernel/idt.c
+++ b/arch/x86/kernel/idt.c
@@ -8,6 +8,7 @@
 #include <asm/traps.h>
 #include <asm/proto.h>
 #include <asm/desc.h>
+#include <asm/hw_irq.h>
 
 struct idt_data {
 	unsigned int	vector;
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c
index 328d027d829d..59b5f2ea7c2f 100644
--- a/arch/x86/kernel/irq.c
+++ b/arch/x86/kernel/irq.c
@@ -10,6 +10,7 @@
 #include <linux/ftrace.h>
 #include <linux/delay.h>
 #include <linux/export.h>
+#include <linux/irq.h>
 
 #include <asm/apic.h>
 #include <asm/io_apic.h>
diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c
index c1bdbd3d3232..95600a99ae93 100644
--- a/arch/x86/kernel/irq_32.c
+++ b/arch/x86/kernel/irq_32.c
@@ -11,6 +11,7 @@
 
 #include <linux/seq_file.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/kernel_stat.h>
 #include <linux/notifier.h>
 #include <linux/cpu.h>
diff --git a/arch/x86/kernel/irq_64.c b/arch/x86/kernel/irq_64.c
index d86e344f5b3d..0469cd078db1 100644
--- a/arch/x86/kernel/irq_64.c
+++ b/arch/x86/kernel/irq_64.c
@@ -11,6 +11,7 @@
 
 #include <linux/kernel_stat.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/seq_file.h>
 #include <linux/delay.h>
 #include <linux/ftrace.h>
diff --git a/arch/x86/kernel/irqinit.c b/arch/x86/kernel/irqinit.c
index 772196c1b8c4..a0693b71cfc1 100644
--- a/arch/x86/kernel/irqinit.c
+++ b/arch/x86/kernel/irqinit.c
@@ -5,6 +5,7 @@
 #include <linux/sched.h>
 #include <linux/ioport.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/timex.h>
 #include <linux/random.h>
 #include <linux/kprobes.h>
diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
index 7f7def989fb0..f5d30c68fd09 100644
--- a/arch/x86/kernel/smpboot.c
+++ b/arch/x86/kernel/smpboot.c
@@ -80,6 +80,7 @@
 #include <asm/intel-family.h>
 #include <asm/cpu_device_id.h>
 #include <asm/spec-ctrl.h>
+#include <asm/hw_irq.h>
 
 /* representing HT siblings of each logical CPU */
 DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, cpu_sibling_map);
diff --git a/arch/x86/kernel/time.c b/arch/x86/kernel/time.c
index 774ebafa97c4..be01328eb755 100644
--- a/arch/x86/kernel/time.c
+++ b/arch/x86/kernel/time.c
@@ -12,6 +12,7 @@
 
 #include <linux/clockchips.h>
 #include <linux/interrupt.h>
+#include <linux/irq.h>
 #include <linux/i8253.h>
 #include <linux/time.h>
 #include <linux/export.h>
diff --git a/arch/x86/mm/pti.c b/arch/x86/mm/pti.c
index 4d418e705878..fb752d9a3ce9 100644
--- a/arch/x86/mm/pti.c
+++ b/arch/x86/mm/pti.c
@@ -45,6 +45,7 @@
 #include <asm/pgalloc.h>
 #include <asm/tlbflush.h>
 #include <asm/desc.h>
+#include <asm/sections.h>
 
 #undef pr_fmt
 #define pr_fmt(fmt)     "Kernel/User page tables isolation: " fmt
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_mrfld_wdt.c b/arch/x86/platform/intel-mid/device_libs/platform_mrfld_wdt.c
index 4f5fa65a1011..2acd6be13375 100644
--- a/arch/x86/platform/intel-mid/device_libs/platform_mrfld_wdt.c
+++ b/arch/x86/platform/intel-mid/device_libs/platform_mrfld_wdt.c
@@ -18,6 +18,7 @@
 #include <asm/intel-mid.h>
 #include <asm/intel_scu_ipc.h>
 #include <asm/io_apic.h>
+#include <asm/hw_irq.h>
 
 #define TANGIER_EXT_TIMER0_MSI 12
 
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
index c9081c6671f0..df208af3cd74 100644
--- a/arch/x86/xen/enlighten.c
+++ b/arch/x86/xen/enlighten.c
@@ -3,6 +3,7 @@
 #endif
 #include <linux/cpu.h>
 #include <linux/kexec.h>
+#include <linux/slab.h>
 
 #include <xen/features.h>
 #include <xen/page.h>
diff --git a/drivers/gpu/drm/i915/i915_pmu.c b/drivers/gpu/drm/i915/i915_pmu.c
index dc87797db500..b50b74053664 100644
--- a/drivers/gpu/drm/i915/i915_pmu.c
+++ b/drivers/gpu/drm/i915/i915_pmu.c
@@ -5,5 +5,6 @@
  */
 
+#include <linux/irq.h>
 #include "i915_pmu.h"
 #include "intel_ringbuffer.h"
 #include "i915_drv.h"
diff --git a/drivers/gpu/drm/i915/intel_lpe_audio.c b/drivers/gpu/drm/i915/intel_lpe_audio.c
index 6269750e2b54..b4941101f21a 100644
--- a/drivers/gpu/drm/i915/intel_lpe_audio.c
+++ b/drivers/gpu/drm/i915/intel_lpe_audio.c
@@ -62,6 +62,7 @@
 
 #include <linux/acpi.h>
 #include <linux/device.h>
+#include <linux/irq.h>
 #include <linux/pci.h>
 #include <linux/pm_runtime.h>
 
diff --git a/drivers/pci/controller/pci-hyperv.c b/drivers/pci/controller/pci-hyperv.c
index 6cc5036ac83c..fadc305533d9 100644
--- a/drivers/pci/controller/pci-hyperv.c
+++ b/drivers/pci/controller/pci-hyperv.c
@@ -45,6 +45,7 @@
 #include <linux/irqdomain.h>
 #include <asm/irqdomain.h>
 #include <asm/apic.h>
+#include <linux/irq.h>
 #include <linux/msi.h>
 #include <linux/hyperv.h>
 #include <linux/refcount.h>
-- 
2.13.7

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [MODERATED] [PATCH v3 7/8] kvm: handle host mode irqs 7
  2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
                   ` (6 preceding siblings ...)
  2018-07-29 10:15 ` [MODERATED] [PATCH v3 6/8] kvm: handle host mode irqs 6 Nicolai Stange
@ 2018-07-29 11:06 ` Nicolai Stange
  2018-08-03 14:18 ` [PATCH v3 0/8] kvm: handle host mode irqs 0 Thomas Gleixner
  8 siblings, 0 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-07-29 11:06 UTC (permalink / raw)
  To: speck

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>
---
 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(+)

diff --git a/arch/x86/include/asm/apic.h b/arch/x86/include/asm/apic.h
index 9362a3aae927..130e81e10fc7 100644
--- a/arch/x86/include/asm/apic.h
+++ b/arch/x86/include/asm/apic.h
@@ -10,6 +10,7 @@
 #include <asm/fixmap.h>
 #include <asm/mpspec.h>
 #include <asm/msr.h>
+#include <asm/hardirq.h>
 
 #define ARCH_APICTIMER_STOPS_ON_C3	1
 
@@ -514,6 +515,7 @@ extern void irq_exit(void);
 static inline void entering_irq(void)
 {
 	irq_enter();
+	kvm_set_cpu_l1tf_flush_l1d();
 }
 
 static inline void entering_ack_irq(void)
@@ -526,6 +528,7 @@ static inline void ipi_entering_ack_irq(void)
 {
 	irq_enter();
 	ack_APIC_irq();
+	kvm_set_cpu_l1tf_flush_l1d();
 }
 
 static inline void exiting_irq(void)
diff --git a/arch/x86/kernel/smp.c b/arch/x86/kernel/smp.c
index 5c574dff4c1a..04adc8d60aed 100644
--- a/arch/x86/kernel/smp.c
+++ b/arch/x86/kernel/smp.c
@@ -261,6 +261,7 @@ __visible void __irq_entry smp_reschedule_interrupt(struct pt_regs *regs)
 {
 	ack_APIC_irq();
 	inc_irq_stat(irq_resched_count);
+	kvm_set_cpu_l1tf_flush_l1d();
 
 	if (trace_resched_ipi_enabled()) {
 		/*
diff --git a/arch/x86/platform/uv/tlb_uv.c b/arch/x86/platform/uv/tlb_uv.c
index ca446da48fd2..3866b96a7ee7 100644
--- a/arch/x86/platform/uv/tlb_uv.c
+++ b/arch/x86/platform/uv/tlb_uv.c
@@ -1285,6 +1285,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());
-- 
2.13.7

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0
@ 2018-08-02 11:34 Nicolai Stange
  2018-07-21 20:16 ` [MODERATED] [PATCH v3 1/8] kvm: handle host mode irqs 1 Nicolai Stange
                   ` (8 more replies)
  0 siblings, 9 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-08-02 11:34 UTC (permalink / raw)
  To: speck

Changes to v2:
--------------
- [5/8] ("x86/KVM/VMX: introduce per-host-cpu analogue of ->l1tf_flush_l1d"):
  use 'unsigned char' in place of former 'bool' for ->kvm_cpu_l1tf_flush_l1d
  (Peter Ziljstra). Update kvm_{set,clear}_cpu_l1tf_flush_l1d() to
  write '1' resp. '0' instead of true and false.

  I retained Paolo's Reviewed-by from v2 because this change looks innocent
  enough.


Changes to v1 (the initial RFC series):
---------------------------------------
turn the kernel_mode_irq_gen per-cpu counter into a latch flag
(Paolo Bonzini). Group it into irq_cpustat_t for cache locality
(Peter Zijlstra). Set it from C rather than asm entry code (Andi Kleen).

Details
- [1-3/8]: unchanged

- [4/8] ("x86/irq: demote irq_cpustat_t's ->__softirq_pending to u16"): new,
  prerequisite for [5/8].

- [5/8] ("x86/KVM/VMX: introduce per-host-cpu analogue of ->l1tf_flush_l1d"):
  roughly corresponds to former [5/6] ("x86/KVM/VMX: flush L1d upon interrupt
  after VMEXIT"). Introduce the new latch flag rather than taking that
  kernel_mode_irq_gen snapshot.

- [6/8] ("x86: don't include linux/irq.h from asm/hardirq.h"): new,
  prerequisite for [7/8].
  I tested ARCH=i386 and ARCH=x86_64 allmodconfig compilations. (For
  i386 I had to disable CONFIG_BPFILTER_UMH because of a cross compilation
  issue.)

- [7/8] ("x86: let interrupt handlers set kvm_cpu_l1tf_flush_l1d"):
  roughly corresponds to former [4/6] ("x86: implement kernel mode irq
  tracking"). Replace that kernel_mode_irq_gen increment from entry code
  by setting the new latch flag from entering_irq() & Co.

- [8/8] ("x86/KVM/VMX: don't set ->l1tf_flush_l1d from vmx_handle_external_intr()"):
  this is the original [6/6] with its changelog slightly adjusted.


Nicolai Stange (8):
  x86/KVM/VMX: don't set ->l1tf_flush_l1d to true from vmx_l1d_flush()
  x86/KVM/VMX: replace 'vmx_l1d_flush_always' with 'vmx_l1d_flush_cond'
  x86/KVM/VMX: move the ->l1tf_flush_l1d test to vmx_l1d_flush()
  x86/irq: demote irq_cpustat_t's ->__softirq_pending to u16
  x86/KVM/VMX: introduce per-host-cpu analogue of ->l1tf_flush_l1d
  x86: don't include linux/irq.h from asm/hardirq.h
  x86: let interrupt handlers set kvm_cpu_l1tf_flush_l1d
  x86/KVM/VMX: don't set ->l1tf_flush_l1d from
    vmx_handle_external_intr()

 arch/x86/include/asm/apic.h                        |  3 ++
 arch/x86/include/asm/dmi.h                         |  2 +-
 arch/x86/include/asm/hardirq.h                     | 27 ++++++++++++--
 arch/x86/include/asm/kvm_host.h                    |  1 +
 arch/x86/kernel/apic/apic.c                        |  1 +
 arch/x86/kernel/apic/io_apic.c                     |  1 +
 arch/x86/kernel/apic/msi.c                         |  1 +
 arch/x86/kernel/apic/vector.c                      |  1 +
 arch/x86/kernel/fpu/core.c                         |  1 +
 arch/x86/kernel/hpet.c                             |  1 +
 arch/x86/kernel/i8259.c                            |  1 +
 arch/x86/kernel/idt.c                              |  1 +
 arch/x86/kernel/irq.c                              |  1 +
 arch/x86/kernel/irq_32.c                           |  1 +
 arch/x86/kernel/irq_64.c                           |  1 +
 arch/x86/kernel/irqinit.c                          |  1 +
 arch/x86/kernel/smp.c                              |  1 +
 arch/x86/kernel/smpboot.c                          |  1 +
 arch/x86/kernel/time.c                             |  1 +
 arch/x86/kvm/vmx.c                                 | 42 +++++++++++++---------
 arch/x86/mm/pti.c                                  |  1 +
 .../intel-mid/device_libs/platform_mrfld_wdt.c     |  1 +
 arch/x86/platform/uv/tlb_uv.c                      |  1 +
 arch/x86/xen/enlighten.c                           |  1 +
 drivers/gpu/drm/i915/i915_pmu.c                    |  1 +
 drivers/gpu/drm/i915/intel_lpe_audio.c             |  1 +
 drivers/pci/controller/pci-hyperv.c                |  1 +
 27 files changed, 78 insertions(+), 19 deletions(-)

-- 
2.13.7

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 0/8] kvm: handle host mode irqs 0
  2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
                   ` (7 preceding siblings ...)
  2018-07-29 11:06 ` [MODERATED] [PATCH v3 7/8] kvm: handle host mode irqs 7 Nicolai Stange
@ 2018-08-03 14:18 ` Thomas Gleixner
  2018-08-03 14:22   ` [MODERATED] " David Woodhouse
  8 siblings, 1 reply; 13+ messages in thread
From: Thomas Gleixner @ 2018-08-03 14:18 UTC (permalink / raw)
  To: speck

On Thu, 2 Aug 2018, speck for Nicolai Stange wrote:

> From: Nicolai Stange <nstange@suse.de>
> Subject: [PATCH v3 0/8] kvm: handle host mode irqs

You somehow managed _NOT_ to send out [1-8/8] :)

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [MODERATED] Re: [PATCH v3 0/8] kvm: handle host mode irqs 0
  2018-08-03 14:18 ` [PATCH v3 0/8] kvm: handle host mode irqs 0 Thomas Gleixner
@ 2018-08-03 14:22   ` David Woodhouse
  2018-08-03 14:39     ` Nicolai Stange
  2018-08-03 17:44     ` Thomas Gleixner
  0 siblings, 2 replies; 13+ messages in thread
From: David Woodhouse @ 2018-08-03 14:22 UTC (permalink / raw)
  To: speck

On Fri, 2018-08-03 at 16:18 +0200, speck for Thomas Gleixner wrote:
> On Thu, 2 Aug 2018, speck for Nicolai Stange wrote:
> 
> > 
> > From: Nicolai Stange <nstange@suse.de>
> > Subject: [PATCH v3 0/8] kvm: handle host mode irqs
>
> You somehow managed _NOT_ to send out [1-8/8] :)

I got them, but they had assorted dates. If your mailbox is sorting by
Date: header and not by the date they landed in your mailbox, they may
be hiding from you?

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [MODERATED] Re: [PATCH v3 0/8] kvm: handle host mode irqs 0
  2018-08-03 14:22   ` [MODERATED] " David Woodhouse
@ 2018-08-03 14:39     ` Nicolai Stange
  2018-08-03 17:44     ` Thomas Gleixner
  1 sibling, 0 replies; 13+ messages in thread
From: Nicolai Stange @ 2018-08-03 14:39 UTC (permalink / raw)
  To: speck

speck for David Woodhouse  <speck@linutronix.de> writes:

> On Fri, 2018-08-03 at 16:18 +0200, speck for Thomas Gleixner wrote:
>> On Thu, 2 Aug 2018, speck for Nicolai Stange wrote:
>> 
>> > 
>> > From: Nicolai Stange <nstange@suse.de>
>> > Subject: [PATCH v3 0/8] kvm: handle host mode irqs
>>
>> You somehow managed _NOT_ to send out [1-8/8] :)
>
> I got them, but they had assorted dates. If your mailbox is sorting by
> Date: header and not by the date they landed in your mailbox, they may
> be hiding from you?
>

I received them through speck@ as well and they have their In-reply-to
set correctly.

Anyway, shall I resend?

Thanks,

Nicolai

-- 
SUSE Linux GmbH, GF: Felix Imendörffer, Jane Smithard, Graham Norton,
HRB 21284 (AG Nürnberg)

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [PATCH v3 0/8] kvm: handle host mode irqs 0
  2018-08-03 14:22   ` [MODERATED] " David Woodhouse
  2018-08-03 14:39     ` Nicolai Stange
@ 2018-08-03 17:44     ` Thomas Gleixner
  1 sibling, 0 replies; 13+ messages in thread
From: Thomas Gleixner @ 2018-08-03 17:44 UTC (permalink / raw)
  To: speck

On Fri, 3 Aug 2018, speck for David Woodhouse wrote:

> On Fri, 2018-08-03 at 16:18 +0200, speck for Thomas Gleixner wrote:
> > On Thu, 2 Aug 2018, speck for Nicolai Stange wrote:
> > 
> > > 
> > > From: Nicolai Stange <nstange@suse.de>
> > > Subject: [PATCH v3 0/8] kvm: handle host mode irqs
> >
> > You somehow managed _NOT_ to send out [1-8/8] :)
> 
> I got them, but they had assorted dates. If your mailbox is sorting by
> Date: header and not by the date they landed in your mailbox, they may
> be hiding from you?

Ah crap.

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2018-08-03 17:44 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-02 11:34 [MODERATED] [PATCH v3 0/8] kvm: handle host mode irqs 0 Nicolai Stange
2018-07-21 20:16 ` [MODERATED] [PATCH v3 1/8] kvm: handle host mode irqs 1 Nicolai Stange
2018-07-21 20:25 ` [MODERATED] [PATCH v3 2/8] kvm: handle host mode irqs 2 Nicolai Stange
2018-07-21 20:35 ` [MODERATED] [PATCH v3 3/8] kvm: handle host mode irqs 3 Nicolai Stange
2018-07-22 11:38 ` [MODERATED] [PATCH v3 8/8] kvm: handle host mode irqs 8 Nicolai Stange
2018-07-27 10:46 ` [MODERATED] [PATCH v3 4/8] kvm: handle host mode irqs 4 Nicolai Stange
2018-07-27 11:22 ` [MODERATED] [PATCH v3 5/8] kvm: handle host mode irqs 5 Nicolai Stange
2018-07-29 10:15 ` [MODERATED] [PATCH v3 6/8] kvm: handle host mode irqs 6 Nicolai Stange
2018-07-29 11:06 ` [MODERATED] [PATCH v3 7/8] kvm: handle host mode irqs 7 Nicolai Stange
2018-08-03 14:18 ` [PATCH v3 0/8] kvm: handle host mode irqs 0 Thomas Gleixner
2018-08-03 14:22   ` [MODERATED] " David Woodhouse
2018-08-03 14:39     ` Nicolai Stange
2018-08-03 17:44     ` Thomas Gleixner

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.