aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhen Lei <[email protected]>2017-09-21 16:52:42 +0100
committerJoerg Roedel <[email protected]>2017-09-27 17:09:56 +0200
commit2070f940a6d5148cf2df0d0087ff0a64d9f15237 (patch)
tree33eaa069e7e259009034651a3241ee8318ee55b9
parente19b205be43d11bff638cad4487008c48d21c103 (diff)
iommu/iova: Optimise rbtree searching
Checking the IOVA bounds separately before deciding which direction to continue the search (if necessary) results in redundantly comparing both pfns twice each. GCC can already determine that the final comparison op is redundant and optimise it down to 3 in total, but we can go one further with a little tweak of the ordering (which makes the intent of the code that much cleaner as a bonus). Signed-off-by: Zhen Lei <[email protected]> Tested-by: Ard Biesheuvel <[email protected]> Tested-by: Zhen Lei <[email protected]> Tested-by: Nate Watterson <[email protected]> [rm: rewrote commit message to clarify] Signed-off-by: Robin Murphy <[email protected]> Signed-off-by: Joerg Roedel <[email protected]>
-rw-r--r--drivers/iommu/iova.c9
1 files changed, 3 insertions, 6 deletions
diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c
index 33edfa794ae9..f129ff4f5c89 100644
--- a/drivers/iommu/iova.c
+++ b/drivers/iommu/iova.c
@@ -342,15 +342,12 @@ private_find_iova(struct iova_domain *iovad, unsigned long pfn)
while (node) {
struct iova *iova = rb_entry(node, struct iova, node);
- /* If pfn falls within iova's range, return iova */
- if ((pfn >= iova->pfn_lo) && (pfn <= iova->pfn_hi)) {
- return iova;
- }
-
if (pfn < iova->pfn_lo)
node = node->rb_left;
- else if (pfn > iova->pfn_lo)
+ else if (pfn > iova->pfn_hi)
node = node->rb_right;
+ else
+ return iova; /* pfn falls within iova's range */
}
return NULL;