FAILED: patch "[PATCH] KVM: VMX: Do _all_ initialization before exposing /dev/kvm to" failed to apply to 5.4-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.4.y
git checkout FETCH_HEAD
git cherry-pick -x e32b120071ea114efc0b4ddd439547750b85f618
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '[email protected]' --subject-prefix 'PATCH 5.4.y' HEAD^..
Possible dependencies:
e32b120071ea ("KVM: VMX: Do _all_ initialization before exposing /dev/kvm to userspace") 4f8396b96a9f ("KVM: x86: Move guts of kvm_arch_init() to standalone helper") da66de44b01e ("KVM: VMX: Don't bother disabling eVMCS static key on module exit") 2916b70fc342 ("KVM: VMX: Reset eVMCS controls in VP assist page during hardware disabling") 94bda2f4cd86 ("KVM: x86: Reject loading KVM if host.PAT[0] != WB") fdc298da8661 ("KVM: x86: Move kvm_ops_static_call_update() to x86.c") 5e17b2ee45b9 ("kvm: x86: Require const tsc for RT")925088781eed ("KVM: x86: Fix pointer mistmatch warning when patching RET0 static calls") 5be2226f417d ("KVM: x86: allow defining return-0 static calls")abb6d479e226 ("KVM: x86: make several APIC virtualization callbacks optional") dd2319c61888 ("KVM: x86: warn on incorrectly NULL members of kvm_x86_ops") e4fc23bad813 ("KVM: x86: remove KVM_X86_OP_NULL and mark optional kvm_x86_ops") 8a2897853c53 ("KVM: x86: return 1 unconditionally for availability of KVM_CAP_VAPIC") db6e7adf8de9 ("KVM: SVM: Rename AVIC helpers to use "avic" prefix instead of "svm"") 4e71cad31c62 ("Merge remote-tracking branch 'kvm/master' into HEAD")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From e32b120071ea114efc0b4ddd439547750b85f618 Mon Sep 17 00:00:00 2001
From: Sean Christopherson <[email protected]>
Date: Wed, 30 Nov 2022 23:08:58 +0000
Subject: [PATCH] KVM: VMX: Do _all_ initialization before exposing /dev/kvm to
userspace
Call kvm_init() only after _all_ setup is complete, as kvm_init() exposes /dev/kvm to userspace and thus allows userspace to create VMs (and call other ioctls). E.g. KVM will encounter a NULL pointer when attempting to add a vCPU to the per-CPU loaded_vmcss_on_cpu list if userspace is able to create a VM before vmx_init() configures said list.
BUG: kernel NULL pointer dereference, address: 0000000000000008 #PF: supervisor write access in kernel mode #PF: error_code(0x0002) - not-present page PGD 0 P4D 0 Oops: 0002 [#1] SMP CPU: 6 PID: 1143 Comm: stable Not tainted 6.0.0-rc7+ #988 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 0.0.0 02/06/2015 RIP: 0010:vmx_vcpu_load_vmcs+0x68/0x230 [kvm_intel] <TASK> vmx_vcpu_load+0x16/0x60 [kvm_intel] kvm_arch_vcpu_load+0x32/0x1f0 [kvm] vcpu_load+0x2f/0x40 [kvm] kvm_arch_vcpu_create+0x231/0x310 [kvm] kvm_vm_ioctl+0x79f/0xe10 [kvm] ? handle_mm_fault+0xb1/0x220 __x64_sys_ioctl+0x80/0xb0 do_syscall_64+0x2b/0x50 entry_SYSCALL_64_after_hwframe+0x46/0xb0 RIP: 0033:0x7f5a6b05743b </TASK> Modules linked in: vhost_net vhost vhost_iotlb tap kvm_intel(+) kvm irqbypass
Message-Id: <[email protected]>
arch/x86/kvm/vmx/vmx.c +19 -11
@@ -8564,19 +8564,23 @@ static void vmx_cleanup_l1d_flush(void) l1tf_vmx_mitigation =VMENTER_L1D_FLUSH_AUTO ; } -static void vmx_exit (void ) +static void __vmx_exit (void ) { + allow_smaller_maxphyaddr = false; +#ifdef CONFIG_KEXEC_CORE RCU_INIT_POINTER (crash_vmclear_loaded_vmcss,NULL );synchronize_rcu ();#endif +vmx_cleanup_l1d_flush (); +} +static void vmx_exit (void ) +{kvm_exit ();kvm_x86_vendor_exit (); -vmx_cleanup_l1d_flush (); - - allow_smaller_maxphyaddr = false; +__vmx_exit (); }module_exit (vmx_exit);
@@ -8594,11 +8598,6 @@ static int __init vmx_init(void)if (r)return r; - r =kvm_init (&vmx_init_ops,sizeof (struct vcpu_vmx ), - __alignof__(struct vcpu_vmx ),THIS_MODULE ); -if (r) - goto err_kvm_init; -/* * Must be called after common x86 init so enable_ept is properly set * up. Hand the parameter mitigation value in which was stored in
@@ -8632,11 +8631,20 @@ static int __init vmx_init(void)if (!enable_ept) allow_smaller_maxphyaddr = true; +/* +* Common KVM initialization _must_ come last, after this, /dev/kvm is +* exposed to userspace! +*/ + r =kvm_init (&vmx_init_ops,sizeof (struct vcpu_vmx ), + __alignof__(struct vcpu_vmx ),THIS_MODULE ); +if (r) + goto err_kvm_init; +return 0 ; -err_l1d_flush: -vmx_exit (); err_kvm_init: +__vmx_exit (); +err_l1d_flush:kvm_x86_vendor_exit ();return r; }