* FAILED: patch "[PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases" failed to apply to 4.4-stable tree
@ 2018-09-16 12:11 gregkh
2018-09-16 13:48 ` SZ Lin (林上智)
0 siblings, 1 reply; 4+ messages in thread
From: gregkh @ 2018-09-16 12:11 UTC (permalink / raw)
To: paul.burton, alexandre.belloni, hauke, jhogan, rene.nielsen; +Cc: stable
The patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm
tree, then please email the backport, including the original git commit
id to <stable@vger.kernel.org>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
>From 0f02cfbc3d9e413d450d8d0fd660077c23f67eff Mon Sep 17 00:00:00 2001
From: Paul Burton <paul.burton@mips.com>
Date: Thu, 30 Aug 2018 11:01:21 -0700
Subject: [PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases
When a system suffers from dcache aliasing a user program may observe
stale VDSO data from an aliased cache line. Notably this can break the
expectation that clock_gettime(CLOCK_MONOTONIC, ...) is, as its name
suggests, monotonic.
In order to ensure that users observe updates to the VDSO data page as
intended, align the user mappings of the VDSO data page such that their
cache colouring matches that of the virtual address range which the
kernel will use to update the data page - typically its unmapped address
within kseg0.
This ensures that we don't introduce aliasing cache lines for the VDSO
data page, and therefore that userland will observe updates without
requiring cache invalidation.
Signed-off-by: Paul Burton <paul.burton@mips.com>
Reported-by: Hauke Mehrtens <hauke@hauke-m.de>
Reported-by: Rene Nielsen <rene.nielsen@microsemi.com>
Reported-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Fixes: ebb5e78cc634 ("MIPS: Initial implementation of a VDSO")
Patchwork: https://patchwork.linux-mips.org/patch/20344/
Tested-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Tested-by: Hauke Mehrtens <hauke@hauke-m.de>
Cc: James Hogan <jhogan@kernel.org>
Cc: linux-mips@linux-mips.org
Cc: stable@vger.kernel.org # v4.4+
diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
index 019035d7225c..8f845f6e5f42 100644
--- a/arch/mips/kernel/vdso.c
+++ b/arch/mips/kernel/vdso.c
@@ -13,6 +13,7 @@
#include <linux/err.h>
#include <linux/init.h>
#include <linux/ioport.h>
+#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/slab.h>
@@ -20,6 +21,7 @@
#include <asm/abi.h>
#include <asm/mips-cps.h>
+#include <asm/page.h>
#include <asm/vdso.h>
/* Kernel-provided data used by the VDSO. */
@@ -128,12 +130,30 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
vvar_size = gic_size + PAGE_SIZE;
size = vvar_size + image->size;
+ /*
+ * Find a region that's large enough for us to perform the
+ * colour-matching alignment below.
+ */
+ if (cpu_has_dc_aliases)
+ size += shm_align_mask + 1;
+
base = get_unmapped_area(NULL, 0, size, 0, 0);
if (IS_ERR_VALUE(base)) {
ret = base;
goto out;
}
+ /*
+ * If we suffer from dcache aliasing, ensure that the VDSO data page
+ * mapping is coloured the same as the kernel's mapping of that memory.
+ * This ensures that when the kernel updates the VDSO data userland
+ * will observe it without requiring cache invalidations.
+ */
+ if (cpu_has_dc_aliases) {
+ base = __ALIGN_MASK(base, shm_align_mask);
+ base += ((unsigned long)&vdso_data - gic_size) & shm_align_mask;
+ }
+
data_addr = base + gic_size;
vdso_addr = data_addr + PAGE_SIZE;
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: FAILED: patch "[PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases" failed to apply to 4.4-stable tree
2018-09-16 12:11 FAILED: patch "[PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases" failed to apply to 4.4-stable tree gregkh
@ 2018-09-16 13:48 ` SZ Lin (林上智)
2018-09-17 9:39 ` Greg KH
2018-09-24 11:10 ` Greg KH
0 siblings, 2 replies; 4+ messages in thread
From: SZ Lin (林上智) @ 2018-09-16 13:48 UTC (permalink / raw)
To: Greg KH; +Cc: stable
[-- Attachment #1: Type: text/plain, Size: 3905 bytes --]
Hi,
On Sun, Sep 16, 2018 at 02:11:33PM +0200, gregkh@linuxfoundation.org wrote:
>
> The patch below does not apply to the 4.4-stable tree.
> If someone wants it applied there, or to any other stable or longterm
> tree, then please email the backport, including the original git commit
> id to <stable@vger.kernel.org>.
Please find attached patch 00578cd864d45 ("MIPS: VDSO: Drop gic_get_usm_range() usage")
and apply to {4.4,4.9}-stable tree for solving this conflict.
Thanks!
SZ Lin (林上智)
>
> thanks,
>
> greg k-h
>
> ------------------ original commit in Linus's tree ------------------
>
> From 0f02cfbc3d9e413d450d8d0fd660077c23f67eff Mon Sep 17 00:00:00 2001
> From: Paul Burton <paul.burton@mips.com>
> Date: Thu, 30 Aug 2018 11:01:21 -0700
> Subject: [PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases
>
> When a system suffers from dcache aliasing a user program may observe
> stale VDSO data from an aliased cache line. Notably this can break the
> expectation that clock_gettime(CLOCK_MONOTONIC, ...) is, as its name
> suggests, monotonic.
>
> In order to ensure that users observe updates to the VDSO data page as
> intended, align the user mappings of the VDSO data page such that their
> cache colouring matches that of the virtual address range which the
> kernel will use to update the data page - typically its unmapped address
> within kseg0.
>
> This ensures that we don't introduce aliasing cache lines for the VDSO
> data page, and therefore that userland will observe updates without
> requiring cache invalidation.
>
> Signed-off-by: Paul Burton <paul.burton@mips.com>
> Reported-by: Hauke Mehrtens <hauke@hauke-m.de>
> Reported-by: Rene Nielsen <rene.nielsen@microsemi.com>
> Reported-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> Fixes: ebb5e78cc634 ("MIPS: Initial implementation of a VDSO")
> Patchwork: https://patchwork.linux-mips.org/patch/20344/
> Tested-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> Tested-by: Hauke Mehrtens <hauke@hauke-m.de>
> Cc: James Hogan <jhogan@kernel.org>
> Cc: linux-mips@linux-mips.org
> Cc: stable@vger.kernel.org # v4.4+
>
> diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
> index 019035d7225c..8f845f6e5f42 100644
> --- a/arch/mips/kernel/vdso.c
> +++ b/arch/mips/kernel/vdso.c
> @@ -13,6 +13,7 @@
> #include <linux/err.h>
> #include <linux/init.h>
> #include <linux/ioport.h>
> +#include <linux/kernel.h>
> #include <linux/mm.h>
> #include <linux/sched.h>
> #include <linux/slab.h>
> @@ -20,6 +21,7 @@
>
> #include <asm/abi.h>
> #include <asm/mips-cps.h>
> +#include <asm/page.h>
> #include <asm/vdso.h>
>
> /* Kernel-provided data used by the VDSO. */
> @@ -128,12 +130,30 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
> vvar_size = gic_size + PAGE_SIZE;
> size = vvar_size + image->size;
>
> + /*
> + * Find a region that's large enough for us to perform the
> + * colour-matching alignment below.
> + */
> + if (cpu_has_dc_aliases)
> + size += shm_align_mask + 1;
> +
> base = get_unmapped_area(NULL, 0, size, 0, 0);
> if (IS_ERR_VALUE(base)) {
> ret = base;
> goto out;
> }
>
> + /*
> + * If we suffer from dcache aliasing, ensure that the VDSO data page
> + * mapping is coloured the same as the kernel's mapping of that memory.
> + * This ensures that when the kernel updates the VDSO data userland
> + * will observe it without requiring cache invalidations.
> + */
> + if (cpu_has_dc_aliases) {
> + base = __ALIGN_MASK(base, shm_align_mask);
> + base += ((unsigned long)&vdso_data - gic_size) & shm_align_mask;
> + }
> +
> data_addr = base + gic_size;
> vdso_addr = data_addr + PAGE_SIZE;
>
>
--
SZ Lin (林上智) <szlin@debian.org>, http://people.debian.org/~szlin
Debian Developer, debian.org.tw Administrator
4096R/ 178F 8338 B314 01E3 04FC 44BA A959 B38A 9561 F3F9
[-- Attachment #2: 0001-MIPS-VDSO-Drop-gic_get_usm_range-usage.patch --]
[-- Type: text/x-diff, Size: 2931 bytes --]
>From 890151c23e16a48ad0ba05ff60633234c1934c8b Mon Sep 17 00:00:00 2001
From: Paul Burton <paul.burton@imgtec.com>
Date: Sat, 12 Aug 2017 21:36:30 -0700
Subject: [PATCH] MIPS: VDSO: Drop gic_get_usm_range() usage
commit 00578cd864d45ae4b8fa3f684f8d6f783dd8d15d upstream
We don't really need gic_get_usm_range() to abstract discovery of the
address of the GIC user-visible section now that we have access to its
base address globally.
Switch to calculating it ourselves, which will allow us to stop
requiring the irqchip driver to care about a counter exposed to userland
for use via the VDSO.
Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/17040/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: SZ Lin (林上智) <sz.lin@moxa.com>
---
arch/mips/kernel/vdso.c | 15 +++++----------
1 file changed, 5 insertions(+), 10 deletions(-)
diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
index 5649a9e429e0..1266fd56c919 100644
--- a/arch/mips/kernel/vdso.c
+++ b/arch/mips/kernel/vdso.c
@@ -13,13 +13,13 @@
#include <linux/err.h>
#include <linux/init.h>
#include <linux/ioport.h>
-#include <linux/irqchip/mips-gic.h>
#include <linux/mm.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/timekeeper_internal.h>
#include <asm/abi.h>
+#include <asm/mips-cps.h>
#include <asm/vdso.h>
/* Kernel-provided data used by the VDSO. */
@@ -99,9 +99,8 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
{
struct mips_vdso_image *image = current->thread.abi->vdso;
struct mm_struct *mm = current->mm;
- unsigned long gic_size, vvar_size, size, base, data_addr, vdso_addr;
+ unsigned long gic_size, vvar_size, size, base, data_addr, vdso_addr, gic_pfn;
struct vm_area_struct *vma;
- struct resource gic_res;
int ret;
down_write(&mm->mmap_sem);
@@ -114,7 +113,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
* only map a page even though the total area is 64K, as we only need
* the counter registers at the start.
*/
- gic_size = gic_present ? PAGE_SIZE : 0;
+ gic_size = mips_gic_present() ? PAGE_SIZE : 0;
vvar_size = gic_size + PAGE_SIZE;
size = vvar_size + image->size;
@@ -137,13 +136,9 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
/* Map GIC user page. */
if (gic_size) {
- ret = gic_get_usm_range(&gic_res);
- if (ret)
- goto out;
+ gic_pfn = virt_to_phys(mips_gic_base + MIPS_GIC_USER_OFS) >> PAGE_SHIFT;
- ret = io_remap_pfn_range(vma, base,
- gic_res.start >> PAGE_SHIFT,
- gic_size,
+ ret = io_remap_pfn_range(vma, base, gic_pfn, gic_size,
pgprot_noncached(PAGE_READONLY));
if (ret)
goto out;
--
2.19.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: FAILED: patch "[PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases" failed to apply to 4.4-stable tree
2018-09-16 13:48 ` SZ Lin (林上智)
@ 2018-09-17 9:39 ` Greg KH
2018-09-24 11:10 ` Greg KH
1 sibling, 0 replies; 4+ messages in thread
From: Greg KH @ 2018-09-17 9:39 UTC (permalink / raw)
To: SZ Lin (林上智); +Cc: stable
On Sun, Sep 16, 2018 at 09:48:48PM +0800, SZ Lin (林上智) wrote:
> Hi,
>
> On Sun, Sep 16, 2018 at 02:11:33PM +0200, gregkh@linuxfoundation.org wrote:
> >
> > The patch below does not apply to the 4.4-stable tree.
> > If someone wants it applied there, or to any other stable or longterm
> > tree, then please email the backport, including the original git commit
> > id to <stable@vger.kernel.org>.
>
> Please find attached patch 00578cd864d45 ("MIPS: VDSO: Drop gic_get_usm_range() usage")
> and apply to {4.4,4.9}-stable tree for solving this conflict.
>
> Thanks!
>
> SZ Lin (林上智)
>
> >
> > thanks,
> >
> > greg k-h
> >
> > ------------------ original commit in Linus's tree ------------------
> >
> > From 0f02cfbc3d9e413d450d8d0fd660077c23f67eff Mon Sep 17 00:00:00 2001
> > From: Paul Burton <paul.burton@mips.com>
> > Date: Thu, 30 Aug 2018 11:01:21 -0700
> > Subject: [PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases
> >
> > When a system suffers from dcache aliasing a user program may observe
> > stale VDSO data from an aliased cache line. Notably this can break the
> > expectation that clock_gettime(CLOCK_MONOTONIC, ...) is, as its name
> > suggests, monotonic.
> >
> > In order to ensure that users observe updates to the VDSO data page as
> > intended, align the user mappings of the VDSO data page such that their
> > cache colouring matches that of the virtual address range which the
> > kernel will use to update the data page - typically its unmapped address
> > within kseg0.
> >
> > This ensures that we don't introduce aliasing cache lines for the VDSO
> > data page, and therefore that userland will observe updates without
> > requiring cache invalidation.
> >
> > Signed-off-by: Paul Burton <paul.burton@mips.com>
> > Reported-by: Hauke Mehrtens <hauke@hauke-m.de>
> > Reported-by: Rene Nielsen <rene.nielsen@microsemi.com>
> > Reported-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> > Fixes: ebb5e78cc634 ("MIPS: Initial implementation of a VDSO")
> > Patchwork: https://patchwork.linux-mips.org/patch/20344/
> > Tested-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
> > Tested-by: Hauke Mehrtens <hauke@hauke-m.de>
> > Cc: James Hogan <jhogan@kernel.org>
> > Cc: linux-mips@linux-mips.org
> > Cc: stable@vger.kernel.org # v4.4+
> >
> > diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
> > index 019035d7225c..8f845f6e5f42 100644
> > --- a/arch/mips/kernel/vdso.c
> > +++ b/arch/mips/kernel/vdso.c
> > @@ -13,6 +13,7 @@
> > #include <linux/err.h>
> > #include <linux/init.h>
> > #include <linux/ioport.h>
> > +#include <linux/kernel.h>
> > #include <linux/mm.h>
> > #include <linux/sched.h>
> > #include <linux/slab.h>
> > @@ -20,6 +21,7 @@
> >
> > #include <asm/abi.h>
> > #include <asm/mips-cps.h>
> > +#include <asm/page.h>
> > #include <asm/vdso.h>
> >
> > /* Kernel-provided data used by the VDSO. */
> > @@ -128,12 +130,30 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp)
> > vvar_size = gic_size + PAGE_SIZE;
> > size = vvar_size + image->size;
> >
> > + /*
> > + * Find a region that's large enough for us to perform the
> > + * colour-matching alignment below.
> > + */
> > + if (cpu_has_dc_aliases)
> > + size += shm_align_mask + 1;
> > +
> > base = get_unmapped_area(NULL, 0, size, 0, 0);
> > if (IS_ERR_VALUE(base)) {
> > ret = base;
> > goto out;
> > }
> >
> > + /*
> > + * If we suffer from dcache aliasing, ensure that the VDSO data page
> > + * mapping is coloured the same as the kernel's mapping of that memory.
> > + * This ensures that when the kernel updates the VDSO data userland
> > + * will observe it without requiring cache invalidations.
> > + */
> > + if (cpu_has_dc_aliases) {
> > + base = __ALIGN_MASK(base, shm_align_mask);
> > + base += ((unsigned long)&vdso_data - gic_size) & shm_align_mask;
> > + }
> > +
> > data_addr = base + gic_size;
> > vdso_addr = data_addr + PAGE_SIZE;
> >
> >
>
> --
> SZ Lin (林上智) <szlin@debian.org>, http://people.debian.org/~szlin
>
> Debian Developer, debian.org.tw Administrator
>
> 4096R/ 178F 8338 B314 01E3 04FC 44BA A959 B38A 9561 F3F9
> >From 890151c23e16a48ad0ba05ff60633234c1934c8b Mon Sep 17 00:00:00 2001
> From: Paul Burton <paul.burton@imgtec.com>
> Date: Sat, 12 Aug 2017 21:36:30 -0700
> Subject: [PATCH] MIPS: VDSO: Drop gic_get_usm_range() usage
>
> commit 00578cd864d45ae4b8fa3f684f8d6f783dd8d15d upstream
>
> We don't really need gic_get_usm_range() to abstract discovery of the
> address of the GIC user-visible section now that we have access to its
> base address globally.
>
> Switch to calculating it ourselves, which will allow us to stop
> requiring the irqchip driver to care about a counter exposed to userland
> for use via the VDSO.
>
> Signed-off-by: Paul Burton <paul.burton@imgtec.com>
> Cc: Jason Cooper <jason@lakedaemon.net>
> Cc: Marc Zyngier <marc.zyngier@arm.com>
> Cc: Thomas Gleixner <tglx@linutronix.de>
> Cc: linux-mips@linux-mips.org
> Patchwork: https://patchwork.linux-mips.org/patch/17040/
> Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
> Signed-off-by: SZ Lin (林上智) <sz.lin@moxa.com>
I do not understand. What "bug" is this fixing that this needs to be
backported for?
thanks,
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: FAILED: patch "[PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases" failed to apply to 4.4-stable tree
2018-09-16 13:48 ` SZ Lin (林上智)
2018-09-17 9:39 ` Greg KH
@ 2018-09-24 11:10 ` Greg KH
1 sibling, 0 replies; 4+ messages in thread
From: Greg KH @ 2018-09-24 11:10 UTC (permalink / raw)
To: SZ Lin (林上智); +Cc: stable
On Sun, Sep 16, 2018 at 09:48:48PM +0800, SZ Lin (林上智) wrote:
> Hi,
>
> On Sun, Sep 16, 2018 at 02:11:33PM +0200, gregkh@linuxfoundation.org wrote:
> >
> > The patch below does not apply to the 4.4-stable tree.
> > If someone wants it applied there, or to any other stable or longterm
> > tree, then please email the backport, including the original git commit
> > id to <stable@vger.kernel.org>.
>
> Please find attached patch 00578cd864d45 ("MIPS: VDSO: Drop gic_get_usm_range() usage")
> and apply to {4.4,4.9}-stable tree for solving this conflict.
Now applied, thanks.
greg k-h
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-09-24 17:12 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-09-16 12:11 FAILED: patch "[PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases" failed to apply to 4.4-stable tree gregkh
2018-09-16 13:48 ` SZ Lin (林上智)
2018-09-17 9:39 ` Greg KH
2018-09-24 11:10 ` Greg KH
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).