Commit f34b439f authored by Thomas Gleixner's avatar Thomas Gleixner

x86: CPA: avoid double checking of alias ranges

When the CPA code is called with an virtual address in the range of
the direct mapping or the high alias then we do not need to run
through the alias check for this range.
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent af96e443
...@@ -594,19 +594,34 @@ static int __change_page_attr_set_clr(struct cpa_data *cpa, int checkalias); ...@@ -594,19 +594,34 @@ static int __change_page_attr_set_clr(struct cpa_data *cpa, int checkalias);
static int cpa_process_alias(struct cpa_data *cpa) static int cpa_process_alias(struct cpa_data *cpa)
{ {
struct cpa_data alias_cpa; struct cpa_data alias_cpa;
int ret; int ret = 0;
if (cpa->pfn > max_pfn_mapped) if (cpa->pfn > max_pfn_mapped)
return 0; return 0;
alias_cpa = *cpa; /*
alias_cpa.vaddr = (unsigned long) __va(cpa->pfn << PAGE_SHIFT); * No need to redo, when the primary call touched the direct
* mapping already:
*/
if (!within(cpa->vaddr, PAGE_OFFSET,
PAGE_OFFSET + (max_pfn_mapped << PAGE_SHIFT))) {
ret = __change_page_attr_set_clr(&alias_cpa, 0); alias_cpa = *cpa;
alias_cpa.vaddr = (unsigned long) __va(cpa->pfn << PAGE_SHIFT);
ret = __change_page_attr_set_clr(&alias_cpa, 0);
}
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
if (ret) if (ret)
return ret; return ret;
/*
* No need to redo, when the primary call touched the high
* mapping already:
*/
if (within(cpa->vaddr, (unsigned long) _text, (unsigned long) _end))
return 0;
/* /*
* If the physical address is inside the kernel map, we need * If the physical address is inside the kernel map, we need
* to touch the high mapped kernel as well: * to touch the high mapped kernel as well:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment