Patch "KVM: SVM: Skip WRMSR fastpath on VM-Exit if next RIP isn't valid" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    KVM: SVM: Skip WRMSR fastpath on VM-Exit if next RIP isn't valid

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     kvm-svm-skip-wrmsr-fastpath-on-vm-exit-if-next-rip-i.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b6f81558a7e02a37fd7970f1be08108d3e8f837a
Author: Sean Christopherson <seanjc@xxxxxxxxxx>
Date:   Fri Sep 30 23:40:31 2022 +0000

    KVM: SVM: Skip WRMSR fastpath on VM-Exit if next RIP isn't valid
    
    [ Upstream commit 5c30e8101e8d5d020b1d7119117889756a6ed713 ]
    
    Skip the WRMSR fastpath in SVM's VM-Exit handler if the next RIP isn't
    valid, e.g. because KVM is running with nrips=false.  SVM must decode and
    emulate to skip the WRMSR if the CPU doesn't provide the next RIP.
    Getting the instruction bytes to decode the WRMSR requires reading guest
    memory, which in turn means dereferencing memslots, and that isn't safe
    because KVM doesn't hold SRCU when the fastpath runs.
    
    Don't bother trying to enable the fastpath for this case, e.g. by doing
    only the WRMSR and leaving the "skip" until later.  NRIPS is supported on
    all modern CPUs (KVM has considered making it mandatory), and the next
    RIP will be valid the vast, vast majority of the time.
    
      =============================
      WARNING: suspicious RCU usage
      6.0.0-smp--4e557fcd3d80-skip #13 Tainted: G           O
      -----------------------------
      include/linux/kvm_host.h:954 suspicious rcu_dereference_check() usage!
    
      other info that might help us debug this:
    
      rcu_scheduler_active = 2, debug_locks = 1
      1 lock held by stable/206475:
       #0: ffff9d9dfebcc0f0 (&vcpu->mutex){+.+.}-{3:3}, at: kvm_vcpu_ioctl+0x8b/0x620 [kvm]
    
      stack backtrace:
      CPU: 152 PID: 206475 Comm: stable Tainted: G           O       6.0.0-smp--4e557fcd3d80-skip #13
      Hardware name: Google, Inc. Arcadia_IT_80/Arcadia_IT_80, BIOS 10.48.0 01/27/2022
      Call Trace:
       <TASK>
       dump_stack_lvl+0x69/0xaa
       dump_stack+0x10/0x12
       lockdep_rcu_suspicious+0x11e/0x130
       kvm_vcpu_gfn_to_memslot+0x155/0x190 [kvm]
       kvm_vcpu_gfn_to_hva_prot+0x18/0x80 [kvm]
       paging64_walk_addr_generic+0x183/0x450 [kvm]
       paging64_gva_to_gpa+0x63/0xd0 [kvm]
       kvm_fetch_guest_virt+0x53/0xc0 [kvm]
       __do_insn_fetch_bytes+0x18b/0x1c0 [kvm]
       x86_decode_insn+0xf0/0xef0 [kvm]
       x86_emulate_instruction+0xba/0x790 [kvm]
       kvm_emulate_instruction+0x17/0x20 [kvm]
       __svm_skip_emulated_instruction+0x85/0x100 [kvm_amd]
       svm_skip_emulated_instruction+0x13/0x20 [kvm_amd]
       handle_fastpath_set_msr_irqoff+0xae/0x180 [kvm]
       svm_vcpu_run+0x4b8/0x5a0 [kvm_amd]
       vcpu_enter_guest+0x16ca/0x22f0 [kvm]
       kvm_arch_vcpu_ioctl_run+0x39d/0x900 [kvm]
       kvm_vcpu_ioctl+0x538/0x620 [kvm]
       __se_sys_ioctl+0x77/0xc0
       __x64_sys_ioctl+0x1d/0x20
       do_syscall_64+0x3d/0x80
       entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    Fixes: 404d5d7bff0d ("KVM: X86: Introduce more exit_fastpath_completion enum values")
    Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20220930234031.1732249-1-seanjc@xxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index ce362e88a5676..0434bb7b456bd 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -3889,8 +3889,14 @@ static int svm_vcpu_pre_run(struct kvm_vcpu *vcpu)
 
 static fastpath_t svm_exit_handlers_fastpath(struct kvm_vcpu *vcpu)
 {
-	if (to_svm(vcpu)->vmcb->control.exit_code == SVM_EXIT_MSR &&
-	    to_svm(vcpu)->vmcb->control.exit_info_1)
+	struct vmcb_control_area *control = &to_svm(vcpu)->vmcb->control;
+
+	/*
+	 * Note, the next RIP must be provided as SRCU isn't held, i.e. KVM
+	 * can't read guest memory (dereference memslots) to decode the WRMSR.
+	 */
+	if (control->exit_code == SVM_EXIT_MSR && control->exit_info_1 &&
+	    nrips && control->next_rip)
 		return handle_fastpath_set_msr_irqoff(vcpu);
 
 	return EXIT_FASTPATH_NONE;



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux