diff options
Diffstat (limited to 'arch/i386/mm/ioremap.c')
-rw-r--r-- | arch/i386/mm/ioremap.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/arch/i386/mm/ioremap.c b/arch/i386/mm/ioremap.c index db06f7399913..ab542792b27b 100644 --- a/arch/i386/mm/ioremap.c +++ b/arch/i386/mm/ioremap.c | |||
@@ -238,19 +238,21 @@ void iounmap(volatile void __iomem *addr) | |||
238 | addr < phys_to_virt(ISA_END_ADDRESS)) | 238 | addr < phys_to_virt(ISA_END_ADDRESS)) |
239 | return; | 239 | return; |
240 | 240 | ||
241 | p = remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr)); | 241 | write_lock(&vmlist_lock); |
242 | p = __remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr)); | ||
242 | if (!p) { | 243 | if (!p) { |
243 | printk("__iounmap: bad address %p\n", addr); | 244 | printk("iounmap: bad address %p\n", addr); |
244 | return; | 245 | goto out_unlock; |
245 | } | 246 | } |
246 | 247 | ||
247 | if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) { | 248 | if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) { |
248 | /* p->size includes the guard page, but cpa doesn't like that */ | ||
249 | change_page_attr(virt_to_page(__va(p->phys_addr)), | 249 | change_page_attr(virt_to_page(__va(p->phys_addr)), |
250 | p->size >> PAGE_SHIFT, | 250 | p->size >> PAGE_SHIFT, |
251 | PAGE_KERNEL); | 251 | PAGE_KERNEL); |
252 | global_flush_tlb(); | 252 | global_flush_tlb(); |
253 | } | 253 | } |
254 | out_unlock: | ||
255 | write_unlock(&vmlist_lock); | ||
254 | kfree(p); | 256 | kfree(p); |
255 | } | 257 | } |
256 | 258 | ||