diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2008-01-30 12:34:05 (GMT) |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 12:34:05 (GMT) |
commit | 74ff2857f099951020a47420872f5c1460f32c27 (patch) | |
tree | 2087ac62a943702239f226b4c64b543e17db30db | |
parent | f87519e8f4f1de9b39a40e56479a7ad2443169dd (diff) | |
download | linux-fsl-qoriq-74ff2857f099951020a47420872f5c1460f32c27.tar.xz |
x86: make c_p_a unconditional in ioremap
Make c_p_a unconditional for ioremap and iounmap. This ensures
complete consistency of the flags which are handed to
ioremap_page_range and the real flags in the mappings.
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/mm/ioremap_32.c | 4 | ||||
-rw-r--r-- | arch/x86/mm/ioremap_64.c | 14 |
2 files changed, 8 insertions, 10 deletions
diff --git a/arch/x86/mm/ioremap_32.c b/arch/x86/mm/ioremap_32.c index d43251c..213ace5 100644 --- a/arch/x86/mm/ioremap_32.c +++ b/arch/x86/mm/ioremap_32.c @@ -74,7 +74,7 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, /* * Ok, go for it.. */ - area = get_vm_area(size, VM_IOREMAP | (flags << 20)); + area = get_vm_area(size, VM_IOREMAP); if (!area) return NULL; area->phys_addr = phys_addr; @@ -189,7 +189,7 @@ void iounmap(volatile void __iomem *addr) } /* Reset the direct mapping. Can block */ - if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) { + if (p->phys_addr < virt_to_phys(high_memory) - 1) { change_page_attr(virt_to_page(__va(p->phys_addr)), get_vm_area_size(p) >> PAGE_SHIFT, PAGE_KERNEL); diff --git a/arch/x86/mm/ioremap_64.c b/arch/x86/mm/ioremap_64.c index 8862a19..bb9246c 100644 --- a/arch/x86/mm/ioremap_64.c +++ b/arch/x86/mm/ioremap_64.c @@ -31,7 +31,7 @@ EXPORT_SYMBOL(__phys_addr); * conflicts. */ static int ioremap_change_attr(unsigned long phys_addr, unsigned long size, - unsigned long flags) + pgprot_t prot) { int err = 0; if (phys_addr + size - 1 < (end_pfn_map << PAGE_SHIFT)) { @@ -50,8 +50,8 @@ static int ioremap_change_attr(unsigned long phys_addr, unsigned long size, * the phys addr can be a in hole between nodes and * not have an memmap entry. */ - err = change_page_attr_addr(vaddr,npages, - MAKE_GLOBAL(__PAGE_KERNEL|flags)); + err = change_page_attr_addr(vaddr, npages, prot); + if (!err) global_flush_tlb(); } @@ -97,7 +97,7 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, /* * Ok, go for it.. */ - area = get_vm_area(size, VM_IOREMAP | (flags << 20)); + area = get_vm_area(size, VM_IOREMAP); if (!area) return NULL; area->phys_addr = phys_addr; @@ -107,8 +107,7 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, remove_vm_area((void *)(PAGE_MASK & (unsigned long) addr)); return NULL; } - if (flags && ioremap_change_attr(phys_addr, size, flags) < 0) { - area->flags &= 0xffffff; + if (ioremap_change_attr(phys_addr, size, pgprot) < 0) { vunmap(addr); return NULL; } @@ -180,8 +179,7 @@ void iounmap(volatile void __iomem *addr) } /* Reset the direct mapping. Can block */ - if (p->flags >> 20) - ioremap_change_attr(p->phys_addr, p->size, 0); + ioremap_change_attr(p->phys_addr, p->size, PAGE_KERNEL); /* Finally remove it */ o = remove_vm_area((void *)addr); |