stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <Alexander.Levin@microsoft.com>
To: "stable@vger.kernel.org" <stable@vger.kernel.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Cc: Paul Burton <paul.burton@imgtec.com>,
	"linux-mips@linux-mips.org" <linux-mips@linux-mips.org>,
	Ralf Baechle <ralf@linux-mips.org>,
	Sasha Levin <Alexander.Levin@microsoft.com>
Subject: [PATCH AUTOSEL for 3.18 056/101] MIPS: Handle tlbex-tlbp race condition
Date: Mon, 9 Apr 2018 00:41:20 +0000	[thread overview]
Message-ID: <20180409004042.164920-6-alexander.levin@microsoft.com> (raw)
In-Reply-To: <20180409004042.164920-1-alexander.levin@microsoft.com>

From: Paul Burton <paul.burton@imgtec.com>

[ Upstream commit f39878cc5b09c75d35eaf52131e920b872e3feb4 ]

In systems where there are multiple actors updating the TLB, the
potential exists for a race condition wherein a CPU hits a TLB exception
but by the time it reaches a TLBP instruction the affected TLB entry may
have been replaced. This can happen if, for example, a CPU shares the
TLB between hardware threads (VPs) within a core and one of them
replaces the entry that another has just taken a TLB exception for.

We handle this race in the case of the Hardware Table Walker (HTW) being
the other actor already, but didn't take into account the potential for
multiple threads racing. Include the code for aborting TLB exception
handling in affected multi-threaded systems, those being the I6400 &
I6500 CPUs which share TLB entries between VPs.

In the case of using RiXi without dedicated exceptions we have never
handled this race even for HTW. This patch adds WARN()s to these cases
which ought never to be hit because all CPUs with either HTW or shared
FTLB RAMs also include dedicated RiXi exceptions, but the WARN()s will
ensure this is always the case.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/16203/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
---
 arch/mips/mm/tlbex.c | 38 +++++++++++++++++++++++++++++++++++++-
 1 file changed, 37 insertions(+), 1 deletion(-)

diff --git a/arch/mips/mm/tlbex.c b/arch/mips/mm/tlbex.c
index e3328a96e809..4be16c81be9f 100644
--- a/arch/mips/mm/tlbex.c
+++ b/arch/mips/mm/tlbex.c
@@ -1838,6 +1838,26 @@ static void build_r3000_tlb_modify_handler(void)
 }
 #endif /* CONFIG_MIPS_PGD_C0_CONTEXT */
 
+static bool cpu_has_tlbex_tlbp_race(void)
+{
+	/*
+	 * When a Hardware Table Walker is running it can replace TLB entries
+	 * at any time, leading to a race between it & the CPU.
+	 */
+	if (cpu_has_htw)
+		return true;
+
+	/*
+	 * If the CPU shares FTLB RAM with its siblings then our entry may be
+	 * replaced at any time by a sibling performing a write to the FTLB.
+	 */
+	if (cpu_has_shared_ftlb_ram)
+		return true;
+
+	/* In all other cases there ought to be no race condition to handle */
+	return false;
+}
+
 /*
  * R4000 style TLB load/store/modify handlers.
  */
