Commit a6f36be32622730710b2fadacb6e2649defa4371

Authored by Russell King
Committed by Russell King
1 parent e47c222b22

[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>

Showing 4 changed files with 6 additions and 5 deletions Side-by-side Diff

Documentation/cachetlb.txt
... ... @@ -373,14 +373,15 @@
373 373 likely that you will need to flush the instruction cache
374 374 for copy_to_user_page().
375 375  
376   - void flush_anon_page(struct page *page, unsigned long vmaddr)
  376 + void flush_anon_page(struct vm_area_struct *vma, struct page *page,
  377 + unsigned long vmaddr)
377 378 When the kernel needs to access the contents of an anonymous
378 379 page, it calls this function (currently only
379 380 get_user_pages()). Note: flush_dcache_page() deliberately
380 381 doesn't work for an anonymous page. The default
381 382 implementation is a nop (and should remain so for all coherent
382 383 architectures). For incoherent architectures, it should flush
383   - the cache of the page at vmaddr in the current user process.
  384 + the cache of the page at vmaddr.
384 385  
385 386 void flush_kernel_dcache_page(struct page *page)
386 387 When the kernel needs to modify a user page is has obtained
include/asm-parisc/cacheflush.h
... ... @@ -186,7 +186,7 @@
186 186 }
187 187  
188 188 static inline void
189   -flush_anon_page(struct page *page, unsigned long vmaddr)
  189 +flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
190 190 {
191 191 if (PageAnon(page))
192 192 flush_user_dcache_page(vmaddr);
include/linux/highmem.h
... ... @@ -8,7 +8,7 @@
8 8 #include <asm/cacheflush.h>
9 9  
10 10 #ifndef ARCH_HAS_FLUSH_ANON_PAGE
11   -static inline void flush_anon_page(struct page *page, unsigned long vmaddr)
  11 +static inline void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr)
12 12 {
13 13 }
14 14 #endif
... ... @@ -1091,7 +1091,7 @@
1091 1091 if (pages) {
1092 1092 pages[i] = page;
1093 1093  
1094   - flush_anon_page(page, start);
  1094 + flush_anon_page(vma, page, start);
1095 1095 flush_dcache_page(page);
1096 1096 }
1097 1097 if (vmas)