On 3/25/21 10:51 AM, Dave Hansen wrote: > On 3/25/21 8:31 AM, Brijesh Singh wrote: >> On 3/25/21 9:58 AM, Dave Hansen wrote: >>>> +static int __init mem_encrypt_snp_init(void) >>>> +{ >>>> + if (!boot_cpu_has(X86_FEATURE_SEV_SNP)) >>>> + return 1; >>>> + >>>> + if (rmptable_init()) { >>>> + setup_clear_cpu_cap(X86_FEATURE_SEV_SNP); >>>> + return 1; >>>> + } >>>> + >>>> + static_branch_enable(&snp_enable_key); >>>> + >>>> + return 0; >>>> +} >>> Could you explain a bit why 'snp_enable_key' is needed in addition to >>> X86_FEATURE_SEV_SNP? >> >> The X86_FEATURE_SEV_SNP indicates that hardware supports the feature -- >> this does not necessary means that SEV-SNP is enabled in the host. > I think you're confusing the CPUID bit that initially populates > X86_FEATURE_SEV_SNP with the X86_FEATURE bit. We clear X86_FEATURE bits > all the time for features that the kernel turns off, even while the > hardware supports it. Ah, yes I was getting mixed up. I will see if we can remove the snp_key_enabled and use the feature check. > Look at what we do in init_ia32_feat_ctl() for SGX, for instance. We > then go on to use X86_FEATURE_SGX at runtime to see if SGX was disabled, > even though the hardware supports it. > >>> For a lot of features, we just use cpu_feature_enabled(), which does >>> both compile-time and static_cpu_has(). This whole series seems to lack >>> compile-time disables for the code that it adds, like the code it adds >>> to arch/x86/mm/fault.c or even mm/memory.c. >> Noted, I will add the #ifdef to make sure that its compiled out when >> the config does not have the AMD_MEM_ENCRYPTION enabled. > IS_ENABLED() tends to be nicer for these things. > > Even better is if you coordinate these with your X86_FEATURE_SEV_SNP > checks. Then, put X86_FEATURE_SEV_SNP in disabled-features.h, and you > can use cpu_feature_enabled(X86_FEATURE_SEV_SNP) as both a > (statically-patched) runtime *AND* compile-time check without an > explicit #ifdefs. I will try improve this in v2 and will try IS_ENABLED().