]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.5-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 Jun 2016 01:08:24 +0000 (18:08 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 8 Jun 2016 01:08:24 +0000 (18:08 -0700)
added patches:
mips-flush-highmem-pages-in-__flush_dcache_page.patch

queue-4.5/mips-flush-highmem-pages-in-__flush_dcache_page.patch [new file with mode: 0644]
queue-4.5/mips-handle-highmem-pages-in-__update_cache.patch
queue-4.5/mips-sync-icache-dcache-in-set_pte_at.patch
queue-4.5/series

diff --git a/queue-4.5/mips-flush-highmem-pages-in-__flush_dcache_page.patch b/queue-4.5/mips-flush-highmem-pages-in-__flush_dcache_page.patch
new file mode 100644 (file)
index 0000000..c244dde
--- /dev/null
@@ -0,0 +1,71 @@
+From 234859e49a15323cf1b2331bdde7f658c4cb45fb Mon Sep 17 00:00:00 2001
+From: Paul Burton <paul.burton@imgtec.com>
+Date: Tue, 1 Mar 2016 02:37:57 +0000
+Subject: MIPS: Flush highmem pages in __flush_dcache_page
+
+From: Paul Burton <paul.burton@imgtec.com>
+
+commit 234859e49a15323cf1b2331bdde7f658c4cb45fb upstream.
+
+When flush_dcache_page is called on an executable page, that page is
+about to be provided to userland & we can presume that the icache
+contains no valid entries for its address range. However if the icache
+does not fill from the dcache then we cannot presume that the pages
+content has been written back as far as the memories that the dcache
+will fill from (ie. L2 or further out).
+
+This was being done for lowmem pages, but not for highmem which can lead
+to icache corruption. Fix this by mapping highmem pages & flushing their
+content from the dcache in __flush_dcache_page before providing the page
+to userland, just as is done for lowmem pages.
+
+Signed-off-by: Paul Burton <paul.burton@imgtec.com>
+Cc: Lars Persson <lars.persson@axis.com>
+Cc: Andrew Morton <akpm@linux-foundation.org>
+Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+Cc: linux-mips@linux-mips.org
+Cc: linux-kernel@vger.kernel.org
+Patchwork: https://patchwork.linux-mips.org/patch/12720/
+Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ arch/mips/mm/cache.c |   12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+--- a/arch/mips/mm/cache.c
++++ b/arch/mips/mm/cache.c
+@@ -16,6 +16,7 @@
+ #include <linux/mm.h>
+ #include <asm/cacheflush.h>
++#include <asm/highmem.h>
+ #include <asm/processor.h>
+ #include <asm/cpu.h>
+ #include <asm/cpu-features.h>
+@@ -83,8 +84,6 @@ void __flush_dcache_page(struct page *pa
+       struct address_space *mapping = page_mapping(page);
+       unsigned long addr;
+-      if (PageHighMem(page))
+-              return;
+       if (mapping && !mapping_mapped(mapping)) {
+               SetPageDcacheDirty(page);
+               return;
+@@ -95,8 +94,15 @@ void __flush_dcache_page(struct page *pa
+        * case is for exec env/arg pages and those are %99 certainly going to
+        * get faulted into the tlb (and thus flushed) anyways.
+        */
+-      addr = (unsigned long) page_address(page);
++      if (PageHighMem(page))
++              addr = (unsigned long)kmap_atomic(page);
++      else
++              addr = (unsigned long)page_address(page);
++
+       flush_data_cache_page(addr);
++
++      if (PageHighMem(page))
++              __kunmap_atomic((void *)addr);
+ }
+ EXPORT_SYMBOL(__flush_dcache_page);
index a6e8007926d45ea571de7b7d84404075301a0b00..dee4347cb1c954082a6cc59205d292cc24af04c1 100644 (file)
@@ -30,7 +30,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
 
 --- a/arch/mips/mm/cache.c
 +++ b/arch/mips/mm/cache.c
-@@ -143,9 +143,17 @@ void __update_cache(struct vm_area_struc
+@@ -149,9 +149,17 @@ void __update_cache(struct vm_area_struc
                return;
        page = pfn_to_page(pfn);
        if (page_mapping(page) && Page_dcache_dirty(page)) {
index 2596c485cc05849d1b7c34015a12d6563a241c35..04d062ea8a0f0adbdd616fd48e96175ad7cead9d 100644 (file)
@@ -200,7 +200,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
 --- a/arch/mips/mm/cache.c
 +++ b/arch/mips/mm/cache.c
-@@ -119,30 +119,17 @@ void __flush_anon_page(struct page *page
+@@ -125,30 +125,17 @@ void __flush_anon_page(struct page *page
  
  EXPORT_SYMBOL(__flush_anon_page);
  
index 7d4baef2ef8dbabbd3d510c8a41555f486193343..ee2111db331ea41104fab874606846fc2635c738 100644 (file)
@@ -6,6 +6,7 @@ mips-avoid-using-unwind_stack-with-usermode.patch
 mips-fix-siginfo.h-to-use-strict-posix-types.patch
 mips-fix-uapi-include-in-exported-asm-siginfo.h.patch
 mips-fix-watchpoint-restoration.patch
+mips-flush-highmem-pages-in-__flush_dcache_page.patch
 mips-handle-highmem-pages-in-__update_cache.patch
 mips-sync-icache-dcache-in-set_pte_at.patch
 mips-loongson-3-fix-build-error-after-ld-version.sh-modification.patch