cpu-common: use atomic access for interrupt_request

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.

Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2025-08-29 11:26:05 +02:00
parent 602d5ebba2
commit 27e76d0101
3 changed files with 2 additions and 14 deletions

View file

@ -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)

View file

@ -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;

View file

@ -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)