]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: x86: Add a fastpath handler for INVD
authorSean Christopherson <seanjc@google.com>
Tue, 5 Aug 2025 19:05:26 +0000 (12:05 -0700)
committerSean Christopherson <seanjc@google.com>
Tue, 19 Aug 2025 18:59:43 +0000 (11:59 -0700)
Add a fastpath handler for INVD so that the common fastpath logic can be
trivially tested on both Intel and AMD.  Under KVM, INVD is always:
(a) intercepted, (b) available to the guest, and (c) emulated as a nop,
with no side effects.  Combined with INVD not having any inputs or outputs,
i.e. no register constraints, INVD is the perfect instruction for
exercising KVM's fastpath as it can be inserted into practically any
guest-side code stream.

Link: https://lore.kernel.org/r/20250805190526.1453366-19-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/x86.c
arch/x86/kvm/x86.h

index 829d9d46718de38cbc6bc373f9ddecc1d0c43cc0..f7e1e665a82618ed7eab93743d474ca9c1df182e 100644 (file)
@@ -4200,6 +4200,8 @@ static fastpath_t svm_exit_handlers_fastpath(struct kvm_vcpu *vcpu)
                return handle_fastpath_set_msr_irqoff(vcpu);
        case SVM_EXIT_HLT:
                return handle_fastpath_hlt(vcpu);
+       case SVM_EXIT_INVD:
+               return handle_fastpath_invd(vcpu);
        default:
                break;
        }
index aa157fe5b7b31802aa71351db92c8d1b68111432..95765db529927175efc7d0d21ee84a64271c7c0b 100644 (file)
@@ -7175,6 +7175,8 @@ static fastpath_t vmx_exit_handlers_fastpath(struct kvm_vcpu *vcpu,
                return handle_fastpath_preemption_timer(vcpu, force_immediate_exit);
        case EXIT_REASON_HLT:
                return handle_fastpath_hlt(vcpu);
+       case EXIT_REASON_INVD:
+               return handle_fastpath_invd(vcpu);
        default:
                return EXIT_FASTPATH_NONE;
        }
index 093bfc8d00b3a1b6f7d0364c5825dda5893bef8a..6e56d5cff44d4695cb4ffa05d8e4ddba88f53bf2 100644 (file)
@@ -2087,6 +2087,15 @@ int kvm_emulate_invd(struct kvm_vcpu *vcpu)
 }
 EXPORT_SYMBOL_GPL(kvm_emulate_invd);
 
+fastpath_t handle_fastpath_invd(struct kvm_vcpu *vcpu)
+{
+       if (!kvm_emulate_invd(vcpu))
+               return EXIT_FASTPATH_EXIT_USERSPACE;
+
+       return EXIT_FASTPATH_REENTER_GUEST;
+}
+EXPORT_SYMBOL_GPL(handle_fastpath_invd);
+
 int kvm_handle_invalid_op(struct kvm_vcpu *vcpu)
 {
        kvm_queue_exception(vcpu, UD_VECTOR);
index bcfd9b719ada5c8892cba8c9f7dd1aad2d2e8991..46220b04cdf216414551910fa329622d4740739d 100644 (file)
@@ -439,6 +439,7 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa,
                            int emulation_type, void *insn, int insn_len);
 fastpath_t handle_fastpath_set_msr_irqoff(struct kvm_vcpu *vcpu);
 fastpath_t handle_fastpath_hlt(struct kvm_vcpu *vcpu);
+fastpath_t handle_fastpath_invd(struct kvm_vcpu *vcpu);
 
 extern struct kvm_caps kvm_caps;
 extern struct kvm_host_values kvm_host;