From 74ff2857f099951020a47420872f5c1460f32c27 Mon Sep 17 00:00:00 2001 From: Thomas Gleixner Date: Wed, 30 Jan 2008 13:34:05 +0100 Subject: [PATCH] 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 Signed-off-by: Ingo Molnar --- arch/x86/mm/ioremap_32.c | 4 ++-- 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 d43251c9c1c6..213ace58a188 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 8862a19f39c8..bb9246c4a07b 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);