From 7f75740a1efd513d72ddc3cc7627f66f15ef5faa Mon Sep 17 00:00:00 2001 From: Chris Wright Date: Sat, 28 May 2011 13:15:04 -0500 Subject: [PATCH] --- yaml --- r: 252967 b: refs/heads/master c: 1c9fc3d11b84fbd0c4f4aa7855702c2a1f098ebb h: refs/heads/master i: 252965: 207feccaf7f69f7d05a428e3b4a44f8ccd3f0b20 252963: 6a7d3cce474f2972bb4ebd4dbd039ebb2dc6d029 252959: 20b4ef6e72c26750580547571a5145b80ae243d5 v: v3 --- [refs] | 2 +- trunk/drivers/pci/iova.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index dad2e1949232..5aa864e1c4c6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: cb452a4040bb051d92e85d6e7eb60c11734c1781 +refs/heads/master: 1c9fc3d11b84fbd0c4f4aa7855702c2a1f098ebb diff --git a/trunk/drivers/pci/iova.c b/trunk/drivers/pci/iova.c index 9606e599a475..c5c274ab5c5a 100644 --- a/trunk/drivers/pci/iova.c +++ b/trunk/drivers/pci/iova.c @@ -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