Commit 46332437 authored by Sean Christopherson's avatar Sean Christopherson
Browse files

KVM: SVM: Use guard(mutex) to simplify SNP AP Creation error handling



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: default avatarTom Lendacky <thomas.lendacky@amd.com>
Reviewed-by: default avatarPankaj Gupta <pankaj.gupta@amd.com>
Link: https://lore.kernel.org/r/20250227012541.3234589-8-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent c6e129fb
Loading
Loading
Loading
Loading
+6 −16
Original line number Diff line number Diff line
@@ -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)