Commit 3a651b3a authored by Cong Wang's avatar Cong Wang Committed by Will Deacon
Browse files

iommu: avoid taking iova_rbtree_lock twice



Both find_iova() and __free_iova() take iova_rbtree_lock,
there is no reason to take and release it twice inside
free_iova().

Fold them into one critical section by calling the unlock
versions instead.

Signed-off-by: default avatarCong Wang <xiyou.wangcong@gmail.com>
Reviewed-by: default avatarRobin Murphy <robin.murphy@arm.com>
Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
Link: https://lore.kernel.org/r/1605608734-84416-5-git-send-email-john.garry@huawei.com


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 6fa3525b
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -402,10 +402,14 @@ EXPORT_SYMBOL_GPL(__free_iova);
void
free_iova(struct iova_domain *iovad, unsigned long pfn)
{
	struct iova *iova = find_iova(iovad, pfn);
	unsigned long flags;
	struct iova *iova;

	spin_lock_irqsave(&iovad->iova_rbtree_lock, flags);
	iova = private_find_iova(iovad, pfn);
	if (iova)
		__free_iova(iovad, iova);
		private_free_iova(iovad, iova);
	spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags);

}
EXPORT_SYMBOL_GPL(free_iova);