public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Xu Lu <luxu.kernel@bytedance.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Sasha Levin <sashal@kernel.org>,
	anup@brainfault.org, paul.walmsley@sifive.com,
	palmer@dabbelt.com, aou@eecs.berkeley.edu,
	linux-riscv@lists.infradead.org
Subject: [PATCH AUTOSEL 6.13 07/21] irqchip/riscv: Ensure ordering of memory writes and IPI writes
Date: Mon, 10 Feb 2025 20:29:40 -0500	[thread overview]
Message-ID: <20250211012954.4096433-7-sashal@kernel.org> (raw)
In-Reply-To: <20250211012954.4096433-1-sashal@kernel.org>

From: Xu Lu <luxu.kernel@bytedance.com>

[ Upstream commit 825c78e6a60c309a59d18d5ac5968aa79cef0bd6 ]

RISC-V distinguishes between memory accesses and device I/O and uses FENCE
instruction to order them as viewed by other RISC-V harts and external
devices or coprocessors. The FENCE instruction can order any combination of
device input(I), device output(O), memory reads(R) and memory
writes(W). For example, 'fence w, o' is used to ensure all memory writes
from instructions preceding the FENCE instruction appear earlier in the
global memory order than device output writes from instructions after the
FENCE instruction.

RISC-V issues IPIs by writing to the IMSIC/ACLINT MMIO registers, which is
regarded as device output operation. However, the existing implementation
of the IMSIC/ACLINT drivers issue the IPI via writel_relaxed(), which does
not guarantee the order of device output operation and preceding memory
writes. As a consequence the hart receiving the IPI might not observe the
IPI related data.

Fix this by replacing writel_relaxed() with writel() when issuing IPIs,
which uses 'fence w, o' to ensure all previous writes made by the current
hart are visible to other harts before they receive the IPI.

Signed-off-by: Xu Lu <luxu.kernel@bytedance.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/all/20250127093846.98625-1-luxu.kernel@bytedance.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/irqchip/irq-riscv-imsic-early.c      | 2 +-
 drivers/irqchip/irq-thead-c900-aclint-sswi.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/irqchip/irq-riscv-imsic-early.c b/drivers/irqchip/irq-riscv-imsic-early.c
index c5c2e6929a2f5..275df50057057 100644
--- a/drivers/irqchip/irq-riscv-imsic-early.c
+++ b/drivers/irqchip/irq-riscv-imsic-early.c
@@ -27,7 +27,7 @@ static void imsic_ipi_send(unsigned int cpu)
 {
 	struct imsic_local_config *local = per_cpu_ptr(imsic->global.local, cpu);
 
-	writel_relaxed(IMSIC_IPI_ID, local->msi_va);
+	writel(IMSIC_IPI_ID, local->msi_va);
 }
 
 static void imsic_ipi_starting_cpu(void)
diff --git a/drivers/irqchip/irq-thead-c900-aclint-sswi.c b/drivers/irqchip/irq-thead-c900-aclint-sswi.c
index b0e366ade4271..8ff6e7a1363bd 100644
--- a/drivers/irqchip/irq-thead-c900-aclint-sswi.c
+++ b/drivers/irqchip/irq-thead-c900-aclint-sswi.c
@@ -31,7 +31,7 @@ static DEFINE_PER_CPU(void __iomem *, sswi_cpu_regs);
 
 static void thead_aclint_sswi_ipi_send(unsigned int cpu)
 {
-	writel_relaxed(0x1, per_cpu(sswi_cpu_regs, cpu));
+	writel(0x1, per_cpu(sswi_cpu_regs, cpu));
 }
 
 static void thead_aclint_sswi_ipi_clear(void)
-- 
2.39.5


  parent reply	other threads:[~2025-02-11  1:30 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-02-11  1:29 [PATCH AUTOSEL 6.13 01/21] nvme-fc: go straight to connecting state when initializing Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 02/21] nvme-fc: do not ignore connectivity loss during connecting Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 03/21] hrtimers: Mark is_migration_base() with __always_inline Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 04/21] powercap: call put_device() on an error path in powercap_register_control_type() Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 05/21] btrfs: avoid starting new transaction when cleaning qgroup during subvolume drop Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 06/21] futex: Pass in task to futex_queue() Sasha Levin
2025-02-11  1:29 ` Sasha Levin [this message]
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 08/21] iscsi_ibft: Fix UBSAN shift-out-of-bounds warning in ibft_attr_show_nic() Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 09/21] sched/debug: Provide slice length for fair tasks Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 10/21] platform/x86/intel: pmc: fix ltr decode in pmc_core_ltr_show() Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 11/21] drm/amd/display: Fix out-of-bound accesses Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 12/21] scsi: core: Use GFP_NOIO to avoid circular locking dependency Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 13/21] scsi: ufs: core: Fix error return with query response Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 14/21] scsi: qla1280: Fix kernel oops when debug level > 2 Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 15/21] Revert "drm/amd/display: Use HW lock mgr for PSR1" Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 16/21] kbuild: keep symbols for symbol_get() even with CONFIG_TRIM_UNUSED_KSYMS Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 17/21] ACPI: resource: IRQ override for Eluktronics MECH-17 Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 18/21] smb: client: fix noisy when tree connecting to DFS interlink targets Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 19/21] alpha/elf: Fix misc/setarch test of util-linux by removing 32bit support Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 20/21] vboxsf: fix building with GCC 15 Sasha Levin
2025-02-11  1:29 ` [PATCH AUTOSEL 6.13 21/21] selftests: always check mask returned by statmount(2) 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=20250211012954.4096433-7-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=anup@brainfault.org \
    --cc=aou@eecs.berkeley.edu \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=luxu.kernel@bytedance.com \
    --cc=palmer@dabbelt.com \
    --cc=paul.walmsley@sifive.com \
    --cc=stable@vger.kernel.org \
    --cc=tglx@linutronix.de \
    /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