On 12/31/21 16:36, Borislav Petkov wrote: > On Fri, Dec 10, 2021 at 09:43:12AM -0600, Brijesh Singh wrote: >> diff --git a/arch/x86/include/asm/sev-common.h b/arch/x86/include/asm/sev-common.h >> index 123a96f7dff2..38c14601ae4a 100644 > >> +{ >> + unsigned long pfn; >> + struct page *p; >> + >> + /* >> + * Allocate an SNP safe page to workaround the SNP erratum where >> + * the CPU will incorrectly signal an RMP violation #PF if a >> + * hugepage (2mb or 1gb) collides with the RMP entry of VMSA page. > > 2MB or 1GB > > Collides how? The 4K frame is inside the hugepage? > >> + * The recommeded workaround is to not use the large page. > > Unknown word [recommeded] in comment, suggestions: > ['recommended', 'recommend', 'recommitted', 'commended', 'commandeered'] > >> + * >> + * Allocate one extra page, use a page which is not 2mb aligned > > 2MB-aligned > >> + * and free the other. >> + */ >> + p = alloc_pages(GFP_KERNEL_ACCOUNT | __GFP_ZERO, 1); >> + if (!p) >> + return NULL; >> + >> + split_page(p, 1); >> + >> + pfn = page_to_pfn(p); >> + if (IS_ALIGNED(__pfn_to_phys(pfn), PMD_SIZE)) { >> + pfn++; >> + __free_page(p); >> + } else { >> + __free_page(pfn_to_page(pfn + 1)); >> + } > > AFAICT, this is doing all this stuff so that you can make sure you get a > non-2M-aligned page. I wonder if there's a way to simply ask mm to give > you such page directly. > > vbabka? AFAIK, not, as this is a very unusual constraint. Unless there are more places that need it, should be fine to solve it like above. Maybe just also be optimistic and try a plain order-0 first and only if it has the undesired alignment (which should happen only once per 512 allocations), fallback to the above?