Home Home > GIT Browse
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlaf Hering <ohering@suse.de>2017-10-20 12:20:33 +0200
committerOlaf Hering <ohering@suse.de>2017-10-20 12:23:30 +0200
commit7b1b28a479daf8a6e0e43d1a55d2015f5e10b570 (patch)
treecdba72338482181018690a6edf6308015e3f59c6
parentcb62a23ca699c3cedf066a289a619ada5c435fac (diff)
x86/hyperv: Clear vCPU banks between calls to avoid flushing
unneeded vCPUs (fate#323887).
-rw-r--r--patches.suse/msft-hv-1471-x86-hyperv-Clear-vCPU-banks-between-calls-to-avoid-f.patch101
-rw-r--r--series.conf1
2 files changed, 102 insertions, 0 deletions
diff --git a/patches.suse/msft-hv-1471-x86-hyperv-Clear-vCPU-banks-between-calls-to-avoid-f.patch b/patches.suse/msft-hv-1471-x86-hyperv-Clear-vCPU-banks-between-calls-to-avoid-f.patch
new file mode 100644
index 0000000000..1e2bcd9454
--- /dev/null
+++ b/patches.suse/msft-hv-1471-x86-hyperv-Clear-vCPU-banks-between-calls-to-avoid-f.patch
@@ -0,0 +1,101 @@
+From: Vitaly Kuznetsov <vkuznets@redhat.com>
+Date: Fri, 6 Oct 2017 17:48:54 +0200
+Patch-mainline: v4.14-rc5
+Subject: x86/hyperv: Clear vCPU banks between calls to avoid flushing unneeded vCPUs
+Git-commit: a3b7424392924e778b608e30ee321f7b10cc94b8
+References: fate#323887
+
+hv_flush_pcpu_ex structures are not cleared between calls for performance
+reasons (they're variable size up to PAGE_SIZE each) but we must clear
+hv_vp_set.bank_contents part of it to avoid flushing unneeded vCPUs. The
+rest of the structure is formed correctly.
+
+To do the clearing in an efficient way stash the maximum possible vCPU
+number (this may differ from Linux CPU id).
+
+Reported-by: Jork Loeser <Jork.Loeser@microsoft.com>
+Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
+Cc: Dexuan Cui <decui@microsoft.com>
+Cc: Haiyang Zhang <haiyangz@microsoft.com>
+Cc: K. Y. Srinivasan <kys@microsoft.com>
+Cc: Linus Torvalds <torvalds@linux-foundation.org>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Stephen Hemminger <sthemmin@microsoft.com>
+Cc: Thomas Gleixner <tglx@linutronix.de>
+Cc: devel@linuxdriverproject.org
+Link: http://lkml.kernel.org/r/20171006154854.18092-1-vkuznets@redhat.com
+Signed-off-by: Ingo Molnar <mingo@kernel.org>
+Acked-by: Olaf Hering <ohering@suse.de>
+---
+ arch/x86/hyperv/hv_init.c | 5 +++++
+ arch/x86/hyperv/mmu.c | 17 ++++++++++++-----
+ arch/x86/include/asm/mshyperv.h | 1 +
+ 3 files changed, 18 insertions(+), 5 deletions(-)
+
+diff --git a/arch/x86/hyperv/hv_init.c b/arch/x86/hyperv/hv_init.c
+--- a/arch/x86/hyperv/hv_init.c
++++ b/arch/x86/hyperv/hv_init.c
+@@ -85,6 +85,8 @@ EXPORT_SYMBOL_GPL(hyperv_cs);
+ u32 *hv_vp_index;
+ EXPORT_SYMBOL_GPL(hv_vp_index);
+
++u32 hv_max_vp_index;
++
+ static int hv_cpu_init(unsigned int cpu)
+ {
+ u64 msr_vp_index;
+@@ -93,6 +95,9 @@ static int hv_cpu_init(unsigned int cpu)
+
+ hv_vp_index[smp_processor_id()] = msr_vp_index;
+
++ if (msr_vp_index > hv_max_vp_index)
++ hv_max_vp_index = msr_vp_index;
++
+ return 0;
+ }
+
+diff --git a/arch/x86/hyperv/mmu.c b/arch/x86/hyperv/mmu.c
+--- a/arch/x86/hyperv/mmu.c
++++ b/arch/x86/hyperv/mmu.c
+@@ -76,6 +76,18 @@ static inline int cpumask_to_vp_set(struct hv_flush_pcpu_ex *flush,
+ {
+ int cpu, vcpu, vcpu_bank, vcpu_offset, nr_bank = 1;
+
++ /* valid_bank_mask can represent up to 64 banks */
++ if (hv_max_vp_index / 64 >= 64)
++ return 0;
++
++ /*
++ * Clear all banks up to the maximum possible bank as hv_flush_pcpu_ex
++ * structs are not cleared between calls, we risk flushing unneeded
++ * vCPUs otherwise.
++ */
++ for (vcpu_bank = 0; vcpu_bank <= hv_max_vp_index / 64; vcpu_bank++)
++ flush->hv_vp_set.bank_contents[vcpu_bank] = 0;
++
+ /*
+ * Some banks may end up being empty but this is acceptable.
+ */
+@@ -83,11 +95,6 @@ static inline int cpumask_to_vp_set(struct hv_flush_pcpu_ex *flush,
+ vcpu = hv_cpu_number_to_vp_number(cpu);
+ vcpu_bank = vcpu / 64;
+ vcpu_offset = vcpu % 64;
+-
+- /* valid_bank_mask can represent up to 64 banks */
+- if (vcpu_bank >= 64)
+- return 0;
+-
+ __set_bit(vcpu_offset, (unsigned long *)
+ &flush->hv_vp_set.bank_contents[vcpu_bank]);
+ if (vcpu_bank >= nr_bank)
+diff --git a/arch/x86/include/asm/mshyperv.h b/arch/x86/include/asm/mshyperv.h
+--- a/arch/x86/include/asm/mshyperv.h
++++ b/arch/x86/include/asm/mshyperv.h
+@@ -289,6 +289,7 @@ static inline u64 hv_do_rep_hypercall(u16 code, u16 rep_count, u16 varhead_size,
+ * to this information.
+ */
+ extern u32 *hv_vp_index;
++extern u32 hv_max_vp_index;
+
+ /**
+ * hv_cpu_number_to_vp_number() - Map CPU to VP.
diff --git a/series.conf b/series.conf
index 78db2a8a61..12aa5a1576 100644
--- a/series.conf
+++ b/series.conf
@@ -1717,6 +1717,7 @@
patches.suse/msft-hv-1467-vmbus-don-t-acquire-the-mutex-in-vmbus_hvsock_device.patch
patches.suse/msft-hv-1468-Drivers-hv-fcopy-restore-correct-transfer-length.patch
patches.suse/msft-hv-1470-Drivers-hv-vmbus-Fix-bugs-in-rescind-handling.patch
+ patches.suse/msft-hv-1471-x86-hyperv-Clear-vCPU-banks-between-calls-to-avoid-f.patch
patches.suse/suse-hv-guest-os-id.patch
patches.suse/suse-hv-kvp_on_msg.dbg.patch