x86/mm: Only check uniform after calling mtrr_type_lookup()
Today pud_set_huge() and pmd_set_huge() test for the MTRR type to be WB or INVALID after calling mtrr_type_lookup(). Those tests can be dropped as the only reason not to use a large mapping would be uniform being 0. Any MTRR type can be accepted as long as it applies to the whole memory range covered by the mapping, as the alternative would only be to map the same region with smaller pages instead, using the same PAT type as for the large mapping. [ bp: Massage commit message. ] Suggested-by: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Juergen Gross <jgross@suse.com> Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de> Tested-by: Michael Kelley <mikelley@microsoft.com> Link: https://lore.kernel.org/r/20230502120931.20719-16-jgross@suse.com Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
This commit is contained in:
parent
973df19420
commit
12f0dd8df1
|
@ -702,14 +702,8 @@ void p4d_clear_huge(p4d_t *p4d)
|
||||||
* pud_set_huge - setup kernel PUD mapping
|
* pud_set_huge - setup kernel PUD mapping
|
||||||
*
|
*
|
||||||
* MTRRs can override PAT memory types with 4KiB granularity. Therefore, this
|
* MTRRs can override PAT memory types with 4KiB granularity. Therefore, this
|
||||||
* function sets up a huge page only if any of the following conditions are met:
|
* function sets up a huge page only if the complete range has the same MTRR
|
||||||
*
|
* caching mode.
|
||||||
* - MTRRs are disabled, or
|
|
||||||
*
|
|
||||||
* - MTRRs are enabled and the range is completely covered by a single MTRR, or
|
|
||||||
*
|
|
||||||
* - MTRRs are enabled and the corresponding MTRR memory type is WB, which
|
|
||||||
* has no effect on the requested PAT memory type.
|
|
||||||
*
|
*
|
||||||
* Callers should try to decrease page size (1GB -> 2MB -> 4K) if the bigger
|
* Callers should try to decrease page size (1GB -> 2MB -> 4K) if the bigger
|
||||||
* page mapping attempt fails.
|
* page mapping attempt fails.
|
||||||
|
@ -718,11 +712,10 @@ void p4d_clear_huge(p4d_t *p4d)
|
||||||
*/
|
*/
|
||||||
int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot)
|
int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot)
|
||||||
{
|
{
|
||||||
u8 mtrr, uniform;
|
u8 uniform;
|
||||||
|
|
||||||
mtrr = mtrr_type_lookup(addr, addr + PUD_SIZE, &uniform);
|
mtrr_type_lookup(addr, addr + PUD_SIZE, &uniform);
|
||||||
if ((mtrr != MTRR_TYPE_INVALID) && (!uniform) &&
|
if (!uniform)
|
||||||
(mtrr != MTRR_TYPE_WRBACK))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Bail out if we are we on a populated non-leaf entry: */
|
/* Bail out if we are we on a populated non-leaf entry: */
|
||||||
|
@ -745,11 +738,10 @@ int pud_set_huge(pud_t *pud, phys_addr_t addr, pgprot_t prot)
|
||||||
*/
|
*/
|
||||||
int pmd_set_huge(pmd_t *pmd, phys_addr_t addr, pgprot_t prot)
|
int pmd_set_huge(pmd_t *pmd, phys_addr_t addr, pgprot_t prot)
|
||||||
{
|
{
|
||||||
u8 mtrr, uniform;
|
u8 uniform;
|
||||||
|
|
||||||
mtrr = mtrr_type_lookup(addr, addr + PMD_SIZE, &uniform);
|
mtrr_type_lookup(addr, addr + PMD_SIZE, &uniform);
|
||||||
if ((mtrr != MTRR_TYPE_INVALID) && (!uniform) &&
|
if (!uniform) {
|
||||||
(mtrr != MTRR_TYPE_WRBACK)) {
|
|
||||||
pr_warn_once("%s: Cannot satisfy [mem %#010llx-%#010llx] with a huge-page mapping due to MTRR override.\n",
|
pr_warn_once("%s: Cannot satisfy [mem %#010llx-%#010llx] with a huge-page mapping due to MTRR override.\n",
|
||||||
__func__, addr, addr + PMD_SIZE);
|
__func__, addr, addr + PMD_SIZE);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in New Issue