On Tue, Nov 07, 2023 at 05:31:42PM +0100, Borislav Petkov wrote: > On Mon, Oct 16, 2023 at 08:27:35AM -0500, Michael Roth wrote: > > +static bool early_rmptable_check(void) > > +{ > > + u64 rmp_base, rmp_size; > > + > > + /* > > + * For early BSP initialization, max_pfn won't be set up yet, wait until > > + * it is set before performing the RMP table calculations. > > + */ > > + if (!max_pfn) > > + return true; > > This already says that this is called at the wrong point during init. > > Right now we have > > early_identify_cpu -> early_init_amd -> early_detect_mem_encrypt > > which runs only on the BSP but then early_init_amd() is called in > init_amd() too so that it takes care of the APs too. > > Which ends up doing a lot of unnecessary work on each AP in > early_detect_mem_encrypt() like calculating the RMP size on each AP > unnecessarily where this needs to happen exactly once. > > Is there any reason why this function cannot be moved to init_amd() > where it'll do the normal, per-AP init? > > And the stuff that needs to happen once, needs to be called once too. I've renamed/repurposed snp_get_rmptable_info() to snp_probe_rmptable_info(). It now reads the MSRs, sanity-checks them, and stores the values into ro_after_init variables on success. Subsequent code uses those values to initialize the RMP table mapping instead of re-reading the MSRs. I've moved the call-site for snp_probe_rmptable_info() to bsp_init_amd(), which gets called right after early_init_amd(), so should still be early enough to clear X86_FEATURE_SEV_SNP such that AutoIBRS doesn't get disabled if SNP isn't available on the system. APs don't call bsp_init_amd(), so that should avoid doing multiple MSR reads. And I think Ashish has all the other review comments addressed now. Thanks, Mike