|
@@ -63,8 +63,16 @@ __cached_rbnode_delete_update(struct iova_domain *iovad, struct iova *free)
|
|
|
curr = iovad->cached32_node;
|
|
|
cached_iova = container_of(curr, struct iova, node);
|
|
|
|
|
|
- if (free->pfn_lo >= cached_iova->pfn_lo)
|
|
|
- iovad->cached32_node = rb_next(&free->node);
|
|
|
+ if (free->pfn_lo >= cached_iova->pfn_lo) {
|
|
|
+ struct rb_node *node = rb_next(&free->node);
|
|
|
+ struct iova *iova = container_of(node, struct iova, node);
|
|
|
+
|
|
|
+ /* only cache if it's below 32bit pfn */
|
|
|
+ if (node && iova->pfn_lo < iovad->dma_32bit_pfn)
|
|
|
+ iovad->cached32_node = node;
|
|
|
+ else
|
|
|
+ iovad->cached32_node = NULL;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Computes the padding size required, to make the
|