return NULL;
 }
 
-static void private_free_iova(struct iova_domain *iovad, struct iova *iova)
+static void remove_iova(struct iova_domain *iovad, struct iova *iova)
 {
        assert_spin_locked(&iovad->iova_rbtree_lock);
        __cached_rbnode_delete_update(iovad, iova);
        rb_erase(&iova->node, &iovad->rbroot);
-       free_iova_mem(iova);
 }
 
 /**
        unsigned long flags;
 
        spin_lock_irqsave(&iovad->iova_rbtree_lock, flags);
-       private_free_iova(iovad, iova);
+       remove_iova(iovad, iova);
        spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags);
+       free_iova_mem(iova);
 }
 EXPORT_SYMBOL_GPL(__free_iova);
 
 
        spin_lock_irqsave(&iovad->iova_rbtree_lock, flags);
        iova = private_find_iova(iovad, pfn);
-       if (iova)
-               private_free_iova(iovad, iova);
+       if (!iova) {
+               spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags);
+               return;
+       }
+       remove_iova(iovad, iova);
        spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags);
-
+       free_iova_mem(iova);
 }
 EXPORT_SYMBOL_GPL(free_iova);
 
                if (WARN_ON(!iova))
                        continue;
 
-               private_free_iova(iovad, iova);
+               remove_iova(iovad, iova);
+               free_iova_mem(iova);
        }
 
        spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags);