diff options
Diffstat (limited to 'drivers/gpu/drm/drm_cache.c')
| -rw-r--r-- | drivers/gpu/drm/drm_cache.c | 16 | 
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/gpu/drm/drm_cache.c b/drivers/gpu/drm/drm_cache.c index bb8f5801218..a6b690626a6 100644 --- a/drivers/gpu/drm/drm_cache.c +++ b/drivers/gpu/drm/drm_cache.c @@ -32,6 +32,12 @@  #include <drm/drmP.h>  #if defined(CONFIG_X86) + +/* + * clflushopt is an unordered instruction which needs fencing with mfence or + * sfence to avoid ordering issues.  For drm_clflush_page this fencing happens + * in the caller. + */  static void  drm_clflush_page(struct page *page)  { @@ -44,7 +50,7 @@ drm_clflush_page(struct page *page)  	page_virtual = kmap_atomic(page);  	for (i = 0; i < PAGE_SIZE; i += size) -		clflush(page_virtual + i); +		clflushopt(page_virtual + i);  	kunmap_atomic(page_virtual);  } @@ -125,15 +131,15 @@ drm_clflush_sg(struct sg_table *st)  EXPORT_SYMBOL(drm_clflush_sg);  void -drm_clflush_virt_range(char *addr, unsigned long length) +drm_clflush_virt_range(void *addr, unsigned long length)  {  #if defined(CONFIG_X86)  	if (cpu_has_clflush) { -		char *end = addr + length; +		void *end = addr + length;  		mb();  		for (; addr < end; addr += boot_cpu_data.x86_clflush_size) -			clflush(addr); -		clflush(end - 1); +			clflushopt(addr); +		clflushopt(end - 1);  		mb();  		return;  	}  | 
