[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:
Родитель
e47c222b22
Коммит
a6f36be326
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче