]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 10 Mar 2018 00:12:53 +0000 (16:12 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 10 Mar 2018 00:12:53 +0000 (16:12 -0800)
added patches:
kvm-x86-fix-backward-migration-with-async_pf.patch

queue-4.14/kvm-x86-fix-backward-migration-with-async_pf.patch [new file with mode: 0644]
queue-4.14/series

diff --git a/queue-4.14/kvm-x86-fix-backward-migration-with-async_pf.patch b/queue-4.14/kvm-x86-fix-backward-migration-with-async_pf.patch
new file mode 100644 (file)
index 0000000..85b4020
--- /dev/null
@@ -0,0 +1,100 @@
+From fe2a3027e74e40a3ece3a4c1e4e51403090a907a Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= <rkrcmar@redhat.com>
+Date: Thu, 1 Feb 2018 22:16:21 +0100
+Subject: KVM: x86: fix backward migration with async_PF
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Radim Krčmář <rkrcmar@redhat.com>
+
+commit fe2a3027e74e40a3ece3a4c1e4e51403090a907a upstream.
+
+Guests on new hypersiors might set KVM_ASYNC_PF_DELIVERY_AS_PF_VMEXIT
+bit when enabling async_PF, but this bit is reserved on old hypervisors,
+which results in a failure upon migration.
+
+To avoid breaking different cases, we are checking for CPUID feature bit
+before enabling the feature and nothing else.
+
+Fixes: 52a5c155cf79 ("KVM: async_pf: Let guest support delivery of async_pf from guest mode")
+Cc: <stable@vger.kernel.org>
+Reviewed-by: Wanpeng Li <wanpengli@tencent.com>
+Reviewed-by: David Hildenbrand <david@redhat.com>
+Signed-off-by: Radim Krčmář <rkrcmar@redhat.com>
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
+[jwang: port to 4.14]
+Signed-off-by: Jack Wang <jinpu.wang@profitbricks.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ Documentation/virtual/kvm/cpuid.txt  |    4 ++++
+ Documentation/virtual/kvm/msr.txt    |    3 ++-
+ arch/x86/include/uapi/asm/kvm_para.h |    1 +
+ arch/x86/kernel/kvm.c                |    8 ++++----
+ arch/x86/kvm/cpuid.c                 |    3 ++-
+ 5 files changed, 13 insertions(+), 6 deletions(-)
+
+--- a/Documentation/virtual/kvm/cpuid.txt
++++ b/Documentation/virtual/kvm/cpuid.txt
+@@ -54,6 +54,10 @@ KVM_FEATURE_PV_UNHALT              ||
+                                    ||       || before enabling paravirtualized
+                                    ||       || spinlock support.
+ ------------------------------------------------------------------------------
++KVM_FEATURE_ASYNC_PF_VMEXIT        ||    10 || paravirtualized async PF VM exit
++                                   ||       || can be enabled by setting bit 2
++                                   ||       || when writing to msr 0x4b564d02
++------------------------------------------------------------------------------
+ KVM_FEATURE_CLOCKSOURCE_STABLE_BIT ||    24 || host will warn if no guest-side
+                                    ||       || per-cpu warps are expected in
+                                    ||       || kvmclock.
+--- a/Documentation/virtual/kvm/msr.txt
++++ b/Documentation/virtual/kvm/msr.txt
+@@ -170,7 +170,8 @@ MSR_KVM_ASYNC_PF_EN: 0x4b564d02
+       when asynchronous page faults are enabled on the vcpu 0 when
+       disabled. Bit 1 is 1 if asynchronous page faults can be injected
+       when vcpu is in cpl == 0. Bit 2 is 1 if asynchronous page faults
+-      are delivered to L1 as #PF vmexits.
++      are delivered to L1 as #PF vmexits.  Bit 2 can be set only if
++      KVM_FEATURE_ASYNC_PF_VMEXIT is present in CPUID.
+       First 4 byte of 64 byte memory location will be written to by
+       the hypervisor at the time of asynchronous page fault (APF)
+--- a/arch/x86/include/uapi/asm/kvm_para.h
++++ b/arch/x86/include/uapi/asm/kvm_para.h
+@@ -25,6 +25,7 @@
+ #define KVM_FEATURE_STEAL_TIME                5
+ #define KVM_FEATURE_PV_EOI            6
+ #define KVM_FEATURE_PV_UNHALT         7
++#define KVM_FEATURE_ASYNC_PF_VMEXIT   10
+ /* The last 8 bits are used to indicate how to interpret the flags field
+  * in pvclock structure. If no bits are set, all flags are ignored.
+--- a/arch/x86/kernel/kvm.c
++++ b/arch/x86/kernel/kvm.c
+@@ -341,10 +341,10 @@ static void kvm_guest_cpu_init(void)
+ #endif
+               pa |= KVM_ASYNC_PF_ENABLED;
+-              /* Async page fault support for L1 hypervisor is optional */
+-              if (wrmsr_safe(MSR_KVM_ASYNC_PF_EN,
+-                      (pa | KVM_ASYNC_PF_DELIVERY_AS_PF_VMEXIT) & 0xffffffff, pa >> 32) < 0)
+-                      wrmsrl(MSR_KVM_ASYNC_PF_EN, pa);
++              if (kvm_para_has_feature(KVM_FEATURE_ASYNC_PF_VMEXIT))
++                      pa |= KVM_ASYNC_PF_DELIVERY_AS_PF_VMEXIT;
++
++              wrmsrl(MSR_KVM_ASYNC_PF_EN, pa);
+               __this_cpu_write(apf_reason.enabled, 1);
+               printk(KERN_INFO"KVM setup async PF for cpu %d\n",
+                      smp_processor_id());
+--- a/arch/x86/kvm/cpuid.c
++++ b/arch/x86/kvm/cpuid.c
+@@ -597,7 +597,8 @@ static inline int __do_cpuid_ent(struct
+                            (1 << KVM_FEATURE_ASYNC_PF) |
+                            (1 << KVM_FEATURE_PV_EOI) |
+                            (1 << KVM_FEATURE_CLOCKSOURCE_STABLE_BIT) |
+-                           (1 << KVM_FEATURE_PV_UNHALT);
++                           (1 << KVM_FEATURE_PV_UNHALT) |
++                           (1 << KVM_FEATURE_ASYNC_PF_VMEXIT);
+               if (sched_info_on())
+                       entry->eax |= (1 << KVM_FEATURE_STEAL_TIME);
index 482f94862e574ccaf5efd4b0bec075c5cb766447..5548d79acc1d797f8f05313be8409002dfa1a2b0 100644 (file)
@@ -6,3 +6,4 @@ bpf-arm64-fix-out-of-bounds-access-in-tail-call.patch
 bpf-add-schedule-points-in-percpu-arrays-management.patch
 bpf-allow-xadd-only-on-aligned-memory.patch
 bpf-ppc64-fix-out-of-bounds-access-in-tail-call.patch
+kvm-x86-fix-backward-migration-with-async_pf.patch