@@ -1874,7 +1894,7 @@ build_r4000_tlbchange_handler_head(u32 **p, struct uasm_label **l,
 	iPTE_LW(p, wr.r1, wr.r2); /* get even pte */
 	if (!m4kc_tlbp_war()) {
 		build_tlb_probe_entry(p);
-		if (cpu_has_htw) {
+		if (cpu_has_tlbex_tlbp_race()) {
 			/* race condition happens, leaving */
 			uasm_i_ehb(p);
 			uasm_i_mfc0(p, wr.r3, C0_INDEX);
@@ -1948,6 +1968,14 @@ static void build_r4000_tlb_load_handler(void)
 		}
 		uasm_i_nop(&p);
 
+		/*
+		 * Warn if something may race with us & replace the TLB entry
+		 * before we read it here. Everything with such races should
+		 * also have dedicated RiXi exception handlers, so this
+		 * shouldn't be hit.
+		 */
+		WARN(cpu_has_tlbex_tlbp_race(), "Unhandled race in RiXi path");
+
 		uasm_i_tlbr(&p);
 
 		switch (current_cpu_type()) {
@@ -2015,6 +2043,14 @@ static void build_r4000_tlb_load_handler(void)
 		}
 		uasm_i_nop(&p);
 
+		/*
+		 * Warn if something may race with us & replace the TLB entry
+		 * before we read it here. Everything with such races should
+		 * also have dedicated RiXi exception handlers, so this
+		 * shouldn't be hit.
+		 */
+		WARN(cpu_has_tlbex_tlbp_race(), "Unhandled race in RiXi path");
+
 		uasm_i_tlbr(&p);
 
 		switch (current_cpu_type()) {
-- 
2.15.1

  parent reply	other threads:[~2018-04-09  0:41 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-09  0:41 [PATCH AUTOSEL for 3.18 051/101] scsi: sun_esp: fix device reference leaks Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 052/101] powerpc/fadump: avoid duplicates in crash memory ranges Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 053/101] libertas: Fix lbs_prb_rsp_limit_set() Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 055/101] MIPS: CPS: Prevent multi-core with dcache aliasing Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 054/101] PCI: Enable ECRC only if device supports it Sasha Levin
2018-04-09  0:41 ` Sasha Levin [this message]
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 057/101] arm64: ptrace: Avoid setting compat FP[SC]R to garbage if get_user fails Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 058/101] arm64: ptrace: Fix incorrect get_user() use in compat_vfp_set() Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 059/101] x86/um: thin archives build fix Sasha Levin
2018-04-09  4:29   ` Nicholas Piggin
2018-04-15 15:02     ` Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 060/101] fs: warn in case userspace lied about modprobe return Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 061/101] ext4: change fast symlink test to not rely on i_blocks Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 062/101] irqchip/gic-v3: Honor forced affinity setting Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 064/101] firewire-ohci: work around oversized DMA reads on JMicron controllers Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 063/101] vmlfb: Fix error handling in cr_pll_init() Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 065/101] ASoC: au1x: Fix timeout tests in au1xac97c_ac97_read() Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 066/101] kvm: x86: fix KVM_XEN_HVM_CONFIG ioctl Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 067/101] tracing/hrtimer: Fix tracing bugs by taking all clock bases and modes into account Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 068/101] PCI: Add function 1 DMA alias quirk for Marvell 9128 Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 070/101] dm thin: fix documentation relative to low water mark threshold Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 069/101] tools lib traceevent: Fix get_field_str() for dynamic strings Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 071/101] nfs: Do not convert nfs_idmap_cache_timeout to jiffies Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 072/101] watchdog: sp5100_tco: Fix watchdog disable bit Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 073/101] kconfig: Don't leak main menus during parsing Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 074/101] kconfig: Fix automatic menu creation mem leak Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 075/101] kconfig: Fix expr_free() E_NOT leak Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 076/101] btrfs: Fix out of bounds access in btrfs_search_slot Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 077/101] scsi: devinfo: fix format of the device list Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 078/101] scsi: fas216: fix sense buffer initialization Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 080/101] jffs2: Fix use-after-free bug in jffs2_iget()'s error handling path Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 079/101] HID: roccat: prevent an out of bounds read in kovaplus_profile_activated() Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 081/101] RDMA/mlx5: Avoid memory leak in case of XRCD dealloc failure Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 082/101] ocfs2: return -EROFS to mount.ocfs2 if inode block is invalid Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 083/101] ocfs2/acl: use 'ip_xattr_sem' to protect getting extended attribute Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 084/101] mm/mempolicy: fix the check of nodemask from user Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 085/101] mm/mempolicy: add nodes_empty check in SYSC_migrate_pages Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 086/101] asm-generic: provide generic_pmdp_establish() Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 087/101] mm: pin address_space before dereferencing it while isolating an LRU page Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 088/101] IB/ipoib: Fix for potential no-carrier state Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 089/101] x86/power: Fix swsusp_arch_resume prototype Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 091/101] ACPI: processor_perflib: Do not send _PPC change notification if not ready Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 090/101] firmware: dmi_scan: Fix handling of empty DMI strings Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 092/101] MIPS: TXx9: use IS_BUILTIN() for CONFIG_LEDS_CLASS Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 093/101] xen/grant-table: Use put_page instead of free_page Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 095/101] cifs: silence compiler warnings showing up with gcc-8.0.0 Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 094/101] proc: fix /proc/*/map_files lookup Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 096/101] bcache: properly set task state in bch_writeback_thread() Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 097/101] bcache: fix for allocator and register thread race Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 098/101] bcache: fix for data collapse after re-attaching an attached device Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 099/101] bcache: return attach error when no cache set exist Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 101/101] irqchip/gic-v3: Change pr_debug message to pr_devel Sasha Levin
2018-04-09  0:41 ` [PATCH AUTOSEL for 3.18 100/101] nfsd: return RESOURCE not GARBAGE_ARGS on too many ops Sasha Levin

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=20180409004042.164920-6-alexander.levin@microsoft.com \
    --to=alexander.levin@microsoft.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@linux-mips.org \
    --cc=paul.burton@imgtec.com \
    --cc=ralf@linux-mips.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).