Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a6f36be3 authored by Russell King's avatar Russell King Committed by Russell King
Browse files

[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: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent e47c222b
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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)