diff mbox series

[OpenWrt-Devel,RFC] kernel: drop MIPS: fix cache flushing for highmem pages

Message ID 20181218103420.38148-1-ldir@darbyshire-bryant.me.uk
State Accepted
Headers show
Series [OpenWrt-Devel,RFC] kernel: drop MIPS: fix cache flushing for highmem pages | expand

Commit Message

Kevin 'ldir' Darbyshire-Bryant Dec. 18, 2018, 10:34 a.m. UTC
Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
---

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.

I'm basically wondering if this patch needs to still exist in the kernel
4.14.88 world?  I have been running without this patch for 3+ months on
Archer C7 v2 with no obvious ill effects (I'd expect to see "nasty
segfaults and kernel crashes")

If it does still need to exist, should it go upstream?

Thoughts, comments, more testers?


 ...fix-cache-flushing-for-highmem-pages.patch | 30 -------------------
 1 file changed, 30 deletions(-)
 delete mode 100644 target/linux/generic/pending-4.14/100-MIPS-fix-cache-flushing-for-highmem-pages.patch

Comments

Rosen Penev Dec. 18, 2018, 4:43 p.m. UTC | #1
On Tue, Dec 18, 2018 at 2:35 AM Kevin 'ldir' Darbyshire-Bryant
<ldir@darbyshire-bryant.me.uk> wrote:
>
> Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
> ---
>
> 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.
>
> I'm basically wondering if this patch needs to still exist in the kernel
> 4.14.88 world?  I have been running without this patch for 3+ months on
> Archer C7 v2 with no obvious ill effects (I'd expect to see "nasty
> segfaults and kernel crashes")
>
> If it does still need to exist, should it go upstream?
>
> Thoughts, comments, more testers?
I've tested removing the patch on a 512MB mt7621 device where HIGHMEM
is used for the second 256MB. No issues.
>
>
>  ...fix-cache-flushing-for-highmem-pages.patch | 30 -------------------
>  1 file changed, 30 deletions(-)
>  delete mode 100644 target/linux/generic/pending-4.14/100-MIPS-fix-cache-flushing-for-highmem-pages.patch
>
> 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 <nbd@nbd.name>
> -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 <nbd@nbd.name>
> ----
> -
> ---- 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;
> --
> 2.17.2 (Apple Git-113)
>
>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
Felix Fietkau Dec. 19, 2018, 9:57 a.m. UTC | #2
On 2018-12-18 17:43, Rosen Penev wrote:
> On Tue, Dec 18, 2018 at 2:35 AM Kevin 'ldir' Darbyshire-Bryant
> <ldir@darbyshire-bryant.me.uk> wrote:
>>
>> Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk>
>> ---
>>
>> 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.
>>
>> I'm basically wondering if this patch needs to still exist in the kernel
>> 4.14.88 world?  I have been running without this patch for 3+ months on
>> Archer C7 v2 with no obvious ill effects (I'd expect to see "nasty
>> segfaults and kernel crashes")
>>
>> If it does still need to exist, should it go upstream?
>>
>> Thoughts, comments, more testers?
> I've tested removing the patch on a 512MB mt7621 device where HIGHMEM
> is used for the second 256MB. No issues.
I think to be on the safe side we should test running fuse (ntfs-3g or
sshfs or something similar) on such a device. If that doesn't turn up
any weird hangs or data corruption within a few minutes of use, I'm all
for dropping this patch.

Thanks,

- Felix
Kevin 'ldir' Darbyshire-Bryant Dec. 19, 2018, 5:54 p.m. UTC | #3
> On 19 Dec 2018, at 09:57, Felix Fietkau <nbd@nbd.name> wrote:
> 
> On 2018-12-18 17:43, Rosen Penev wrote:
>>> 
>> I've tested removing the patch on a 512MB mt7621 device where HIGHMEM
>> is used for the second 256MB. No issues.
> I think to be on the safe side we should test running fuse (ntfs-3g or
> sshfs or something similar) on such a device. If that doesn't turn up
> any weird hangs or data corruption within a few minutes of use, I'm all
> for dropping this patch.
> 

Rosen, is that something you could take a closer look at with your 512MB device?

Kevin
Rosen Penev Dec. 19, 2018, 10:54 p.m. UTC | #4
On Wed, Dec 19, 2018 at 9:54 AM Kevin 'ldir' Darbyshire-Bryant
<ldir@darbyshire-bryant.me.uk> wrote:
>
>
>
> > On 19 Dec 2018, at 09:57, Felix Fietkau <nbd@nbd.name> wrote:
> >
> > On 2018-12-18 17:43, Rosen Penev wrote:
> >>>
> >> I've tested removing the patch on a 512MB mt7621 device where HIGHMEM
> >> is used for the second 256MB. No issues.
> > I think to be on the safe side we should test running fuse (ntfs-3g or
> > sshfs or something similar) on such a device. If that doesn't turn up
> > any weird hangs or data corruption within a few minutes of use, I'm all
> > for dropping this patch.
> >
>
> Rosen, is that something you could take a closer look at with your 512MB device?
Just ran a sha256sum on a video file followed by a 10 minute dd read
of the whole drive(interrupted) followed by another sha256sum.

They check out. This was on an ntfs formatted drive mounted by ntfs-3g.
>
> Kevin
diff mbox series

Patch

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 <nbd@nbd.name>
-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 <nbd@nbd.name>
----
-
---- 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;