mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	arm64: Avoid cache flushing in flush_dcache_page()
The flush_dcache_page() function is called when the kernel modified a page cache page. Since the D-cache on AArch64 does not have aliases this function can simply mark the page as dirty for later flushing via set_pte_at()/__sync_icache_dcache() if the page is executable (to ensure the I-D cache coherency). Signed-off-by: Catalin Marinas <catalin.marinas@arm.com> Reported-by: Will Deacon <will.deacon@arm.com> Acked-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
		
							parent
							
								
									d25749afc6
								
							
						
					
					
						commit
						b5b6c9e914
					
				
					 1 changed files with 4 additions and 18 deletions
				
			
		| 
						 | 
					@ -94,29 +94,15 @@ void __sync_icache_dcache(pte_t pte, unsigned long addr)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Ensure cache coherency between kernel mapping and userspace mapping of this
 | 
					 * This function is called when a page has been modified by the kernel. Mark
 | 
				
			||||||
 * page.
 | 
					 * it as dirty for later flushing when mapped in user space (if executable,
 | 
				
			||||||
 | 
					 * see __sync_icache_dcache).
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
void flush_dcache_page(struct page *page)
 | 
					void flush_dcache_page(struct page *page)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct address_space *mapping;
 | 
						if (test_bit(PG_dcache_clean, &page->flags))
 | 
				
			||||||
 | 
					 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * The zero page is never written to, so never has any dirty cache
 | 
					 | 
				
			||||||
	 * lines, and therefore never needs to be flushed.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	if (page == ZERO_PAGE(0))
 | 
					 | 
				
			||||||
		return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	mapping = page_mapping(page);
 | 
					 | 
				
			||||||
	if (mapping && mapping_mapped(mapping)) {
 | 
					 | 
				
			||||||
		__flush_dcache_page(page);
 | 
					 | 
				
			||||||
		__flush_icache_all();
 | 
					 | 
				
			||||||
		set_bit(PG_dcache_clean, &page->flags);
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		clear_bit(PG_dcache_clean, &page->flags);
 | 
							clear_bit(PG_dcache_clean, &page->flags);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
}
 | 
					 | 
				
			||||||
EXPORT_SYMBOL(flush_dcache_page);
 | 
					EXPORT_SYMBOL(flush_dcache_page);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue