KVM: x86: Use static_call() for copy/move encryption context ioctls()
authorSean Christopherson <seanjc@google.com>
Fri, 28 Jan 2022 00:51:57 +0000 (00:51 +0000)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 10 Feb 2022 18:47:20 +0000 (13:47 -0500)
Define and use static_call()s for .vm_{copy,move}_enc_context_from(),
mostly so that the op is defined in kvm-x86-ops.h.  This will allow using
KVM_X86_OP in vendor code to wire up the implementation.  Any performance
gains eeked out by using static_call() is a happy bonus and not the
primary motiviation.

Opportunistically refactor the code to reduce indentation and keep line
lengths reasonable, and to be consistent when wrapping versus running
a bit over the 80 char soft limit.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220128005208.4008533-12-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/include/asm/kvm-x86-ops.h
arch/x86/kvm/x86.c

index 955f4d8..bd2b1e1 100644 (file)
@@ -115,6 +115,8 @@ KVM_X86_OP(enable_smi_window)
 KVM_X86_OP_NULL(mem_enc_op)
 KVM_X86_OP_NULL(mem_enc_reg_region)
 KVM_X86_OP_NULL(mem_enc_unreg_region)
+KVM_X86_OP_NULL(vm_copy_enc_context_from)
+KVM_X86_OP_NULL(vm_move_enc_context_from)
 KVM_X86_OP(get_msr_feature)
 KVM_X86_OP(can_emulate_instruction)
 KVM_X86_OP(apic_init_signal_blocked)
index f978e18..59957e6 100644 (file)
@@ -5975,15 +5975,18 @@ split_irqchip_unlock:
 #endif
        case KVM_CAP_VM_COPY_ENC_CONTEXT_FROM:
                r = -EINVAL;
-               if (kvm_x86_ops.vm_copy_enc_context_from)
-                       r = kvm_x86_ops.vm_copy_enc_context_from(kvm, cap->args[0]);
-               return r;
+               if (!kvm_x86_ops.vm_copy_enc_context_from)
+                       break;
+
+               r = static_call(kvm_x86_vm_copy_enc_context_from)(kvm, cap->args[0]);
+               break;
        case KVM_CAP_VM_MOVE_ENC_CONTEXT_FROM:
                r = -EINVAL;
-               if (kvm_x86_ops.vm_move_enc_context_from)
-                       r = kvm_x86_ops.vm_move_enc_context_from(
-                               kvm, cap->args[0]);
-               return r;
+               if (!kvm_x86_ops.vm_move_enc_context_from)
+                       break;
+
+               r = static_call(kvm_x86_vm_move_enc_context_from)(kvm, cap->args[0]);
+               break;
        case KVM_CAP_EXIT_HYPERCALL:
                if (cap->args[0] & ~KVM_EXIT_HYPERCALL_VALID_MASK) {
                        r = -EINVAL;