From: <gregkh@linuxfoundation.org>
To: ralf@linux-mips.org, gregkh@linuxfoundation.org, larper@axis.com,
lars.persson@axis.com
Cc: <stable@vger.kernel.org>, <stable-commits@vger.kernel.org>
Subject: Patch "MIPS: Fix race condition in lazy cache flushing." has been added to the 4.0-stable tree
Date: Fri, 08 May 2015 16:43:19 +0200 [thread overview]
Message-ID: <1431096199133187@kroah.com> (raw)
In-Reply-To: <f751d1abbb63d80e96cadcb06f7c527457cab01c.1431087908.git.ralf@linux-mips.org>
This is a note to let you know that I've just added the patch titled
MIPS: Fix race condition in lazy cache flushing.
to the 4.0-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mips-fix-race-condition-in-lazy-cache-flushing.patch
and it can be found in the queue-4.0 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@vger.kernel.org> know about it.
>From ralf@linux-mips.org Fri May 8 16:24:43 2015
From: Ralf Baechle <ralf@linux-mips.org>
Date: Thu, 26 Feb 2015 14:16:03 +0100
Subject: MIPS: Fix race condition in lazy cache flushing.
To: stable@vger.kernel.org
Message-ID: <f751d1abbb63d80e96cadcb06f7c527457cab01c.1431087908.git.ralf@linux-mips.org>
From: Lars Persson <lars.persson@axis.com>
Commit 4d46a67a3eb827ccf1125959936fd51ba318dabc upstream.
The lazy cache flushing implemented in the MIPS kernel suffers from a
race condition that is exposed by do_set_pte() in mm/memory.c.
A pre-condition is a file-system that writes to the page from the CPU
in its readpage method and then calls flush_dcache_page(). One example
is ubifs. Another pre-condition is that the dcache flush is postponed
in __flush_dcache_page().
Upon a page fault for an executable mapping not existing in the
page-cache, the following will happen:
1. Write to the page
2. flush_dcache_page
3. flush_icache_page
4. set_pte_at
5. update_mmu_cache (commits the flush of a dcache-dirty page)
Between steps 4 and 5 another thread can hit the same page and it will
encounter a valid pte. Because the data still is in the L1 dcache the CPU
will fetch stale data from L2 into the icache and execute garbage.
This fix moves the commit of the cache flush to step 3 to close the
race window. It also reduces the amount of flushes on non-executable
mappings because we never enter __flush_dcache_page() for non-aliasing
CPUs.
Regressions can occur in drivers that mistakenly relies on the
flush_dcache_page() in get_user_pages() for DMA operations.
[ralf@linux-mips.org: Folded in patch 9346 to fix highmem issue.]
Signed-off-by: Lars Persson <larper@axis.com>
Cc: linux-mips@linux-mips.org
Cc: paul.burton@imgtec.com
Cc: linux-kernel@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/9346/
Patchwork: https://patchwork.linux-mips.org/patch/9738/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
arch/mips/include/asm/cacheflush.h | 38 ++++++++++++++++++++++---------------
arch/mips/mm/cache.c | 12 +++++++++++
2 files changed, 35 insertions(+), 15 deletions(-)
--- a/arch/mips/include/asm/cacheflush.h
+++ b/arch/mips/include/asm/cacheflush.h
@@ -29,6 +29,20 @@
* - flush_icache_all() flush the entire instruction cache
* - flush_data_cache_page() flushes a page from the data cache
*/
+
+ /*
+ * This flag is used to indicate that the page pointed to by a pte
+ * is dirty and requires cleaning before returning it to the user.
+ */
+#define PG_dcache_dirty PG_arch_1
+
+#define Page_dcache_dirty(page) \
+ test_bit(PG_dcache_dirty, &(page)->flags)
+#define SetPageDcacheDirty(page) \
+ set_bit(PG_dcache_dirty, &(page)->flags)
+#define ClearPageDcacheDirty(page) \
+ clear_bit(PG_dcache_dirty, &(page)->flags)
+
extern void (*flush_cache_all)(void);
extern void (*__flush_cache_all)(void);
extern void (*flush_cache_mm)(struct mm_struct *mm);
@@ -37,13 +51,15 @@ extern void (*flush_cache_range)(struct
unsigned long start, unsigned long end);
extern void (*flush_cache_page)(struct vm_area_struct *vma, unsigned long page, unsigned long pfn);
extern void __flush_dcache_page(struct page *page);
+extern void __flush_icache_page(struct vm_area_struct *vma, struct page *page);
#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
static inline void flush_dcache_page(struct page *page)
{
- if (cpu_has_dc_aliases || !cpu_has_ic_fills_f_dc)
+ if (cpu_has_dc_aliases)
__flush_dcache_page(page);
-
+ else if (!cpu_has_ic_fills_f_dc)
+ SetPageDcacheDirty(page);
}
#define flush_dcache_mmap_lock(mapping) do { } while (0)
@@ -61,6 +77,11 @@ static inline void flush_anon_page(struc
static inline void flush_icache_page(struct vm_area_struct *vma,
struct page *page)
{
+ if (!cpu_has_ic_fills_f_dc && (vma->vm_flags & VM_EXEC) &&
+ Page_dcache_dirty(page)) {
+ __flush_icache_page(vma, page);
+ ClearPageDcacheDirty(page);
+ }
}
extern void (*flush_icache_range)(unsigned long start, unsigned long end);
@@ -95,19 +116,6 @@ extern void (*flush_icache_all)(void);
extern void (*local_flush_data_cache_page)(void * addr);
extern void (*flush_data_cache_page)(unsigned long addr);
-/*
- * This flag is used to indicate that the page pointed to by a pte
- * is dirty and requires cleaning before returning it to the user.
- */
-#define PG_dcache_dirty PG_arch_1
-
-#define Page_dcache_dirty(page) \
- test_bit(PG_dcache_dirty, &(page)->flags)
-#define SetPageDcacheDirty(page) \
- set_bit(PG_dcache_dirty, &(page)->flags)
-#define ClearPageDcacheDirty(page) \
- clear_bit(PG_dcache_dirty, &(page)->flags)
-
/* Run kernel code uncached, useful for cache probing functions. */
unsigned long run_uncached(void *func);
--- a/arch/mips/mm/cache.c
+++ b/arch/mips/mm/cache.c
@@ -119,6 +119,18 @@ void __flush_anon_page(struct page *page
EXPORT_SYMBOL(__flush_anon_page);
+void __flush_icache_page(struct vm_area_struct *vma, struct page *page)
+{
+ unsigned long addr;
+
+ if (PageHighMem(page))
+ return;
+
+ addr = (unsigned long) page_address(page);
+ flush_data_cache_page(addr);
+}
+EXPORT_SYMBOL_GPL(__flush_icache_page);
+
void __update_cache(struct vm_area_struct *vma, unsigned long address,
pte_t pte)
{
Patches currently in stable-queue which might be from ralf@linux-mips.org are
queue-4.0/mips-octeon-remove-udelay-causing-huge-irq-latency.patch
queue-4.0/mips-makefile-fix-mips-ase-detection-code.patch
queue-4.0/mips-r4kcache-use-correct-base-register-for-mips-r6-cache-flushes.patch
queue-4.0/mips-fix-cpu_has_mips_r2_exec_hazard.patch
queue-4.0/mips-ralink-fix-bad-config-symbol-in-pci-makefile.patch
queue-4.0/revert-mips-remove-race-window-in-page-fault-handling.patch
queue-4.0/mips-fix-race-condition-in-lazy-cache-flushing.patch
queue-4.0/mips-bcm63xx-move-bcm63xx_gpio_init-to-bcm63xx_register_devices.patch
queue-4.0/mips-octeon-delete-override-of-cpu_has_mips_r2_exec_hazard.patch
queue-4.0/mips-asm-spinlock-fix-addiu-instruction-for-r10000_llsc_war-case.patch
queue-4.0/mips-kconfig-disable-smp-cps-for-64-bit.patch
queue-4.0/mips-bcm47xx-fix-detecting-microsoft-mn-700-asus-wl500g.patch
queue-4.0/mips-octeon-use-correct-csr-to-soft-reset.patch
queue-4.0/revert-mips-avoid-pipeline-stalls-on-some-mips32r2-cores.patch
queue-4.0/mips-octeon-dma-octeon-fix-ohci-usb-config-check.patch
queue-4.0/mips-octeon-fix-pci-interrupt-mapping-for-d-link-dsr-1000n.patch
queue-4.0/mips-kconfig-fix-typo-for-the-r2-to-r6-emulator-kernel-parameter.patch
queue-4.0/ssb-fix-kconfig-dependencies.patch
queue-4.0/mips-kernel-entry.s-set-correct-isa-level-for-mips_ihb.patch
queue-4.0/mips-netlogic-fix-for-sata-phy-init.patch
queue-4.0/mips-ralink-add-missing-symbol-for-ralink_ill_acc.patch
queue-4.0/mips-asm-elf-set-o32-default-fpu-flags.patch
queue-4.0/mips-smp-cps-cpu_set-fpu-mask-if-fpu-present.patch
next prev parent reply other threads:[~2015-05-08 14:43 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-08 12:25 [PATCH v2 00/23] MIPS and SSB fixes for 4.0-stable Ralf Baechle
2014-11-25 9:15 ` [PATCH v2 20/23] MIPS: Kconfig: Disable SMP/CPS for 64-bit Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: Kconfig: Disable SMP/CPS for 64-bit" has been added to the 4.0-stable tree gregkh
2015-01-07 11:28 ` [PATCH v2 08/23] MIPS: Netlogic: Fix for SATA PHY init Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: Netlogic: Fix for SATA PHY init" has been added to the 4.0-stable tree gregkh
2015-01-15 15:41 ` [PATCH v2 19/23] MIPS: smp-cps: cpu_set FPU mask if FPU present Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: smp-cps: cpu_set FPU mask if FPU present" has been added to the 4.0-stable tree gregkh
2015-02-23 5:17 ` [PATCH v2 17/23] MIPS: ralink: Fix bad config symbol in PCI makefile Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: ralink: Fix bad config symbol in PCI makefile." has been added to the 4.0-stable tree gregkh
2015-02-23 5:17 ` [PATCH v2 18/23] MIPS: ralink: add missing symbol for RALINK_ILL_ACC Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: ralink: add missing symbol for RALINK_ILL_ACC" has been added to the 4.0-stable tree gregkh
2015-02-26 11:11 ` [PATCH v2 22/23] MIPS: asm: elf: Set O32 default FPU flags Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: asm: elf: Set O32 default FPU flags" has been added to the 4.0-stable tree gregkh
2015-02-26 13:16 ` [PATCH v2 04/23] Revert "MIPS: Remove race window in page fault handling" Ralf Baechle
2015-05-08 14:43 ` Patch "Revert "MIPS: Remove race window in page fault handling"" has been added to the 4.0-stable tree gregkh
2015-02-26 13:16 ` [PATCH v2 05/23] MIPS: Fix race condition in lazy cache flushing Ralf Baechle
2015-05-08 14:43 ` gregkh [this message]
2015-08-01 21:16 ` Ben Hutchings
2015-03-03 18:48 ` [PATCH v2 10/23] MIPS: r4kcache: Use correct base register for MIPS R6 cache flushes Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: r4kcache: Use correct base register for MIPS R6 cache flushes" has been added to the 4.0-stable tree gregkh
2015-03-03 18:48 ` [PATCH v2 11/23] MIPS: asm: spinlock: Fix addiu instruction for R10000_LLSC_WAR case Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: asm: spinlock: Fix addiu instruction for R10000_LLSC_WAR case" has been added to the 4.0-stable tree gregkh
2015-03-03 18:48 ` [PATCH v2 12/23] MIPS: kernel: entry.S: Set correct ISA level for mips_ihb Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: kernel: entry.S: Set correct ISA level for mips_ihb" has been added to the 4.0-stable tree gregkh
2015-03-04 21:08 ` [PATCH v2 02/23] MIPS: OCTEON: dma-octeon: fix OHCI USB config check Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: OCTEON: dma-octeon: fix OHCI USB config check" has been added to the 4.0-stable tree gregkh
2015-03-06 11:02 ` [PATCH v2 03/23] MIPS: OCTEON: Use correct CSR to soft reset Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: OCTEON: Use correct CSR to soft reset" has been added to the 4.0-stable tree gregkh
2015-03-10 12:30 ` [PATCH v2 09/23] MIPS: Kconfig: Fix typo for the r2-to-r6 emulator kernel parameter Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: Kconfig: Fix typo for the r2-to-r6 emulator kernel parameter" has been added to the 4.0-stable tree gregkh
2015-03-12 16:00 ` [PATCH v2 01/23] MIPS: BCM63xx: Move bcm63xx_gpio_init() to bcm63xx_register_devices() Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: BCM63xx: Move bcm63xx_gpio_init() to bcm63xx_register_devices()." has been added to the 4.0-stable tree gregkh
2015-03-18 13:05 ` [PATCH v2 06/23] MIPS: Octeon: Remove udelay() causing huge IRQ latency Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: Octeon: Remove udelay() causing huge IRQ latency" has been added to the 4.0-stable tree gregkh
2015-08-01 21:17 ` [PATCH v2 06/23] MIPS: Octeon: Remove udelay() causing huge IRQ latency Ben Hutchings
2015-03-22 15:55 ` [PATCH v2 07/23] MIPS: OCTEON: fix PCI interrupt mapping for D-Link DSR-1000N Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: OCTEON: fix PCI interrupt mapping for D-Link DSR-1000N" has been added to the 4.0-stable tree gregkh
2015-03-25 12:14 ` [PATCH v2 13/23] MIPS: Fix cpu_has_mips_r2_exec_hazard Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: Fix cpu_has_mips_r2_exec_hazard." has been added to the 4.0-stable tree gregkh
2015-08-01 21:17 ` [PATCH v2 13/23] MIPS: Fix cpu_has_mips_r2_exec_hazard Ben Hutchings
2015-03-25 12:18 ` [PATCH v2 15/23] Revert "MIPS: Avoid pipeline stalls on some MIPS32R2 cores." Ralf Baechle
2015-05-08 14:43 ` Patch "Revert "MIPS: Avoid pipeline stalls on some MIPS32R2 cores."" has been added to the 4.0-stable tree gregkh
2015-03-25 12:21 ` [PATCH v2 14/23] MIPS: Octeon: Delete override of cpu_has_mips_r2_exec_hazard Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: Octeon: Delete override of cpu_has_mips_r2_exec_hazard." has been added to the 4.0-stable tree gregkh
2015-08-01 21:18 ` [PATCH v2 14/23] MIPS: Octeon: Delete override of cpu_has_mips_r2_exec_hazard Ben Hutchings
2015-03-25 15:31 ` [PATCH v2 16/23] SSB: fix Kconfig dependencies Ralf Baechle
2015-05-08 14:43 ` Patch "SSB: fix Kconfig dependencies" has been added to the 4.0-stable tree gregkh
2015-04-01 14:01 ` [PATCH v2 21/23] MIPS: BCM47XX: Fix detecting Microsoft MN-700 & Asus WL500G Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: BCM47XX: Fix detecting Microsoft MN-700 & Asus WL500G" has been added to the 4.0-stable tree gregkh
2015-04-02 13:42 ` [PATCH v2 23/23] MIPS: Makefile: Fix MIPS ASE detection code Ralf Baechle
2015-05-08 14:43 ` Patch "MIPS: Makefile: Fix MIPS ASE detection code" has been added to the 4.0-stable tree gregkh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1431096199133187@kroah.com \
--to=gregkh@linuxfoundation.org \
--cc=larper@axis.com \
--cc=lars.persson@axis.com \
--cc=ralf@linux-mips.org \
--cc=stable-commits@vger.kernel.org \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).