aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/mm/pageattr.c
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2008-02-15 16:17:57 -0500
committerThomas Gleixner <tglx@linutronix.de>2008-02-18 14:54:14 -0500
commitf34b439f34c49d7de858234bab5e2dd03cfaf3c1 (patch)
tree9707b181f13361b86285524e009522aa43f47fea /arch/x86/mm/pageattr.c
parentaf96e4438a4b34a257f5318a296e0b9e182e7ab9 (diff)
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: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/mm/pageattr.c')
-rw-r--r--arch/x86/mm/pageattr.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index b8f53233151d..3ee14996c829 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -594,20 +594,35 @@ static int __change_page_attr_set_clr(struct cpa_data *cpa, int checkalias);
594static int cpa_process_alias(struct cpa_data *cpa) 594static int cpa_process_alias(struct cpa_data *cpa)
595{ 595{
596 struct cpa_data alias_cpa; 596 struct cpa_data alias_cpa;
597 int ret; 597 int ret = 0;
598 598
599 if (cpa->pfn > max_pfn_mapped) 599 if (cpa->pfn > max_pfn_mapped)
600 return 0; 600 return 0;
601 601
602 alias_cpa = *cpa; 602 /*
603 alias_cpa.vaddr = (unsigned long) __va(cpa->pfn << PAGE_SHIFT); 603 * No need to redo, when the primary call touched the direct
604 * mapping already:
605 */
606 if (!within(cpa->vaddr, PAGE_OFFSET,
607 PAGE_OFFSET + (max_pfn_mapped << PAGE_SHIFT))) {
604 608
605 ret = __change_page_attr_set_clr(&alias_cpa, 0); 609 alias_cpa = *cpa;
610 alias_cpa.vaddr = (unsigned long) __va(cpa->pfn << PAGE_SHIFT);
611
612 ret = __change_page_attr_set_clr(&alias_cpa, 0);
613 }
606 614
607#ifdef CONFIG_X86_64 615#ifdef CONFIG_X86_64
608 if (ret) 616 if (ret)
609 return ret; 617 return ret;
610 /* 618 /*
619 * No need to redo, when the primary call touched the high
620 * mapping already:
621 */
622 if (within(cpa->vaddr, (unsigned long) _text, (unsigned long) _end))
623 return 0;
624
625 /*
611 * If the physical address is inside the kernel map, we need 626 * If the physical address is inside the kernel map, we need
612 * to touch the high mapped kernel as well: 627 * to touch the high mapped kernel as well:
613 */ 628 */