diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2008-01-30 13:34:05 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 13:34:05 +0100 |
commit | 74ff2857f099951020a47420872f5c1460f32c27 (patch) | |
tree | 2087ac62a943702239f226b4c64b543e17db30db /arch/x86/mm/ioremap_64.c | |
parent | f87519e8f4f1de9b39a40e56479a7ad2443169dd (diff) |
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>
Diffstat (limited to 'arch/x86/mm/ioremap_64.c')
-rw-r--r-- | arch/x86/mm/ioremap_64.c | 14 |
1 files changed, 6 insertions, 8 deletions
diff --git a/arch/x86/mm/ioremap_64.c b/arch/x86/mm/ioremap_64.c index 8862a19f39c..bb9246c4a07 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); |