]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: SVM: Use guard(mutex) to simplify SNP AP Creation error handling
authorSean Christopherson <seanjc@google.com>
Thu, 27 Feb 2025 01:25:38 +0000 (17:25 -0800)
committerSean Christopherson <seanjc@google.com>
Mon, 3 Mar 2025 15:34:53 +0000 (07:34 -0800)
Use guard(mutex) in sev_snp_ap_creation() and modify the error paths to
return directly instead of jumping to a common exit point.

No functional change intended.

Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Reviewed-by: Pankaj Gupta <pankaj.gupta@amd.com>
Link: https://lore.kernel.org/r/20250227012541.3234589-8-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/sev.c

index 9ec89c9de6fc2111c79ca4334a5186f881524845..2ae476eed47a1b014782120d58123e63d07f6608 100644 (file)
@@ -3944,7 +3944,6 @@ static int sev_snp_ap_creation(struct vcpu_svm *svm)
        struct vcpu_svm *target_svm;
        unsigned int request;
        unsigned int apic_id;
-       int ret;
 
        request = lower_32_bits(svm->vmcb->control.exit_info_1);
        apic_id = upper_32_bits(svm->vmcb->control.exit_info_1);
@@ -3957,11 +3956,9 @@ static int sev_snp_ap_creation(struct vcpu_svm *svm)
                return -EINVAL;
        }
 
-       ret = 0;
-
        target_svm = to_svm(target_vcpu);
 
-       mutex_lock(&target_svm->sev_es.snp_vmsa_mutex);
+       guard(mutex)(&target_svm->sev_es.snp_vmsa_mutex);
 
        switch (request) {
        case SVM_VMGEXIT_AP_CREATE_ON_INIT:
@@ -3969,15 +3966,13 @@ static int sev_snp_ap_creation(struct vcpu_svm *svm)
                if (vcpu->arch.regs[VCPU_REGS_RAX] != sev->vmsa_features) {
                        vcpu_unimpl(vcpu, "vmgexit: mismatched AP sev_features [%#lx] != [%#llx] from guest\n",
                                    vcpu->arch.regs[VCPU_REGS_RAX], sev->vmsa_features);
-                       ret = -EINVAL;
-                       goto out;
+                       return -EINVAL;
                }
 
                if (!page_address_valid(vcpu, svm->vmcb->control.exit_info_2)) {
                        vcpu_unimpl(vcpu, "vmgexit: invalid AP VMSA address [%#llx] from guest\n",
                                    svm->vmcb->control.exit_info_2);
-                       ret = -EINVAL;
-                       goto out;
+                       return -EINVAL;
                }
 
                /*
@@ -3991,8 +3986,7 @@ static int sev_snp_ap_creation(struct vcpu_svm *svm)
                        vcpu_unimpl(vcpu,
                                    "vmgexit: AP VMSA address [%llx] from guest is unsafe as it is 2M aligned\n",
                                    svm->vmcb->control.exit_info_2);
-                       ret = -EINVAL;
-                       goto out;
+                       return -EINVAL;
                }
 
                target_svm->sev_es.snp_vmsa_gpa = svm->vmcb->control.exit_info_2;
@@ -4003,8 +3997,7 @@ static int sev_snp_ap_creation(struct vcpu_svm *svm)
        default:
                vcpu_unimpl(vcpu, "vmgexit: invalid AP creation request [%#x] from guest\n",
                            request);
-               ret = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
        target_svm->sev_es.snp_ap_waiting_for_reset = true;
@@ -4018,10 +4011,7 @@ static int sev_snp_ap_creation(struct vcpu_svm *svm)
                kvm_vcpu_kick(target_vcpu);
        }
 
-out:
-       mutex_unlock(&target_svm->sev_es.snp_vmsa_mutex);
-
-       return ret;
+       return 0;
 }
 
 static int snp_handle_guest_req(struct vcpu_svm *svm, gpa_t req_gpa, gpa_t resp_gpa)