mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-11-01 09:13:37 +00:00 
			
		
		
		
	[ARM] pass vma for flush_anon_page()
Since get_user_pages() may be used with processes other than the current process and calls flush_anon_page(), flush_anon_page() has to cope in some way with non-current processes. It may not be appropriate, or even desirable to flush a region of virtual memory cache in the current process when that is different to the process that we want the flush to occur for. Therefore, pass the vma into flush_anon_page() so that the architecture can work out whether the 'vmaddr' is for the current process or not. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									e47c222b22
								
							
						
					
					
						commit
						a6f36be326
					
				
					 4 changed files with 6 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -373,14 +373,15 @@ maps this page at its virtual address.
 | 
			
		|||
	likely that you will need to flush the instruction cache
 | 
			
		||||
	for copy_to_user_page().
 | 
			
		||||
 | 
			
		||||
  void flush_anon_page(struct page *page, unsigned long vmaddr)
 | 
			
		||||
  void flush_anon_page(struct vm_area_struct *vma, struct page *page,
 | 
			
		||||
                       unsigned long vmaddr)
 | 
			
		||||
  	When the kernel needs to access the contents of an anonymous
 | 
			
		||||
	page, it calls this function (currently only
 | 
			
		||||
	get_user_pages()).  Note: flush_dcache_page() deliberately
 | 
			
		||||
	doesn't work for an anonymous page.  The default
 | 
			
		||||
	implementation is a nop (and should remain so for all coherent
 | 
			
		||||
	architectures).  For incoherent architectures, it should flush
 | 
			
		||||
	the cache of the page at vmaddr in the current user process.
 | 
			
		||||
	the cache of the page at vmaddr.
 | 
			
		||||
 | 
			
		||||
  void flush_kernel_dcache_page(struct page *page)
 | 
			
		||||
	When the kernel needs to modify a user page is has obtained
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -186,7 +186,7 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
static inline void
 | 
			
		||||
flush_anon_page(struct page *page, unsigned long vmaddr)
 | 
			
		||||
flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
 | 
			
		||||
{
 | 
			
		||||
	if (PageAnon(page))
 | 
			
		||||
		flush_user_dcache_page(vmaddr);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -8,7 +8,7 @@
 | 
			
		|||
#include <asm/cacheflush.h>
 | 
			
		||||
 | 
			
		||||
#ifndef ARCH_HAS_FLUSH_ANON_PAGE
 | 
			
		||||
static inline void flush_anon_page(struct page *page, unsigned long vmaddr)
 | 
			
		||||
static inline void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1091,7 +1091,7 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 | 
			
		|||
			if (pages) {
 | 
			
		||||
				pages[i] = page;
 | 
			
		||||
 | 
			
		||||
				flush_anon_page(page, start);
 | 
			
		||||
				flush_anon_page(vma, page, start);
 | 
			
		||||
				flush_dcache_page(page);
 | 
			
		||||
			}
 | 
			
		||||
			if (vmas)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue