On Mon, 25 Aug 2025 23:28:22 +0800
Zhao Liu <zhao1....@intel.com> wrote:

> Hi Igor,
>  
> > 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);  
> 
> It seems the read access of cpu->interrupt_request is not atomic, should
> we also protect it by qatomic_read(cpu->interrupt_request)? like
> 
> qatomic_store_release(&cpu->interrupt_request,
>                       qatomic_read(cpu->interrupt_request) | mask)

it's not necessary according to doc:

  - ``qatomic_store_release()``, which guarantees the STORE to appear to        
   
  happen, ...,                    
  after all the LOAD or STORE operations specified before.
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  

that includes 'cpu->interrupt_request | mask' part

> 
> or futher,
> 
> qatomic_fetch_or(&cpu->interrupt_request, mask)
that would work as well  but it also could be more expensive than
qatomic_store_release()

> 
> > +}
> > +  
> 
> Thanks,
> Zhao
> 


Reply via email to