From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf1-f196.google.com ([209.85.210.196]:34435 "EHLO mail-pf1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728439AbeIPTLz (ORCPT ); Sun, 16 Sep 2018 15:11:55 -0400 Received: by mail-pf1-f196.google.com with SMTP id k19-v6so6350461pfi.1 for ; Sun, 16 Sep 2018 06:48:52 -0700 (PDT) Date: Sun, 16 Sep 2018 21:48:48 +0800 From: SZ Lin =?utf-8?B?KOael+S4iuaZuik=?= To: Greg KH Cc: stable@vger.kernel.org Subject: Re: FAILED: patch "[PATCH] MIPS: VDSO: Match data page cache colouring when D$ aliases" failed to apply to 4.4-stable tree Message-ID: <20180916134848.GA6645@localhost> References: <1537099893232146@kroah.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="NzB8fVQJ5HfG6fxh" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1537099893232146@kroah.com> Sender: stable-owner@vger.kernel.org List-ID: --NzB8fVQJ5HfG6fxh Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit 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 . 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 > 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 > Reported-by: Hauke Mehrtens > Reported-by: Rene Nielsen > Reported-by: Alexandre Belloni > Fixes: ebb5e78cc634 ("MIPS: Initial implementation of a VDSO") > Patchwork: https://patchwork.linux-mips.org/patch/20344/ > Tested-by: Alexandre Belloni > Tested-by: Hauke Mehrtens > Cc: James Hogan > 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 > #include > #include > +#include > #include > #include > #include > @@ -20,6 +21,7 @@ > > #include > #include > +#include > #include > > /* 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 (林上智) , http://people.debian.org/~szlin Debian Developer, debian.org.tw Administrator 4096R/ 178F 8338 B314 01E3 04FC 44BA A959 B38A 9561 F3F9 --NzB8fVQJ5HfG6fxh Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename="0001-MIPS-VDSO-Drop-gic_get_usm_range-usage.patch" Content-Transfer-Encoding: 8bit >>From 890151c23e16a48ad0ba05ff60633234c1934c8b Mon Sep 17 00:00:00 2001 From: Paul Burton 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 Cc: Jason Cooper Cc: Marc Zyngier Cc: Thomas Gleixner Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/17040/ Signed-off-by: Ralf Baechle Signed-off-by: SZ Lin (林上智) --- 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 #include #include -#include #include #include #include #include #include +#include #include /* 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 --NzB8fVQJ5HfG6fxh--