Commit a6f36be32622730710b2fadacb6e2649defa4371
Committed by
Russell King
1 parent
e47c222b22
Exists in
master
and in
4 other branches
[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 |