From: Greg Kroah-Hartman Date: Mon, 24 Jan 2022 15:18:55 +0000 (+0100) Subject: 4.14-stable patches X-Git-Tag: v4.4.300~29 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=128a94016d1e26783d72b95ea80272fb244ad858;p=thirdparty%2Fkernel%2Fstable-queue.git 4.14-stable patches added patches: mips-s390-sh-sparc-gup-work-around-the-cow-can-break-either-way-issue.patch --- diff --git a/queue-4.14/mips-s390-sh-sparc-gup-work-around-the-cow-can-break-either-way-issue.patch b/queue-4.14/mips-s390-sh-sparc-gup-work-around-the-cow-can-break-either-way-issue.patch new file mode 100644 index 00000000000..e0688fe3587 --- /dev/null +++ b/queue-4.14/mips-s390-sh-sparc-gup-work-around-the-cow-can-break-either-way-issue.patch @@ -0,0 +1,97 @@ +From ben@decadent.org.uk Mon Jan 24 16:18:27 2022 +From: Ben Hutchings +Date: Mon, 24 Jan 2022 16:11:18 +0100 +Subject: mips,s390,sh,sparc: gup: Work around the "COW can break either way" issue +To: stable@vger.kernel.org +Cc: Suren Baghdasaryan +Message-ID: +Content-Disposition: inline + +From: Ben Hutchings + +In Linux 4.14 and 4.19 these architectures still have their own +implementations of get_user_pages_fast(). These also need to force +the write flag on when taking the fast path. + +Fixes: 407faed92b4a ("gup: document and work around "COW can break either way" issue") +Fixes: 5e24029791e8 ("gup: document and work around "COW can break either way" issue") +Signed-off-by: Ben Hutchings +--- + arch/mips/mm/gup.c | 9 ++++++++- + arch/s390/mm/gup.c | 9 ++++++++- + arch/sh/mm/gup.c | 9 ++++++++- + arch/sparc/mm/gup.c | 9 ++++++++- + 4 files changed, 32 insertions(+), 4 deletions(-) + +--- a/arch/mips/mm/gup.c ++++ b/arch/mips/mm/gup.c +@@ -272,7 +272,14 @@ int get_user_pages_fast(unsigned long st + next = pgd_addr_end(addr, end); + if (pgd_none(pgd)) + goto slow; +- if (!gup_pud_range(pgd, addr, next, write, pages, &nr)) ++ /* ++ * The FAST_GUP case requires FOLL_WRITE even for pure reads, ++ * because get_user_pages() may need to cause an early COW in ++ * order to avoid confusing the normal COW routines. So only ++ * targets that are already writable are safe to do by just ++ * looking at the page tables. ++ */ ++ if (!gup_pud_range(pgd, addr, next, 1, pages, &nr)) + goto slow; + } while (pgdp++, addr = next, addr != end); + local_irq_enable(); +--- a/arch/s390/mm/gup.c ++++ b/arch/s390/mm/gup.c +@@ -285,7 +285,14 @@ int get_user_pages_fast(unsigned long st + + might_sleep(); + start &= PAGE_MASK; +- nr = __get_user_pages_fast(start, nr_pages, write, pages); ++ /* ++ * The FAST_GUP case requires FOLL_WRITE even for pure reads, ++ * because get_user_pages() may need to cause an early COW in ++ * order to avoid confusing the normal COW routines. So only ++ * targets that are already writable are safe to do by just ++ * looking at the page tables. ++ */ ++ nr = __get_user_pages_fast(start, nr_pages, 1, pages); + if (nr == nr_pages) + return nr; + +--- a/arch/sh/mm/gup.c ++++ b/arch/sh/mm/gup.c +@@ -240,7 +240,14 @@ int get_user_pages_fast(unsigned long st + next = pgd_addr_end(addr, end); + if (pgd_none(pgd)) + goto slow; +- if (!gup_pud_range(pgd, addr, next, write, pages, &nr)) ++ /* ++ * The FAST_GUP case requires FOLL_WRITE even for pure reads, ++ * because get_user_pages() may need to cause an early COW in ++ * order to avoid confusing the normal COW routines. So only ++ * targets that are already writable are safe to do by just ++ * looking at the page tables. ++ */ ++ if (!gup_pud_range(pgd, addr, next, 1, pages, &nr)) + goto slow; + } while (pgdp++, addr = next, addr != end); + local_irq_enable(); +--- a/arch/sparc/mm/gup.c ++++ b/arch/sparc/mm/gup.c +@@ -262,7 +262,14 @@ int get_user_pages_fast(unsigned long st + next = pgd_addr_end(addr, end); + if (pgd_none(pgd)) + goto slow; +- if (!gup_pud_range(pgd, addr, next, write, pages, &nr)) ++ /* ++ * The FAST_GUP case requires FOLL_WRITE even for pure reads, ++ * because get_user_pages() may need to cause an early COW in ++ * order to avoid confusing the normal COW routines. So only ++ * targets that are already writable are safe to do by just ++ * looking at the page tables. ++ */ ++ if (!gup_pud_range(pgd, addr, next, 1, pages, &nr)) + goto slow; + } while (pgdp++, addr = next, addr != end); + diff --git a/queue-4.14/series b/queue-4.14/series index e6c58957d3e..c8135259c9a 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -180,3 +180,4 @@ net_sched-restore-mpu-xxx-handling.patch bcmgenet-add-wol-irq-check.patch scripts-dtc-dtx_diff-remove-broken-example-from-help-text.patch lib82596-fix-irq-check-in-sni_82596_probe.patch +mips-s390-sh-sparc-gup-work-around-the-cow-can-break-either-way-issue.patch