Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4649619pxj; Wed, 12 May 2021 10:03:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzcdyuy1D/dPCXmdqKX45ZpPQgs14DHgQus9uzRh0sPewnIWiWcA/7NeVhggQISSSCIVWhQ X-Received: by 2002:a17:907:9612:: with SMTP id gb18mr39035419ejc.408.1620839004649; Wed, 12 May 2021 10:03:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1620839004; cv=none; d=google.com; s=arc-20160816; b=OiX94i2Ui+X2INETgjAWFD+FYUKetGkkKY2XgpgTtT9e0Ty/8DZc/suMIjX87zuDdk te7zyCxdjANYrNhiN4VwpoWQauZD/t0eWgFCNoSbZQPZ0l3Xg05NoawwafKk2FQ3Sdle aa7rzViTjStNPykIjADB6CqV+t3i38Oedj64g0iPFs1abjl9Y6SwGjrmP7xSeSVdd08P pfuxbIJycWoGC4PRC2n3u+OnCQmn3zJTcznv4mPTHIF9QCMvt6dn4+I0hPZ5gEoBBF3W 8LWPcbNs43aJEykgnJd8MrvhO6F4slfzhBCfpDDtlphPVOG1JXdwDREiiGwRtYPOyByW DL3g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=2lfntMDvPF5AaNqx99pnmCp27GVhTQVXbWo6UPWsCYE=; b=y+OO4PnIy0mRgvk7N37bSYuIie+N2LSGXAObKJQ8am4YZewS7VBSj9dhiF9fFvMFM+ BNYzHpb4QPwd+ef7WJ2uAkLm9tagFG5CmURFd2Z2S7G7p8Hr1aZqx31FOI8RkyDyXEmn uV5LQkwNhJ2RYo6gnBwWtgNMljAZuVzGY4jdI5B1UgJ4joXXOX6iMmxMMCLZCHRw/tqB 29Pk5wYNoqKBRe9bhZ1ZTUseYeyKE7Mblht5RQsMxDbWykyH/EwhOFa9YbCPRkKhHOHO 7YHX0UnJIjH6nG9xngVw+rk7pbJVyPx8OJogSo8Dpe5P+b+QM2FFMepT89P9KZPw9AXN lzdQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=EyDveu+V; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id kk28si464623ejc.668.2021.05.12.10.03.00; Wed, 12 May 2021 10:03:24 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=EyDveu+V; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1343813AbhELQ7h (ORCPT + 99 others); Wed, 12 May 2021 12:59:37 -0400 Received: from mail.kernel.org ([198.145.29.99]:38450 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237842AbhELP41 (ORCPT ); Wed, 12 May 2021 11:56:27 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 02E6061C22; Wed, 12 May 2021 15:28:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1620833321; bh=pbxRNvpoHwxuzJ4F/O8ly41xlSTcWgUwOr+0zFXP3wQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=EyDveu+V4+smy2NkmdnwODvtPCnJHHRcbaza0yFWQo67/62KGofY28UHC5IOP0P1j sHPafUUo+zm73+EZ8Ac0MpcqMBYbSRt+5BXoa/A2wgQzi4CHqUcyU7BTrBaBv7g0X5 k1IuGgLo0k0Qo/yKj0Ea+rIdy7LHHltOXZVlGYLQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Brijesh Singh , Tom Lendacky , Sean Christopherson , Paolo Bonzini Subject: [PATCH 5.11 102/601] KVM: SVM: Do not set sev->es_active until KVM_SEV_ES_INIT completes Date: Wed, 12 May 2021 16:42:59 +0200 Message-Id: <20210512144831.202722432@linuxfoundation.org> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210512144827.811958675@linuxfoundation.org> References: <20210512144827.811958675@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sean Christopherson commit 9fa1521daafb58d878d03d75f6863a11312fae22 upstream. Set sev->es_active only after the guts of KVM_SEV_ES_INIT succeeds. If the command fails, e.g. because SEV is already active or there are no available ASIDs, then es_active will be left set even though the VM is not fully SEV-ES capable. Refactor the code so that "es_active" is passed on the stack instead of being prematurely shoved into sev_info, both to avoid having to unwind sev_info and so that it's more obvious what actually consumes es_active in sev_guest_init() and its helpers. Fixes: ad73109ae7ec ("KVM: SVM: Provide support to launch and run an SEV-ES guest") Cc: stable@vger.kernel.org Cc: Brijesh Singh Cc: Tom Lendacky Signed-off-by: Sean Christopherson Message-Id: <20210331031936.2495277-3-seanjc@google.com> Signed-off-by: Paolo Bonzini Signed-off-by: Greg Kroah-Hartman --- arch/x86/kvm/svm/sev.c | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) --- a/arch/x86/kvm/svm/sev.c +++ b/arch/x86/kvm/svm/sev.c @@ -86,7 +86,7 @@ static bool __sev_recycle_asids(int min_ return true; } -static int sev_asid_new(struct kvm_sev_info *sev) +static int sev_asid_new(bool es_active) { int pos, min_asid, max_asid; bool retry = true; @@ -97,8 +97,8 @@ static int sev_asid_new(struct kvm_sev_i * SEV-enabled guests must use asid from min_sev_asid to max_sev_asid. * SEV-ES-enabled guest can use from 1 to min_sev_asid - 1. */ - min_asid = sev->es_active ? 0 : min_sev_asid - 1; - max_asid = sev->es_active ? min_sev_asid - 1 : max_sev_asid; + min_asid = es_active ? 0 : min_sev_asid - 1; + max_asid = es_active ? min_sev_asid - 1 : max_sev_asid; again: pos = find_next_zero_bit(sev_asid_bitmap, max_sev_asid, min_asid); if (pos >= max_asid) { @@ -178,13 +178,14 @@ static void sev_unbind_asid(struct kvm * static int sev_guest_init(struct kvm *kvm, struct kvm_sev_cmd *argp) { struct kvm_sev_info *sev = &to_kvm_svm(kvm)->sev_info; + bool es_active = argp->id == KVM_SEV_ES_INIT; int asid, ret; ret = -EBUSY; if (unlikely(sev->active)) return ret; - asid = sev_asid_new(sev); + asid = sev_asid_new(es_active); if (asid < 0) return ret; @@ -193,6 +194,7 @@ static int sev_guest_init(struct kvm *kv goto e_free; sev->active = true; + sev->es_active = es_active; sev->asid = asid; INIT_LIST_HEAD(&sev->regions_list); @@ -203,16 +205,6 @@ e_free: return ret; } -static int sev_es_guest_init(struct kvm *kvm, struct kvm_sev_cmd *argp) -{ - if (!sev_es) - return -ENOTTY; - - to_kvm_svm(kvm)->sev_info.es_active = true; - - return sev_guest_init(kvm, argp); -} - static int sev_bind_asid(struct kvm *kvm, unsigned int handle, int *error) { struct sev_data_activate *data; @@ -1059,12 +1051,15 @@ int svm_mem_enc_op(struct kvm *kvm, void mutex_lock(&kvm->lock); switch (sev_cmd.id) { + case KVM_SEV_ES_INIT: + if (!sev_es) { + r = -ENOTTY; + goto out; + } + fallthrough; case KVM_SEV_INIT: r = sev_guest_init(kvm, &sev_cmd); break; - case KVM_SEV_ES_INIT: - r = sev_es_guest_init(kvm, &sev_cmd); - break; case KVM_SEV_LAUNCH_START: r = sev_launch_start(kvm, &sev_cmd); break;