FAILED: patch "[PATCH] KVM: SVM: Add support for allowing zero SEV ASIDs" failed to apply to 6.1-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 6.1-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.1.y
git checkout FETCH_HEAD
git cherry-pick -x 0aa6b90ef9d75b4bd7b6d106d85f2a3437697f91
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024040516-helmet-aware-9f06@gregkh' --subject-prefix 'PATCH 6.1.y' HEAD^..
Possible dependencies:
0aa6b90ef9d7 ("KVM: SVM: Add support for allowing zero SEV ASIDs") 466eec4a22a7 ("KVM: SVM: Use unsigned integers when dealing with ASIDs") 106ed2cad9f7 ("KVM: SVM: WARN, but continue, if misc_cg_set_capacity() fails") 6d1bc9754b04 ("KVM: SVM: enhance info printk's in SEV init")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 0aa6b90ef9d75b4bd7b6d106d85f2a3437697f91 Mon Sep 17 00:00:00 2001
From: Ashish Kalra <[email protected]>
Date: Wed, 31 Jan 2024 15:56:08 -0800
Subject: [PATCH] KVM: SVM: Add support for allowing zero SEV ASIDs
Some BIOSes allow the end user to set the minimum SEV ASID value (CPUID 0x8000001F_EDX) to be greater than the maximum number of encrypted guests, or maximum SEV ASID value (CPUID 0x8000001F_ECX) in order to dedicate all the SEV ASIDs to SEV-ES or SEV-SNP.
The SEV support, as coded, does not handle the case where the minimum SEV ASID value can be greater than the maximum SEV ASID value. As a result, the following confusing message is issued:
[ 30.715724] kvm_amd: SEV enabled (ASIDs 1007 - 1006)
Fix the support to properly handle this case.
arch/x86/kvm/svm/sev.c +19 -10
@@ -144,10 +144,21 @@ static void sev_misc_cg_uncharge(struct kvm_sev_info *sev)static int sev_asid_new (struct kvm_sev_info *sev) { -unsigned int asid, min_asid, max_asid; +/* +* 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. +* Note: min ASID can end up larger than the max if basic SEV support is +* effectively disabled by disallowing use of ASIDs for SEV guests. +*/ +unsigned int min_asid = sev->es_active ?1 : min_sev_asid; +unsigned int max_asid = sev->es_active ? min_sev_asid -1 : max_sev_asid; +unsigned int asid;bool retry = true;int ret; +if (min_asid > max_asid) +return -ENOTTY ; +WARN_ON (sev->misc_cg); sev->misc_cg =get_current_misc_cg (); ret =sev_misc_cg_try_charge (sev);
@@ -159,12 +170,6 @@ static int sev_asid_new(struct kvm_sev_info *sev)mutex_lock (&sev_bitmap_lock); -/* -* 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 ?1 : min_sev_asid; - max_asid = sev->es_active ? min_sev_asid -1 : max_sev_asid; again: asid =find_next_zero_bit (sev_asid_bitmap, max_asid +1 , min_asid);if (asid > max_asid) {
@@ -2234,8 +2239,10 @@ void __init sev_hardware_setup(void) goto out; } - sev_asid_count = max_sev_asid - min_sev_asid +1 ; -WARN_ON_ONCE (misc_cg_set_capacity (MISC_CG_RES_SEV , sev_asid_count)); +if (min_sev_asid <= max_sev_asid) { + sev_asid_count = max_sev_asid - min_sev_asid +1 ; +WARN_ON_ONCE (misc_cg_set_capacity (MISC_CG_RES_SEV , sev_asid_count)); + } sev_supported = true;/* SEV-ES support requested? */
@@ -2266,7 +2273,9 @@ void __init sev_hardware_setup(void) out:if (boot_cpu_has (X86_FEATURE_SEV ))pr_info ("SEV %s (ASIDs %u - %u)\n" , - sev_supported ?"enabled" :"disabled" , + sev_supported ? min_sev_asid <= max_sev_asid ?"enabled" : +"unusable" : +"disabled" , min_sev_asid, max_sev_asid);if (boot_cpu_has (X86_FEATURE_SEV_ES )) pr_info("SEV-ES %s (ASIDs %u - %u)\n",