On Fri, 29 Aug 2025 17:31:04 +0200
Paolo Bonzini <pbonz...@redhat.com> wrote:

> Writes to interrupt_request used non-atomic accesses, but there are a
> few cases where the access was not protected by the BQL.  Now that
> there is a full set of helpers, it's easier to guarantee that
> interrupt_request accesses are fully atomic, so just drop the
> requirement instead of fixing them.
> 
> Signed-off-by: Paolo Bonzini <pbonz...@redhat.com>

Reviewed-by: Igor Mammedov <imamm...@redhat.com>

> ---
>  include/hw/core/cpu.h |  1 -
>  hw/core/cpu-common.c  | 12 +-----------
>  system/cpus.c         |  3 +--
>  3 files changed, 2 insertions(+), 14 deletions(-)
> 
> diff --git a/include/hw/core/cpu.h b/include/hw/core/cpu.h
> index b01a0cffd64..23bd02277f4 100644
> --- a/include/hw/core/cpu.h
> +++ b/include/hw/core/cpu.h
> @@ -495,7 +495,6 @@ struct CPUState {
>      bool exit_request;
>      int exclusive_context_count;
>      uint32_t cflags_next_tb;
> -    /* updates protected by BQL */
>      uint32_t interrupt_request;
>      int singlestep_enabled;
>      int64_t icount_budget;
> diff --git a/hw/core/cpu-common.c b/hw/core/cpu-common.c
> index 39e674aca21..9ea1f3764a8 100644
> --- a/hw/core/cpu-common.c
> +++ b/hw/core/cpu-common.c
> @@ -67,19 +67,9 @@ CPUState *cpu_create(const char *typename)
>      return cpu;
>  }
>  
> -/* Resetting the IRQ comes from across the code base so we take the
> - * BQL here if we need to.  cpu_interrupt assumes it is held.*/
>  void cpu_reset_interrupt(CPUState *cpu, int mask)
>  {
> -    bool need_lock = !bql_locked();
> -
> -    if (need_lock) {
> -        bql_lock();
> -    }
> -    cpu->interrupt_request &= ~mask;
> -    if (need_lock) {
> -        bql_unlock();
> -    }
> +    qatomic_and(&cpu->interrupt_request, ~mask);
>  }
>  
>  void cpu_exit(CPUState *cpu)
> diff --git a/system/cpus.c b/system/cpus.c
> index 437848b5eb4..9bfbe2b0607 100644
> --- a/system/cpus.c
> +++ b/system/cpus.c
> @@ -257,8 +257,7 @@ int64_t cpus_get_elapsed_ticks(void)
>  void cpu_set_interrupt(CPUState *cpu, int mask)
>  {
>      /* Pairs with cpu_test_interrupt(). */
> -    qatomic_store_release(&cpu->interrupt_request,
> -        cpu->interrupt_request | mask);
> +    qatomic_or(&cpu->interrupt_request, mask);
>  }
>  
>  void generic_handle_interrupt(CPUState *cpu, int mask)


Reply via email to