mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-11-18 23:54:26 +08: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
@ -373,14 +373,15 @@ maps this page at its virtual address.
|
|||||||
likely that you will need to flush the instruction cache
|
likely that you will need to flush the instruction cache
|
||||||
for copy_to_user_page().
|
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
|
When the kernel needs to access the contents of an anonymous
|
||||||
page, it calls this function (currently only
|
page, it calls this function (currently only
|
||||||
get_user_pages()). Note: flush_dcache_page() deliberately
|
get_user_pages()). Note: flush_dcache_page() deliberately
|
||||||
doesn't work for an anonymous page. The default
|
doesn't work for an anonymous page. The default
|
||||||
implementation is a nop (and should remain so for all coherent
|
implementation is a nop (and should remain so for all coherent
|
||||||
architectures). For incoherent architectures, it should flush
|
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)
|
void flush_kernel_dcache_page(struct page *page)
|
||||||
When the kernel needs to modify a user page is has obtained
|
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
|
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))
|
if (PageAnon(page))
|
||||||
flush_user_dcache_page(vmaddr);
|
flush_user_dcache_page(vmaddr);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
#ifndef ARCH_HAS_FLUSH_ANON_PAGE
|
#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
|
#endif
|
||||||
|
@ -1091,7 +1091,7 @@ int get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
|
|||||||
if (pages) {
|
if (pages) {
|
||||||
pages[i] = page;
|
pages[i] = page;
|
||||||
|
|
||||||
flush_anon_page(page, start);
|
flush_anon_page(vma, page, start);
|
||||||
flush_dcache_page(page);
|
flush_dcache_page(page);
|
||||||
}
|
}
|
||||||
if (vmas)
|
if (vmas)
|
||||||
|
Loading…
Reference in New Issue
Block a user