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:
parent
eb0153efa6
commit
370ed60029
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,17 +150,17 @@ 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);
|
||||||
|
@ -168,7 +168,7 @@ retry:
|
||||||
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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue