x86: work around PAGE_KERNEL_WC not getting WC in iomap_atomic_prot_pfn.
In the absence of PAT, PAGE_KERNEL_WC ends up mapping to a memory type that gets UC behavior even in the presence of a WC MTRR covering the area in question. By swapping to PAGE_KERNEL_UC_MINUS, we can get the actual behavior the caller wanted (WC if you can manage it, UC otherwise). This recovers the 40% performance improvement of using WC in the DRM to upload vertex data. Signed-off-by: Eric Anholt <eric@anholt.net> Signed-off-by: H. Peter Anvin <hpa@zytor.com>
This commit is contained in:
		
					parent
					
						
							
								e1b4d11436
							
						
					
				
			
			
				commit
				
					
						ef5fa0ab24
					
				
			
		
					 1 changed files with 10 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -17,6 +17,7 @@
 | 
			
		|||
 */
 | 
			
		||||
 | 
			
		||||
#include <asm/iomap.h>
 | 
			
		||||
#include <asm/pat.h>
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
 | 
			
		||||
/* Map 'pfn' using fixed map 'type' and protections 'prot'
 | 
			
		||||
| 
						 | 
				
			
			@ -29,6 +30,15 @@ iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot)
 | 
			
		|||
 | 
			
		||||
	pagefault_disable();
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * For non-PAT systems, promote PAGE_KERNEL_WC to PAGE_KERNEL_UC_MINUS.
 | 
			
		||||
	 * PAGE_KERNEL_WC maps to PWT, which translates to uncached if the
 | 
			
		||||
	 * MTRR is UC or WC.  UC_MINUS gets the real intention, of the
 | 
			
		||||
	 * user, which is "WC if the MTRR is WC, UC if you can't do that."
 | 
			
		||||
	 */
 | 
			
		||||
	if (!pat_enabled && pgprot_val(prot) == pgprot_val(PAGE_KERNEL_WC))
 | 
			
		||||
		prot = PAGE_KERNEL_UC_MINUS;
 | 
			
		||||
 | 
			
		||||
	idx = type + KM_TYPE_NR*smp_processor_id();
 | 
			
		||||
	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 | 
			
		||||
	set_pte(kmap_pte-idx, pfn_pte(pfn, prot));
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue