]> git.karo-electronics.de Git - linux-beck.git/commitdiff
ARM: simplify __iounmap() when dealing with section based mapping
authorNicolas Pitre <nicolas.pitre@linaro.org>
Fri, 16 Sep 2011 02:12:19 +0000 (22:12 -0400)
committerNicolas Pitre <nico@fluxnic.net>
Sun, 27 Nov 2011 00:21:27 +0000 (19:21 -0500)
Firstly, there is no need to have a double pointer here as we're only
walking the vmlist and not modifying it.

Secondly, for the same reason, we don't need a write lock but only a
read lock here, since the lock only protects the coherency of the list
nothing else.

Lastly, the reason for holding a lock is not what the comment says, so
let's remove that misleading piece of information.

Signed-off-by: Nicolas Pitre <nicolas.pitre@linaro.org>
arch/arm/mm/ioremap.c

index bdb248c4f55cdb923f7f4da2f59e9bfd08562933..bc7d9bd766d19116505dda4bc65c7671b84f5639 100644 (file)
@@ -314,26 +314,24 @@ void __iounmap(volatile void __iomem *io_addr)
 {
        void *addr = (void *)(PAGE_MASK & (unsigned long)io_addr);
 #ifndef CONFIG_SMP
-       struct vm_struct **p, *tmp;
+       struct vm_struct *vm;
 
        /*
         * If this is a section based mapping we need to handle it
         * specially as the VM subsystem does not know how to handle
-        * such a beast. We need the lock here b/c we need to clear
-        * all the mappings before the area can be reclaimed
-        * by someone else.
+        * such a beast.
         */
-       write_lock(&vmlist_lock);
-       for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
-               if ((tmp->flags & VM_IOREMAP) && (tmp->addr == addr)) {
-                       if (tmp->flags & VM_ARM_SECTION_MAPPING) {
-                               unmap_area_sections((unsigned long)tmp->addr,
-                                                   tmp->size);
+       read_lock(&vmlist_lock);
+       for (vm = vmlist; vm; vm = vm->next) {
+               if ((vm->flags & VM_IOREMAP) && (vm->addr == addr)) {
+                       if (vm->flags & VM_ARM_SECTION_MAPPING) {
+                               unmap_area_sections((unsigned long)vm->addr,
+                                                   vm->size);
                        }
                        break;
                }
        }
-       write_unlock(&vmlist_lock);
+       read_unlock(&vmlist_lock);
 #endif
 
        vunmap(addr);