From: Kevin Darbyshire-Bryant Date: Sun, 4 Nov 2018 20:25:46 +0000 (+0000) Subject: kernel: drop MIPS fix cache flushing for highmem pages X-Git-Tag: v19.07.0-rc1~1800 X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=8ff0dd57bffbb1be5799be3ff049df34211669df;p=openwrt%2Fopenwrt.git kernel: drop MIPS fix cache flushing for highmem pages This patch, in a variety of forms, has been around since beginning 2016 as e756c2bb07, ending up in present form 0aa6c7df60 (kernel 4.4.13 bump) and carried forward ever since. There have been a number of MIPS kernel memory handling changes since, including VDSO fixes that meant openwrt patches have been dropped with no apparent fallout. Simple tests (ntfs-3g) on a HIGHMEM 512MB mt7621 device have not turned up data corruption issues which would otherwise be expected. Similarly running on other MIPS based devices for the past 2 months hasn't turned up anything obvious to retain this out of tree patch. With thanks to Rosen Penev for testing on the known 'highmem' device and Felix Fietkau for testing advice. Not putting acked-by as it's my fault if it breaks :-) Signed-off-by: Kevin Darbyshire-Bryant --- diff --git a/target/linux/generic/pending-4.14/100-MIPS-fix-cache-flushing-for-highmem-pages.patch b/target/linux/generic/pending-4.14/100-MIPS-fix-cache-flushing-for-highmem-pages.patch deleted file mode 100644 index b1c65f7cd8..0000000000 --- a/target/linux/generic/pending-4.14/100-MIPS-fix-cache-flushing-for-highmem-pages.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Felix Fietkau -Subject: MIPS: fix cache flushing for highmem pages - -Most cache flush ops were no-op for highmem pages. This led to nasty -segfaults and (in the case of page_address(page) == NULL) kernel -crashes. - -Fix this by always flushing highmem pages using kmap/kunmap_atomic -around the actual cache flush. This might be a bit inefficient, but at -least it's stable. - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/mips/mm/cache.c -+++ b/arch/mips/mm/cache.c -@@ -116,6 +116,13 @@ void __flush_anon_page(struct page *page - { - unsigned long addr = (unsigned long) page_address(page); - -+ if (PageHighMem(page)) { -+ addr = (unsigned long)kmap_atomic(page); -+ flush_data_cache_page(addr); -+ __kunmap_atomic((void *)addr); -+ return; -+ } -+ - if (pages_do_alias(addr, vmaddr)) { - if (page_mapcount(page) && !Page_dcache_dirty(page)) { - void *kaddr; diff --git a/target/linux/generic/pending-4.19/100-MIPS-fix-cache-flushing-for-highmem-pages.patch b/target/linux/generic/pending-4.19/100-MIPS-fix-cache-flushing-for-highmem-pages.patch deleted file mode 100644 index b1c65f7cd8..0000000000 --- a/target/linux/generic/pending-4.19/100-MIPS-fix-cache-flushing-for-highmem-pages.patch +++ /dev/null @@ -1,30 +0,0 @@ -From: Felix Fietkau -Subject: MIPS: fix cache flushing for highmem pages - -Most cache flush ops were no-op for highmem pages. This led to nasty -segfaults and (in the case of page_address(page) == NULL) kernel -crashes. - -Fix this by always flushing highmem pages using kmap/kunmap_atomic -around the actual cache flush. This might be a bit inefficient, but at -least it's stable. - -Signed-off-by: Felix Fietkau ---- - ---- a/arch/mips/mm/cache.c -+++ b/arch/mips/mm/cache.c -@@ -116,6 +116,13 @@ void __flush_anon_page(struct page *page - { - unsigned long addr = (unsigned long) page_address(page); - -+ if (PageHighMem(page)) { -+ addr = (unsigned long)kmap_atomic(page); -+ flush_data_cache_page(addr); -+ __kunmap_atomic((void *)addr); -+ return; -+ } -+ - if (pages_do_alias(addr, vmaddr)) { - if (page_mapcount(page) && !Page_dcache_dirty(page)) { - void *kaddr;