linux_dsm_epyc7002/arch/mips
Huacai Chen a307188689
MIPS: Change definition of cpu_relax() for Loongson-3
Linux expects that if a CPU modifies a memory location, then that
modification will eventually become visible to other CPUs in the system.

Loongson 3 CPUs include a Store Fill Buffer (SFB) which sits between a
core & its L1 data cache, queueing memory accesses & allowing for faster
forwarding of data from pending stores to younger loads from the core.
Unfortunately the SFB prioritizes loads such that a continuous stream of
loads may cause a pending write to be buffered indefinitely. This is
problematic if we end up with 2 CPUs which each perform a store that the
other polls for - one or both CPUs may end up with their stores buffered
in the SFB, never reaching cache due to the continuous reads from the
poll loop. Such a deadlock condition has been observed whilst running
qspinlock code.

This patch changes the definition of cpu_relax() to smp_mb() for
Loongson-3, forcing a flush of the SFB on SMP systems which will cause
any pending writes to make it as far as the L1 caches where they will
become visible to other CPUs. If the kernel is not compiled for SMP
support, this will expand to a barrier() as before.

This workaround matches that currently implemented for ARM when
CONFIG_ARM_ERRATA_754327=y, which was introduced by commit 534be1d5a2
("ARM: 6194/1: change definition of cpu_relax() for ARM11MPCore").

Although the workaround is only required when the Loongson 3 SFB
functionality is enabled, and we only began explicitly enabling that
functionality in v4.7 with commit 1e820da3c9 ("MIPS: Loongson-3:
Introduce CONFIG_LOONGSON3_ENHANCEMENT"), existing or future firmware
may enable the SFB which means we may need the workaround backported to
earlier kernels too.

[paul.burton@mips.com:
  - Reword commit message & comment.
  - Limit stable backport to v3.15+ where we support Loongson 3 CPUs.]

Signed-off-by: Huacai Chen <chenhc@lemote.com>
Signed-off-by: Paul Burton <paul.burton@mips.com>
References: 534be1d5a2 ("ARM: 6194/1: change definition of cpu_relax() for ARM11MPCore")
References: 1e820da3c9 ("MIPS: Loongson-3: Introduce CONFIG_LOONGSON3_ENHANCEMENT")
Patchwork: https://patchwork.linux-mips.org/patch/19830/
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: James Hogan <jhogan@kernel.org>
Cc: linux-mips@linux-mips.org
Cc: Fuxin Zhang <zhangfx@lemote.com>
Cc: Zhangjin Wu <wuzhangjin@gmail.com>
Cc: Huacai Chen <chenhuacai@gmail.com>
Cc: stable@vger.kernel.org # v3.15+
2018-07-23 10:16:17 -07:00
..
alchemy mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
ar7 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
ath25 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
ath79 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
bcm47xx MIPS: BCM47XX: Enable 74K Core ExternalSync for PCIe erratum 2018-06-18 22:19:50 +01:00
bcm63xx mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
bmips MIPS: bmips: remove unnecessary call to register "simple-bus" 2018-06-24 09:27:27 -07:00
boot mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
cavium-octeon mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
cobalt
configs MIPS: Malta: Use PIIX4 poweroff driver to power down 2018-06-24 09:27:27 -07:00
crypto
dec MIPS: Convert update_persistent_clock() to update_persistent_clock64() 2018-05-14 23:58:23 +01:00
emma
fw mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
generic MIPS: generic: remove unnecessary of_platform_populate call 2018-06-24 09:27:27 -07:00
include MIPS: Change definition of cpu_relax() for Loongson-3 2018-07-23 10:16:17 -07:00
jazz mips/jazz: provide missing dma_mask/coherent_dma_mask 2018-07-12 08:58:31 -07:00
jz4740 MIPS: JZ4740: Drop old platform reset code 2018-05-14 23:58:23 +01:00
kernel MIPS: Add FP_MODE regset support 2018-07-19 13:58:44 -07:00
kvm Small update for KVM. 2018-06-12 11:34:04 -07:00
lantiq mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
lasat mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
lib MIPS: memset.S: Reinstate delay slot indentation 2018-05-21 16:01:15 +01:00
loongson32 MIPS: use generic dma noncoherent ops for simple noncoherent platforms 2018-06-24 09:26:05 -07:00
loongson64 MIPS: loongson64: cs5536: Fix PCI_OHCI_INT_REG reads 2018-07-17 10:32:08 -07:00
math-emu
mm arch: mips: mm: page: Remove unused function 2018-06-24 09:27:27 -07:00
mti-malta MIPS: Malta: Use PIIX4 poweroff driver to power down 2018-06-24 09:27:27 -07:00
net bpf, mips: remove unused function 2018-05-14 19:11:45 -07:00
netlogic mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
oprofile MIPS: perf: More robustly probe for the presence of per-tc counters 2018-05-15 15:16:16 +01:00
paravirt mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
pci MIPS: Octeon: Unify QLM data types in CIU header. 2018-07-03 16:00:43 -07:00
pic32 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
pistachio
pmcs-msp71xx
pnx833x
power
ralink mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
rb532
sgi-ip22
sgi-ip27 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
sgi-ip32 MIPS: IP32: use generic dma noncoherent ops 2018-06-24 09:27:27 -07:00
sibyte mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
sni MIPS: sni: Remove the read_persistent_clock() 2018-05-14 23:58:25 +01:00
tools
txx9 mips: unify prom_putchar() declarations 2018-07-17 09:40:17 -07:00
vdso
vr41xx MIPS: Annotate cpu_wait implementations with __cpuidle 2018-06-28 14:18:54 -07:00
Kbuild
Kbuild.platforms
Kconfig MIPS: Malta: Use PIIX4 poweroff driver to power down 2018-06-24 09:27:27 -07:00
Kconfig.debug
Makefile MIPS: Always use -march=<arch>, not -<arch> shortcuts 2018-06-28 14:24:30 -07:00
Makefile.postlink