cpu: expose qemu_cpu_list_lock for lock-guard use

Expose qemu_cpu_list_lock globally so that we can use
WITH_QEMU_LOCK_GUARD and QEMU_LOCK_GUARD to simplify a few code paths
now and in future.

Signed-off-by: Jamie Iles <quic_jiles@quicinc.com>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20230427020925.51003-2-quic_jiles@quicinc.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Jamie Iles 2023-04-27 03:09:24 +01:00 committed by Richard Henderson
parent eb0153efa6
commit 370ed60029
5 changed files with 26 additions and 25 deletions

View file

@ -25,7 +25,7 @@
#include "qemu/lockable.h" #include "qemu/lockable.h"
#include "trace/trace-root.h" #include "trace/trace-root.h"
static QemuMutex qemu_cpu_list_lock; QemuMutex qemu_cpu_list_lock;
static QemuCond exclusive_cond; static QemuCond exclusive_cond;
static QemuCond exclusive_resume; static QemuCond exclusive_resume;
static QemuCond qemu_work_cond; static QemuCond qemu_work_cond;

View file

@ -32,6 +32,7 @@ extern intptr_t qemu_host_page_mask;
#define REAL_HOST_PAGE_ALIGN(addr) ROUND_UP((addr), qemu_real_host_page_size()) #define REAL_HOST_PAGE_ALIGN(addr) ROUND_UP((addr), qemu_real_host_page_size())
/* The CPU list lock nests outside page_(un)lock or mmap_(un)lock */ /* The CPU list lock nests outside page_(un)lock or mmap_(un)lock */
extern QemuMutex qemu_cpu_list_lock;
void qemu_init_cpu_list(void); void qemu_init_cpu_list(void);
void cpu_list_lock(void); void cpu_list_lock(void);
void cpu_list_unlock(void); void cpu_list_unlock(void);

View file

@ -17,6 +17,7 @@
#include "qemu/guest-random.h" #include "qemu/guest-random.h"
#include "qemu/units.h" #include "qemu/units.h"
#include "qemu/selfmap.h" #include "qemu/selfmap.h"
#include "qemu/lockable.h"
#include "qapi/error.h" #include "qapi/error.h"
#include "qemu/error-report.h" #include "qemu/error-report.h"
#include "target_signal.h" #include "target_signal.h"
@ -4238,14 +4239,14 @@ static int fill_note_info(struct elf_note_info *info,
info->notes_size += note_size(&info->notes[i]); info->notes_size += note_size(&info->notes[i]);
/* read and fill status of all threads */ /* read and fill status of all threads */
cpu_list_lock(); WITH_QEMU_LOCK_GUARD(&qemu_cpu_list_lock) {
CPU_FOREACH(cpu) { CPU_FOREACH(cpu) {
if (cpu == thread_cpu) { if (cpu == thread_cpu) {
continue; continue;
}
fill_thread_info(info, cpu->env_ptr);
} }
fill_thread_info(info, cpu->env_ptr);
} }
cpu_list_unlock();
return (0); return (0);
} }

View file

@ -150,25 +150,25 @@ int64_t vcpu_calculate_dirtyrate(int64_t calc_time_ms,
retry: retry:
init_time_ms = qemu_clock_get_ms(QEMU_CLOCK_REALTIME); init_time_ms = qemu_clock_get_ms(QEMU_CLOCK_REALTIME);
cpu_list_lock(); WITH_QEMU_LOCK_GUARD(&qemu_cpu_list_lock) {
gen_id = cpu_list_generation_id_get(); gen_id = cpu_list_generation_id_get();
records = vcpu_dirty_stat_alloc(stat); records = vcpu_dirty_stat_alloc(stat);
vcpu_dirty_stat_collect(stat, records, true); vcpu_dirty_stat_collect(stat, records, true);
cpu_list_unlock(); }
duration = dirty_stat_wait(calc_time_ms, init_time_ms); duration = dirty_stat_wait(calc_time_ms, init_time_ms);
global_dirty_log_sync(flag, one_shot); global_dirty_log_sync(flag, one_shot);
cpu_list_lock(); WITH_QEMU_LOCK_GUARD(&qemu_cpu_list_lock) {
if (gen_id != cpu_list_generation_id_get()) { if (gen_id != cpu_list_generation_id_get()) {
g_free(records); g_free(records);
g_free(stat->rates); g_free(stat->rates);
cpu_list_unlock(); cpu_list_unlock();
goto retry; goto retry;
}
vcpu_dirty_stat_collect(stat, records, false);
} }
vcpu_dirty_stat_collect(stat, records, false);
cpu_list_unlock();
for (i = 0; i < stat->nvcpu; i++) { for (i = 0; i < stat->nvcpu; i++) {
dirtyrate = do_calculate_dirtyrate(records[i], duration); dirtyrate = do_calculate_dirtyrate(records[i], duration);

View file

@ -8,6 +8,7 @@
*/ */
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "qemu/lockable.h"
#include "cpu.h" #include "cpu.h"
#include "trace/trace-root.h" #include "trace/trace-root.h"
#include "trace/control.h" #include "trace/control.h"
@ -116,11 +117,9 @@ static bool adding_first_cpu1(void)
static bool adding_first_cpu(void) static bool adding_first_cpu(void)
{ {
bool res; QEMU_LOCK_GUARD(&qemu_cpu_list_lock);
cpu_list_lock();
res = adding_first_cpu1(); return adding_first_cpu1();
cpu_list_unlock();
return res;
} }
void trace_init_vcpu(CPUState *vcpu) void trace_init_vcpu(CPUState *vcpu)