From: Harsh Prateek Bora <harshpb@linux.ibm.com>
To: Igor Mammedov <imammedo@redhat.com>, qemu-devel@nongnu.org
Cc: pbonzini@redhat.com, peterx@redhat.com, mst@redhat.com,
mtosatti@redhat.com, richard.henderson@linaro.org,
riku.voipio@iki.fi, thuth@redhat.com, pasic@linux.ibm.com,
borntraeger@linux.ibm.com, david@redhat.com,
jjherne@linux.ibm.com, shorne@gmail.com, eduardo@habkost.net,
marcel.apfelbaum@gmail.com, philmd@linaro.org,
wangyanan55@huawei.com, zhao1.liu@intel.com,
peter.maydell@linaro.org, agraf@csgraf.de, mads@ynddal.dk,
mrolnik@gmail.com, deller@gmx.de, dirty@apple.com,
rbolshakov@ddn.com, phil@philjordan.eu, reinoud@netbsd.org,
sunilmut@microsoft.com, gaosong@loongson.cn, laurent@vivier.eu,
edgar.iglesias@gmail.com, aurelien@aurel32.net,
jiaxun.yang@flygoat.com, arikalo@gmail.com,
chenhuacai@kernel.org, npiggin@gmail.com, rathc@linux.ibm.com,
yoshinori.sato@nifty.com, iii@linux.ibm.com,
mark.cave-ayland@ilande.co.uk, atar4qemu@gmail.com,
qemu-s390x@nongnu.org, qemu-arm@nongnu.org, qemu-ppc@nongnu.org
Subject: Re: [PATCH v5 6/8] add cpu_test_interrupt()/cpu_set_interrupt() helpers and use them tree wide
Date: Mon, 25 Aug 2025 13:46:45 +0530 [thread overview]
Message-ID: <9fde8cf9-19c4-4265-90dd-75ac4f12c584@linux.ibm.com> (raw)
In-Reply-To: <20250821155603.2422553-1-imammedo@redhat.com>
On 8/21/25 21:26, Igor Mammedov wrote:
> the helpers form load-acquire/store-release pair and use them to replace
> open-coded checkers/setters consistently across the code, which
> ensures that appropriate barriers are in place in case checks happen
> outside of BQL.
>
> Signed-off-by: Igor Mammedov <imammedo@redhat.com>
> Reviewed-by: Peter Xu <peterx@redhat.com>
> Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>
> ---
> v5: fix copy/paste error in doc comment of cpu_set_interrupt()
> "Jason J. Herne" <jjherne@linux.ibm.com>
> v4:
> add cpu_set_interrupt() and merge helpers patch with
> patches that use them (v3 6-7,9/10).
> Peter Xu <peterx@redhat.com>
> ---
> include/hw/core/cpu.h | 25 +++++++++++++++++++++
> accel/tcg/cpu-exec.c | 10 ++++-----
> accel/tcg/tcg-accel-ops.c | 2 +-
> accel/tcg/user-exec.c | 2 +-
> hw/intc/s390_flic.c | 2 +-
> hw/openrisc/cputimer.c | 2 +-
> system/cpus.c | 2 +-
> target/alpha/cpu.c | 8 +++----
> target/arm/cpu.c | 20 ++++++++---------
> target/arm/helper.c | 18 +++++++--------
> target/arm/hvf/hvf.c | 6 ++---
> target/avr/cpu.c | 2 +-
> target/hppa/cpu.c | 2 +-
> target/i386/hvf/hvf.c | 4 ++--
> target/i386/hvf/x86hvf.c | 21 +++++++++---------
> target/i386/kvm/kvm.c | 34 ++++++++++++++---------------
> target/i386/nvmm/nvmm-all.c | 24 ++++++++++----------
> target/i386/tcg/system/seg_helper.c | 2 +-
> target/i386/tcg/system/svm_helper.c | 2 +-
> target/i386/whpx/whpx-all.c | 34 ++++++++++++++---------------
> target/loongarch/cpu.c | 2 +-
> target/m68k/cpu.c | 2 +-
> target/microblaze/cpu.c | 2 +-
> target/mips/cpu.c | 6 ++---
> target/mips/kvm.c | 2 +-
> target/openrisc/cpu.c | 3 +--
> target/ppc/cpu_init.c | 2 +-
> target/ppc/kvm.c | 2 +-
> target/rx/cpu.c | 3 +--
> target/rx/helper.c | 2 +-
> target/s390x/cpu-system.c | 2 +-
> target/sh4/cpu.c | 2 +-
> target/sh4/helper.c | 2 +-
> target/sparc/cpu.c | 2 +-
> target/sparc/int64_helper.c | 4 ++--
> 35 files changed, 141 insertions(+), 119 deletions(-)
>
> diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
> index 5eaf41a566..1dee9d4c76 100644
> --- a/include/hw/core/cpu.h
> +++ b/include/hw/core/cpu.h
> @@ -942,6 +942,31 @@ CPUState *cpu_by_arch_id(int64_t id);
>
> void cpu_interrupt(CPUState *cpu, int mask);
>
> +/**
> + * cpu_test_interrupt:
> + * @cpu: The CPU to check interrupt(s) on.
> + * @mask: The interrupts to check.
> + *
> + * Checks if any of interrupts in @mask are pending on @cpu.
> + */
> +static inline bool cpu_test_interrupt(CPUState *cpu, int mask)
> +{
> + return qatomic_load_acquire(&cpu->interrupt_request) & mask;
> +}
> +
> +/**
> + * cpu_set_interrupt:
> + * @cpu: The CPU to set pending interrupt(s) on.
> + * @mask: The interrupts to set.
> + *
> + * Sets interrupts in @mask as pending on @cpu.
> + */
> +static inline void cpu_set_interrupt(CPUState *cpu, int mask)
> +{
> + qatomic_store_release(&cpu->interrupt_request,
> + cpu->interrupt_request | mask);
> +}
> +
> /**
> * cpu_set_pc:
> * @cpu: The CPU to set the program counter for.
> diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
> index 713bdb2056..1269c2c6ba 100644
> --- a/accel/tcg/cpu-exec.c
> +++ b/accel/tcg/cpu-exec.c
> @@ -778,7 +778,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
> */
> qatomic_set_mb(&cpu->neg.icount_decr.u16.high, 0);
>
> - if (unlikely(qatomic_read(&cpu->interrupt_request))) {
> + if (unlikely(cpu_test_interrupt(cpu, ~0))) {
> int interrupt_request;
> bql_lock();
> interrupt_request = cpu->interrupt_request;
> @@ -786,7 +786,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
> /* Mask out external interrupts for this step. */
> interrupt_request &= ~CPU_INTERRUPT_SSTEP_MASK;
> }
> - if (interrupt_request & CPU_INTERRUPT_DEBUG) {
> + if (cpu_test_interrupt(cpu, CPU_INTERRUPT_DEBUG)) {
> cpu->interrupt_request &= ~CPU_INTERRUPT_DEBUG;
Do we need a helper for instances like these (logical &) as well ?
I see a couple more such instances below.
> cpu->exception_index = EXCP_DEBUG;
> bql_unlock();
> @@ -795,7 +795,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
> #if !defined(CONFIG_USER_ONLY)
> if (replay_mode == REPLAY_MODE_PLAY && !replay_has_interrupt()) {
> /* Do nothing */
> - } else if (interrupt_request & CPU_INTERRUPT_HALT) {
> + } else if (cpu_test_interrupt(cpu, CPU_INTERRUPT_HALT)) {
> replay_interrupt();
> cpu->interrupt_request &= ~CPU_INTERRUPT_HALT;
> cpu->halted = 1;
> @@ -805,7 +805,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
> } else {
> const TCGCPUOps *tcg_ops = cpu->cc->tcg_ops;
>
> - if (interrupt_request & CPU_INTERRUPT_RESET) {
> + if (cpu_test_interrupt(cpu, CPU_INTERRUPT_RESET)) {
> replay_interrupt();
> tcg_ops->cpu_exec_reset(cpu);
> bql_unlock();
> @@ -841,7 +841,7 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
> interrupt_request = cpu->interrupt_request;
> }
> #endif /* !CONFIG_USER_ONLY */
> - if (interrupt_request & CPU_INTERRUPT_EXITTB) {
> + if (cpu_test_interrupt(cpu, CPU_INTERRUPT_EXITTB)) {
> cpu->interrupt_request &= ~CPU_INTERRUPT_EXITTB;
> /* ensure that no TB jump will be modified as
> the program flow was changed */
> diff --git a/accel/tcg/tcg-accel-ops.c b/accel/tcg/tcg-accel-ops.c
> index 3b0d7d298e..9c37266c1e 100644
> --- a/accel/tcg/tcg-accel-ops.c
> +++ b/accel/tcg/tcg-accel-ops.c
> @@ -97,7 +97,7 @@ static void tcg_cpu_reset_hold(CPUState *cpu)
> /* mask must never be zero, except for A20 change call */
> void tcg_handle_interrupt(CPUState *cpu, int mask)
> {
> - cpu->interrupt_request |= mask;
> + cpu_set_interrupt(cpu, mask);
>
> /*
> * If called from iothread context, wake the target cpu in
> diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c
> index f25d80e2dc..fc2eaf420d 100644
> --- a/accel/tcg/user-exec.c
> +++ b/accel/tcg/user-exec.c
> @@ -49,7 +49,7 @@ __thread uintptr_t helper_retaddr;
> void cpu_interrupt(CPUState *cpu, int mask)
> {
> g_assert(bql_locked());
> - cpu->interrupt_request |= mask;
> + cpu_set_interrupt(cpu, mask);
> qatomic_set(&cpu->neg.icount_decr.u16.high, -1);
> }
>
<snip>
> diff --git a/target/ppc/cpu_init.c b/target/ppc/cpu_init.c
> index a0e77f2673..db841f1260 100644
> --- a/target/ppc/cpu_init.c
> +++ b/target/ppc/cpu_init.c
> @@ -7225,7 +7225,7 @@ static int ppc_cpu_mmu_index(CPUState *cs, bool ifetch)
> #ifndef CONFIG_USER_ONLY
> static bool ppc_cpu_has_work(CPUState *cs)
> {
> - return cs->interrupt_request & CPU_INTERRUPT_HARD;
> + return cpu_test_interrupt(cs, CPU_INTERRUPT_HARD);
> }
> #endif /* !CONFIG_USER_ONLY */
>
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 015658049e..d145774b09 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -1354,7 +1354,7 @@ static int kvmppc_handle_halt(PowerPCCPU *cpu)
> CPUState *cs = CPU(cpu);
> CPUPPCState *env = &cpu->env;
>
> - if (!(cs->interrupt_request & CPU_INTERRUPT_HARD) &&
> + if (!cpu_test_interrupt(cs, CPU_INTERRUPT_HARD) &&
> FIELD_EX64(env->msr, MSR, EE)) {
> cs->halted = 1;
> cs->exception_index = EXCP_HLT;
For target/ppc:
Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com>
> diff --git a/target/rx/cpu.c b/target/rx/cpu.c
> index c6dd5d6f83..da02ae7bf8 100644
> --- a/target/rx/cpu.c
> +++ b/target/rx/cpu.c
> @@ -75,8 +75,7 @@ static void rx_restore_state_to_opc(CPUState *cs,
>
> static bool rx_cpu_has_work(CPUState *cs)
> {
> - return cs->interrupt_request &
> - (CPU_INTERRUPT_HARD | CPU_INTERRUPT_FIR);
> + return cpu_test_interrupt(cs, CPU_INTERRUPT_HARD | CPU_INTERRUPT_FIR);
> }
>
> static int rx_cpu_mmu_index(CPUState *cs, bool ifunc)
> diff --git a/target/rx/helper.c b/target/rx/helper.c
> index 0640ab322b..ce003af421 100644
> --- a/target/rx/helper.c
> +++ b/target/rx/helper.c
> @@ -44,7 +44,7 @@ void rx_cpu_unpack_psw(CPURXState *env, uint32_t psw, int rte)
> void rx_cpu_do_interrupt(CPUState *cs)
> {
> CPURXState *env = cpu_env(cs);
> - int do_irq = cs->interrupt_request & INT_FLAGS;
> + int do_irq = cpu_test_interrupt(cs, INT_FLAGS);
> uint32_t save_psw;
>
> env->in_sleep = 0;
> diff --git a/target/s390x/cpu-system.c b/target/s390x/cpu-system.c
> index 709ccd5299..f3a9ffb2a2 100644
> --- a/target/s390x/cpu-system.c
> +++ b/target/s390x/cpu-system.c
> @@ -49,7 +49,7 @@ bool s390_cpu_has_work(CPUState *cs)
> return false;
> }
>
> - if (!(cs->interrupt_request & CPU_INTERRUPT_HARD)) {
> + if (!cpu_test_interrupt(cs, CPU_INTERRUPT_HARD)) {
> return false;
> }
>
> diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
> index 4f561e8c91..21ccb86df4 100644
> --- a/target/sh4/cpu.c
> +++ b/target/sh4/cpu.c
> @@ -108,7 +108,7 @@ static bool superh_io_recompile_replay_branch(CPUState *cs,
>
> static bool superh_cpu_has_work(CPUState *cs)
> {
> - return cs->interrupt_request & CPU_INTERRUPT_HARD;
> + return cpu_test_interrupt(cs, CPU_INTERRUPT_HARD);
> }
> #endif /* !CONFIG_USER_ONLY */
>
> diff --git a/target/sh4/helper.c b/target/sh4/helper.c
> index fb7642bda1..1744ef0e6d 100644
> --- a/target/sh4/helper.c
> +++ b/target/sh4/helper.c
> @@ -58,7 +58,7 @@ int cpu_sh4_is_cached(CPUSH4State *env, target_ulong addr)
> void superh_cpu_do_interrupt(CPUState *cs)
> {
> CPUSH4State *env = cpu_env(cs);
> - int do_irq = cs->interrupt_request & CPU_INTERRUPT_HARD;
> + int do_irq = cpu_test_interrupt(cs, CPU_INTERRUPT_HARD);
> int do_exp, irq_vector = cs->exception_index;
>
> /* prioritize exceptions over interrupts */
> diff --git a/target/sparc/cpu.c b/target/sparc/cpu.c
> index 245caf2de0..c9773f1540 100644
> --- a/target/sparc/cpu.c
> +++ b/target/sparc/cpu.c
> @@ -783,7 +783,7 @@ static void sparc_restore_state_to_opc(CPUState *cs,
> #ifndef CONFIG_USER_ONLY
> static bool sparc_cpu_has_work(CPUState *cs)
> {
> - return (cs->interrupt_request & CPU_INTERRUPT_HARD) &&
> + return cpu_test_interrupt(cs, CPU_INTERRUPT_HARD) &&
> cpu_interrupts_enabled(cpu_env(cs));
> }
> #endif /* !CONFIG_USER_ONLY */
> diff --git a/target/sparc/int64_helper.c b/target/sparc/int64_helper.c
> index bd14c7a0db..49e4e51c6d 100644
> --- a/target/sparc/int64_helper.c
> +++ b/target/sparc/int64_helper.c
> @@ -89,7 +89,7 @@ void cpu_check_irqs(CPUSPARCState *env)
> * the next bit is (2 << psrpil).
> */
> if (pil < (2 << env->psrpil)) {
> - if (cs->interrupt_request & CPU_INTERRUPT_HARD) {
> + if (cpu_test_interrupt(cs, CPU_INTERRUPT_HARD)) {
> trace_sparc64_cpu_check_irqs_reset_irq(env->interrupt_index);
> env->interrupt_index = 0;
> cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
> @@ -120,7 +120,7 @@ void cpu_check_irqs(CPUSPARCState *env)
> break;
> }
> }
> - } else if (cs->interrupt_request & CPU_INTERRUPT_HARD) {
> + } else if (cpu_test_interrupt(cs, CPU_INTERRUPT_HARD)) {
> trace_sparc64_cpu_check_irqs_disabled(pil, env->pil_in, env->softint,
> env->interrupt_index);
> env->interrupt_index = 0;
next prev parent reply other threads:[~2025-08-25 8:19 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-14 16:05 [PATCH v4 0/8] Reinvent BQL-free PIO/MMIO Igor Mammedov
2025-08-14 16:05 ` [PATCH v4 1/8] memory: reintroduce BQL-free fine-grained PIO/MMIO Igor Mammedov
2025-08-25 10:55 ` Philippe Mathieu-Daudé
2025-08-14 16:05 ` [PATCH v4 2/8] acpi: mark PMTIMER as unlocked Igor Mammedov
2025-08-14 16:05 ` [PATCH v4 3/8] hpet: switch to fain-grained device locking Igor Mammedov
2025-08-25 14:43 ` Zhao Liu
2025-08-14 16:05 ` [PATCH v4 4/8] hpet: move out main counter read into a separate block Igor Mammedov
2025-08-25 14:44 ` Zhao Liu
2025-08-14 16:05 ` [PATCH v4 5/8] hpet: make main counter read lock-less Igor Mammedov
2025-08-25 14:55 ` Zhao Liu
2025-08-25 15:10 ` Igor Mammedov
2025-08-14 16:05 ` [PATCH v4 6/8] add cpu_test_interrupt()/cpu_set_interrupt() helpers and use them tree wide Igor Mammedov
2025-08-14 19:05 ` Peter Xu
2025-08-20 15:01 ` Jason J. Herne
2025-08-21 15:57 ` Igor Mammedov
2025-08-21 15:56 ` [PATCH v5 " Igor Mammedov
2025-08-25 8:16 ` Harsh Prateek Bora [this message]
2025-08-25 15:06 ` Igor Mammedov
2025-08-25 10:35 ` Philippe Mathieu-Daudé
2025-08-25 15:02 ` Igor Mammedov
2025-08-25 15:28 ` Zhao Liu
2025-08-25 15:19 ` Igor Mammedov
2025-08-26 7:45 ` Zhao Liu
2025-08-26 8:47 ` Igor Mammedov
2025-08-26 9:27 ` Zhao Liu
2025-08-29 8:18 ` Paolo Bonzini
2025-08-29 12:33 ` Paolo Bonzini
2025-09-01 12:05 ` Igor Mammedov
2025-09-01 12:06 ` Paolo Bonzini
2025-08-14 16:05 ` [PATCH v4 7/8] kvm: i386: irqchip: take BQL only if there is an interrupt Igor Mammedov
2025-08-25 10:46 ` Philippe Mathieu-Daudé
2025-08-27 8:40 ` Igor Mammedov
2025-08-14 16:06 ` [PATCH v4 8/8] tcg: move interrupt caching and single step masking closer to user Igor Mammedov
2025-08-29 8:19 ` [PATCH v4 0/8] Reinvent BQL-free PIO/MMIO Paolo Bonzini
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=9fde8cf9-19c4-4265-90dd-75ac4f12c584@linux.ibm.com \
--to=harshpb@linux.ibm.com \
--cc=agraf@csgraf.de \
--cc=arikalo@gmail.com \
--cc=atar4qemu@gmail.com \
--cc=aurelien@aurel32.net \
--cc=borntraeger@linux.ibm.com \
--cc=chenhuacai@kernel.org \
--cc=david@redhat.com \
--cc=deller@gmx.de \
--cc=dirty@apple.com \
--cc=edgar.iglesias@gmail.com \
--cc=eduardo@habkost.net \
--cc=gaosong@loongson.cn \
--cc=iii@linux.ibm.com \
--cc=imammedo@redhat.com \
--cc=jiaxun.yang@flygoat.com \
--cc=jjherne@linux.ibm.com \
--cc=laurent@vivier.eu \
--cc=mads@ynddal.dk \
--cc=marcel.apfelbaum@gmail.com \
--cc=mark.cave-ayland@ilande.co.uk \
--cc=mrolnik@gmail.com \
--cc=mst@redhat.com \
--cc=mtosatti@redhat.com \
--cc=npiggin@gmail.com \
--cc=pasic@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=peterx@redhat.com \
--cc=phil@philjordan.eu \
--cc=philmd@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=rathc@linux.ibm.com \
--cc=rbolshakov@ddn.com \
--cc=reinoud@netbsd.org \
--cc=richard.henderson@linaro.org \
--cc=riku.voipio@iki.fi \
--cc=shorne@gmail.com \
--cc=sunilmut@microsoft.com \
--cc=thuth@redhat.com \
--cc=wangyanan55@huawei.com \
--cc=yoshinori.sato@nifty.com \
--cc=zhao1.liu@intel.com \
/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).