[Intel-gfx] [PATCH 2/3] x86, pat: Perform interval rbtree lookup of memtype first

Chris Wilson chris at chris-wilson.co.uk
Tue Jun 21 18:17:23 CEST 2011


The PAT interval tree is only defined for non-RAM ranges, and is both a
shorter list and log-n lookup compared to the linear walk over the
resource ranges looking for "System RAM". In the case of heavy
vm_insert_pfn() users like the gpu drivers, which regularly modify the
contents of the AGP aperture, this gives a significant reduction in the
overhead of faulting in fresh addresses.

However, note that in 1f9cc3cb6a27521ed (x86, pat: Update the page flags
for memtype atomically instead of using memtype_lock), the contention
upon the memtype_lock in lookup_memtype() was observed to be behind a
factor of 50x reduction in page fault rate for 32 cpus running
vm_insert_pfn(). By performing the locked lookup of memtype first, we
are once again exposed to that contention for is_ram pages. Though in
effect we will be just moving the contention from resource_lock (rwlock)
to memtype_lock (spinlock)

Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
%%Cc: Robin Holt <holt at sgi.com>
%%Cc: Suresh Siddha <suresh.b.siddha at intel.com>
%%Cc: H. Peter Anvin <hpa at zytor.com>
---
 arch/x86/mm/pat.c |   24 +++++++++++++-----------
 1 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c
index f6ff57b..18d4aa9 100644
--- a/arch/x86/mm/pat.c
+++ b/arch/x86/mm/pat.c
@@ -384,10 +384,21 @@ int free_memtype(u64 start, u64 end)
  */
 static unsigned long lookup_memtype(u64 paddr)
 {
-	int rettype = _PAGE_CACHE_WB;
+	int rettype = -1;
 	struct memtype *entry;
 
 	if (x86_platform.is_untracked_pat_range(paddr, paddr + PAGE_SIZE))
+		return _PAGE_CACHE_WB;
+
+	spin_lock(&memtype_lock);
+
+	entry = rbt_memtype_lookup(paddr);
+	if (entry != NULL)
+		rettype = entry->type;
+
+	spin_unlock(&memtype_lock);
+
+	if (rettype != -1)
 		return rettype;
 
 	if (pat_pagerange_is_ram(paddr, paddr + PAGE_SIZE)) {
@@ -404,16 +415,7 @@ static unsigned long lookup_memtype(u64 paddr)
 		return rettype;
 	}
 
-	spin_lock(&memtype_lock);
-
-	entry = rbt_memtype_lookup(paddr);
-	if (entry != NULL)
-		rettype = entry->type;
-	else
-		rettype = _PAGE_CACHE_UC_MINUS;
-
-	spin_unlock(&memtype_lock);
-	return rettype;
+	return _PAGE_CACHE_UC_MINUS;
 }
 
 /**
-- 
1.7.5.4




More information about the Intel-gfx mailing list