From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36941) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aYxRv-0000Yh-P5 for qemu-devel@nongnu.org; Thu, 25 Feb 2016 10:03:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aYxRp-0008VA-Mm for qemu-devel@nongnu.org; Thu, 25 Feb 2016 10:03:27 -0500 Received: from roura.ac.upc.edu ([147.83.33.10]:37976 helo=roura.ac.upc.es) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aYxRp-0008V1-0n for qemu-devel@nongnu.org; Thu, 25 Feb 2016 10:03:21 -0500 From: =?utf-8?b?TGx1w61z?= Vilanova Date: Thu, 25 Feb 2016 16:03:06 +0100 Message-Id: <145641258612.30097.7127731954660712163.stgit@localhost> In-Reply-To: <145641255678.30097.2919142707547689749.stgit@localhost> References: <145641255678.30097.2919142707547689749.stgit@localhost> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH 4/6] trace: Add per-vCPU tracing states for events with the 'vcpu' property List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Eduardo Habkost , Riku Voipio , Blue Swirl , Stefan Hajnoczi , Paolo Bonzini , =?UTF-8?q?Andreas=20F=C3=A4rber?= Each vCPU gets a 'trace_dstate' bitmap to control the per-vCPU dynamic tracing state of events with the 'vcpu' property. Signed-off-by: Llu=C3=ADs Vilanova --- Makefile.objs | 1 + bsd-user/main.c | 2 + include/qom/cpu.h | 12 ++++++++ linux-user/main.c | 2 + qom/cpu.c | 1 + trace/Makefile.objs | 26 ++++++++++++++++++ trace/control-internal.h | 35 ++++++++++++++++++++---- trace/control-stub.c | 29 ++++++++++++++++++++ trace/control-target.c | 58 +++++++++++++++++++++++++++++++++++++++ trace/control.c | 25 ++++++++++++++++- trace/control.h | 68 ++++++++++++++++++++++++++++++++++++++++= +++++- vl.c | 1 + 12 files changed, 251 insertions(+), 9 deletions(-) create mode 100644 trace/control-stub.c create mode 100644 trace/control-target.c diff --git a/Makefile.objs b/Makefile.objs index fbcaa74..402efb3 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -103,6 +103,7 @@ version-lobj-$(CONFIG_WIN32) +=3D $(BUILD_DIR)/versio= n.lo # tracing util-obj-y +=3D trace/ target-obj-y +=3D trace/ +stub-obj-y +=3D trace/ =20 ###################################################################### # guest agent diff --git a/bsd-user/main.c b/bsd-user/main.c index 287ec1d..79d2ad0 100644 --- a/bsd-user/main.c +++ b/bsd-user/main.c @@ -25,6 +25,7 @@ /* For tb_lock */ #include "cpu.h" #include "tcg.h" +#include "trace/control.h" #include "qemu/timer.h" #include "qemu/envlist.h" #include "exec/log.h" @@ -1116,6 +1117,7 @@ int main(int argc, char **argv) gdbserver_start (gdbstub_port); gdb_handlesig(cpu, 0); } + trace_init_vcpu_events(); cpu_loop(env); /* never exits */ return 0; diff --git a/include/qom/cpu.h b/include/qom/cpu.h index 1df7cb4..7e19be3 100644 --- a/include/qom/cpu.h +++ b/include/qom/cpu.h @@ -28,6 +28,7 @@ #include "qemu/queue.h" #include "qemu/thread.h" #include "qemu/typedefs.h" +#include "trace/generated-events.h" =20 typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size, void *opaque); @@ -266,6 +267,7 @@ struct kvm_run; * @kvm_fd: vCPU file descriptor for KVM. * @work_mutex: Lock to prevent multiple access to queued_work_*. * @queued_work_first: First asynchronous work pending. + * @trace_dstate: Dynamic tracing state of events for this vCPU. * * State of one CPU core or thread. */ @@ -332,6 +334,16 @@ struct CPUState { struct KVMState *kvm_state; struct kvm_run *kvm_run; =20 +#define TRACE_VCPU_DSTATE_TYPE uint32_t + TRACE_VCPU_DSTATE_TYPE trace_dstate; + /* + * Ensure 'trace_dstate' can encode event states as a bitmask. This = limits + * the number of events with the 'vcpu' property and *without* the + * 'disabled' property. + */ + bool too_many_vcpu_events[ + TRACE_VCPU_EVENT_COUNT > sizeof(TRACE_VCPU_DSTATE_TYPE)*8 ? -1 := 0]; + /* TODO Move common fields from CPUArchState here. */ int cpu_index; /* used by alpha TCG */ uint32_t halted; /* used by alpha, cris, ppc TCG */ diff --git a/linux-user/main.c b/linux-user/main.c index e719a2d..13ce851 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -25,6 +25,7 @@ #include "qemu-common.h" #include "cpu.h" #include "tcg.h" +#include "trace/control.h" #include "qemu/timer.h" #include "qemu/envlist.h" #include "elf.h" @@ -4650,6 +4651,7 @@ int main(int argc, char **argv, char **envp) } gdb_handlesig(cpu, 0); } + trace_init_vcpu_events(); cpu_loop(env); /* never exits */ return 0; diff --git a/qom/cpu.c b/qom/cpu.c index c45d0bb..7363776 100644 --- a/qom/cpu.c +++ b/qom/cpu.c @@ -330,6 +330,7 @@ static void cpu_common_initfn(Object *obj) qemu_mutex_init(&cpu->work_mutex); QTAILQ_INIT(&cpu->breakpoints); QTAILQ_INIT(&cpu->watchpoints); + cpu->trace_dstate =3D 0; } =20 static void cpu_common_finalize(Object *obj) diff --git a/trace/Makefile.objs b/trace/Makefile.objs index 5145b34..902d47b 100644 --- a/trace/Makefile.objs +++ b/trace/Makefile.objs @@ -12,6 +12,8 @@ tracetool-y +=3D $(shell find $(SRC_PATH)/scripts/trace= tool -name "*.py") # Auto-generated event descriptions for LTTng ust code =20 ifeq ($(findstring ust,$(TRACE_BACKENDS)),ust) + +ifndef MAKEFILE_GUARD_TRACE $(obj)/generated-ust-provider.h: $(obj)/generated-ust-provider.h-timesta= mp @cmp $< $@ >/dev/null 2>&1 || cp $< $@ $(obj)/generated-ust-provider.h-timestamp: $(SRC_PATH)/trace-events $(tr= acetool-y) @@ -30,11 +32,14 @@ $(obj)/generated-ust.c-timestamp: $(SRC_PATH)/trace-e= vents $(tracetool-y) =20 $(obj)/generated-events.h: $(obj)/generated-ust-provider.h $(obj)/generated-events.c: $(obj)/generated-ust.c +endif # MAKEFILE_GUARD_TRACE + endif =20 ###################################################################### # Auto-generated event descriptions =20 +ifndef MAKEFILE_GUARD_TRACE $(obj)/generated-events.h: $(obj)/generated-events.h-timestamp @cmp $< $@ >/dev/null 2>&1 || cp $< $@ $(obj)/generated-events.h-timestamp: $(SRC_PATH)/trace-events $(tracetoo= l-y) @@ -50,6 +55,7 @@ $(obj)/generated-events.c-timestamp: $(SRC_PATH)/trace-= events $(tracetool-y) --format=3Devents-c \ --backends=3D$(TRACE_BACKENDS) \ < $< > $@," GEN $(patsubst %-timestamp,%,$@)") +endif # MAKEFILE_GUARD_TRACE =20 util-obj-y +=3D generated-events.o =20 @@ -60,6 +66,7 @@ util-obj-y +=3D generated-events.o ################################################## # Execution level =20 +ifndef MAKEFILE_GUARD_TRACE $(obj)/generated-tracers.h: $(obj)/generated-tracers.h-timestamp @cmp -s $< $@ || cp $< $@ $(obj)/generated-tracers.h-timestamp: $(SRC_PATH)/trace-events $(BUILD_D= IR)/config-host.mak $(tracetool-y) @@ -67,10 +74,12 @@ $(obj)/generated-tracers.h-timestamp: $(SRC_PATH)/tra= ce-events $(BUILD_DIR)/conf --format=3Dh \ --backends=3D$(TRACE_BACKENDS) \ < $< > $@," GEN $(patsubst %-timestamp,%,$@)") +endif # MAKEFILE_GUARD_TRACE =20 ############################## # non-DTrace =20 +ifndef MAKEFILE_GUARD_TRACE $(obj)/generated-tracers.c: $(obj)/generated-tracers.c-timestamp @cmp -s $< $@ || cp $< $@ $(obj)/generated-tracers.c-timestamp: $(SRC_PATH)/trace-events $(BUILD_D= IR)/config-host.mak $(tracetool-y) @@ -80,6 +89,7 @@ $(obj)/generated-tracers.c-timestamp: $(SRC_PATH)/trace= -events $(BUILD_DIR)/conf < $< > $@," GEN $(patsubst %-timestamp,%,$@)") =20 $(obj)/generated-tracers.o: $(obj)/generated-tracers.c $(obj)/generated-= tracers.h +endif # MAKEFILE_GUARD_TRACE =20 ############################## # DTrace @@ -88,6 +98,8 @@ $(obj)/generated-tracers.o: $(obj)/generated-tracers.c = $(obj)/generated-tracers. # but that gets picked up by QEMU's Makefile as an external dependency # rule file. So we use '.dtrace' instead ifeq ($(findstring dtrace,$(TRACE_BACKENDS)),dtrace) + +ifndef MAKEFILE_GUARD_TRACE $(obj)/generated-tracers-dtrace.dtrace: $(obj)/generated-tracers-dtrace.= dtrace-timestamp @cmp $< $@ >/dev/null 2>&1 || cp $< $@ $(obj)/generated-tracers-dtrace.dtrace-timestamp: $(SRC_PATH)/trace-even= ts $(BUILD_DIR)/config-host.mak $(tracetool-y) @@ -100,6 +112,7 @@ $(obj)/generated-tracers-dtrace.h: $(obj)/generated-t= racers-dtrace.dtrace $(call quiet-command,dtrace -o $@ -h -s $<, " GEN $@") =20 $(obj)/generated-tracers-dtrace.o: $(obj)/generated-tracers-dtrace.dtrac= e +endif # MAKEFILE_GUARD_TRACE =20 util-obj-y +=3D generated-tracers-dtrace.o endif @@ -107,6 +120,7 @@ endif ################################################## # Translation level =20 +ifndef MAKEFILE_GUARD_TRACE $(obj)/generated-helpers-wrappers.h: $(obj)/generated-helpers-wrappers.h= -timestamp @cmp $< $@ >/dev/null 2>&1 || cp $< $@ $(obj)/generated-helpers-wrappers.h-timestamp: $(SRC_PATH)/trace-events = $(BUILD_DIR)/config-host.mak $(tracetool-y) @@ -132,10 +146,12 @@ $(obj)/generated-helpers.c-timestamp: $(SRC_PATH)/t= race-events $(BUILD_DIR)/conf < $< > $@," GEN $(patsubst %-timestamp,%,$@)") =20 $(obj)/generated-helpers.o: $(obj)/generated-helpers.c +endif # MAKEFILE_GUARD_TRACE =20 target-obj-y +=3D generated-helpers.o =20 =20 +ifndef MAKEFILE_GUARD_TRACE $(obj)/generated-tcg-tracers.h: $(obj)/generated-tcg-tracers.h-timestamp @cmp $< $@ >/dev/null 2>&1 || cp $< $@ $(obj)/generated-tcg-tracers.h-timestamp: $(SRC_PATH)/trace-events $(BUI= LD_DIR)/config-host.mak $(tracetool-y) @@ -143,6 +159,7 @@ $(obj)/generated-tcg-tracers.h-timestamp: $(SRC_PATH)= /trace-events $(BUILD_DIR)/ --format=3Dtcg-h \ --backend=3D$(TRACE_BACKENDS) \ < $< > $@," GEN $(patsubst %-timestamp,%,$@)") +endif # MAKEFILE_GUARD_TRACE =20 =20 ###################################################################### @@ -152,4 +169,13 @@ util-obj-$(CONFIG_TRACE_SIMPLE) +=3D simple.o genera= ted-tracers.o util-obj-$(CONFIG_TRACE_FTRACE) +=3D ftrace.o util-obj-$(CONFIG_TRACE_UST) +=3D generated-ust.o util-obj-y +=3D control.o +target-obj-y +=3D control-target.o +stub-obj-y +=3D control-stub.o util-obj-y +=3D qmp.o + + +###################################################################### +# Avoid rule overrides when included from multiple top-level variables +ifndef MAKEFILE_GUARD_TRACE +MAKEFILE_GUARD_TRACE =3D 1 +endif diff --git a/trace/control-internal.h b/trace/control-internal.h index d1f99e3..2189063 100644 --- a/trace/control-internal.h +++ b/trace/control-internal.h @@ -10,10 +10,13 @@ #ifndef TRACE__CONTROL_INTERNAL_H #define TRACE__CONTROL_INTERNAL_H =20 +#include /* size_t */ + +#include "qom/cpu.h" =20 =20 extern TraceEvent trace_events[]; -extern bool trace_events_dstate[]; +extern size_t trace_events_dstate[]; extern int trace_events_enabled_count; =20 =20 @@ -22,6 +25,11 @@ static inline TraceEventID trace_event_count(void) return TRACE_EVENT_COUNT; } =20 +static inline TraceEventVCPUID trace_event_cpu_count(void) +{ + return TRACE_VCPU_EVENT_COUNT; +} + static inline TraceEvent *trace_event_id(TraceEventID id) { assert(id < trace_event_count()); @@ -61,7 +69,7 @@ static inline bool trace_event_get_state_static(TraceEv= ent *ev) static inline bool trace_event_get_state_dynamic_by_id(TraceEventID id) { /* it's on fast path, avoid consistency checks (asserts) */ - return unlikely(trace_events_enabled_count) && trace_events_dstate[i= d]; + return unlikely(trace_events_enabled_count) && (trace_events_dstate[= id] > 0); } =20 static inline bool trace_event_get_state_dynamic(TraceEvent *ev) @@ -73,13 +81,28 @@ static inline bool trace_event_get_state_dynamic(Trac= eEvent *ev) return trace_event_get_state_dynamic_by_id(id); } =20 -static inline void trace_event_set_state_dynamic(TraceEvent *ev, bool st= ate) +static inline bool trace_event_get_cpu_state_dynamic_by_cpu_id(CPUState = *cpu, + TraceEven= tVCPUID id) +{ + /* it's on fast path, avoid consistency checks (asserts) */ + if (unlikely(trace_events_enabled_count)) { + TRACE_VCPU_DSTATE_TYPE bit =3D ((TRACE_VCPU_DSTATE_TYPE)1) << id= ; + return cpu->trace_dstate & bit; + } else { + return false; + } +} + +static inline bool trace_event_get_cpu_state_dynamic(CPUState *cpu, + TraceEvent *ev) { - int id =3D trace_event_get_id(ev); + TraceEventVCPUID id; + assert(cpu !=3D NULL); assert(ev !=3D NULL); assert(trace_event_get_state_static(ev)); - trace_events_enabled_count +=3D state - trace_events_dstate[id]; - trace_events_dstate[id] =3D state; + assert(trace_event_get_cpu_id(ev) !=3D trace_event_cpu_count()); + id =3D trace_event_get_cpu_id(ev); + return trace_event_get_cpu_state_dynamic_by_cpu_id(cpu, id); } =20 #endif /* TRACE__CONTROL_INTERNAL_H */ diff --git a/trace/control-stub.c b/trace/control-stub.c new file mode 100644 index 0000000..858b13e --- /dev/null +++ b/trace/control-stub.c @@ -0,0 +1,29 @@ +/* + * Interface for configuring and controlling the state of tracing events. + * + * Copyright (C) 2014-2016 Llu=C3=ADs Vilanova + * + * This work is licensed under the terms of the GNU GPL, version 2 or la= ter. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "trace/control.h" + + +void trace_event_set_state_dynamic(TraceEvent *ev, bool state) +{ + TraceEventID id; + assert(ev !=3D NULL); + assert(trace_event_get_state_static(ev)); + id =3D trace_event_get_id(ev); + trace_events_enabled_count +=3D state - trace_events_dstate[id]; + trace_events_dstate[id] =3D state; +} + +void trace_event_set_cpu_state_dynamic(CPUState *cpu, + TraceEvent *ev, bool state) +{ + /* should never be called on non-target binaries */ + abort(); +} diff --git a/trace/control-target.c b/trace/control-target.c new file mode 100644 index 0000000..5ae672e --- /dev/null +++ b/trace/control-target.c @@ -0,0 +1,58 @@ +/* + * Interface for configuring and controlling the state of tracing events. + * + * Copyright (C) 2014-2016 Llu=C3=ADs Vilanova + * + * This work is licensed under the terms of the GNU GPL, version 2 or la= ter. + * See the COPYING file in the top-level directory. + */ + +#include "qemu/osdep.h" +#include "cpu.h" +#include "trace/control.h" +#include "translate-all.h" + + +void trace_event_set_state_dynamic(TraceEvent *ev, bool state) +{ + CPUState *cpu; + assert(ev !=3D NULL); + assert(trace_event_get_state_static(ev)); + if (trace_event_get_cpu_id(ev) !=3D trace_event_cpu_count()) { + CPU_FOREACH(cpu) { + trace_event_set_cpu_state_dynamic(cpu, ev, state); + } + } else { + TraceEventID id =3D trace_event_get_id(ev); + trace_events_enabled_count +=3D state - trace_events_dstate[id]; + trace_events_dstate[id] =3D state; + } +} + +void trace_event_set_cpu_state_dynamic(CPUState *cpu, + TraceEvent *ev, bool state) +{ + TraceEventID id; + TraceEventVCPUID cpu_id; + TRACE_VCPU_DSTATE_TYPE bit; + bool state_pre; + assert(cpu !=3D NULL); + assert(ev !=3D NULL); + assert(trace_event_get_state_static(ev)); + assert(trace_event_get_cpu_id(ev) !=3D trace_event_cpu_count()); + id =3D trace_event_get_id(ev); + cpu_id =3D trace_event_get_cpu_id(ev); + bit =3D ((TRACE_VCPU_DSTATE_TYPE)1) << cpu_id; + state_pre =3D cpu->trace_dstate & bit; + if ((state_pre =3D=3D 0) !=3D (state =3D=3D 0)) { + if (state) { + trace_events_enabled_count++; + cpu->trace_dstate |=3D bit; + trace_events_dstate[id]++; + } else { + trace_events_enabled_count--; + cpu->trace_dstate &=3D ~bit; + trace_events_dstate[id]--; + } + } +} diff --git a/trace/control.c b/trace/control.c index 20d3370..501dc29 100644 --- a/trace/control.c +++ b/trace/control.c @@ -1,7 +1,7 @@ /* * Interface for configuring and controlling the state of tracing events. * - * Copyright (C) 2011-2014 Llu=C3=ADs Vilanova + * Copyright (C) 2011-2016 Llu=C3=ADs Vilanova * * This work is licensed under the terms of the GNU GPL, version 2 or la= ter. * See the COPYING file in the top-level directory. @@ -21,7 +21,10 @@ #include "qemu/error-report.h" =20 int trace_events_enabled_count; -bool trace_events_dstate[TRACE_EVENT_COUNT]; +/* With the 'vcpu' property, counts how many vCPUs have it enabled. */ +size_t trace_events_dstate[TRACE_EVENT_COUNT]; +/* Marks events for late vCPU state init */ +static bool trace_events_dstate_init[TRACE_EVENT_COUNT]; =20 TraceEvent *trace_event_name(const char *name) { @@ -110,7 +113,10 @@ static void do_trace_enable_events(const char *line_= buf) TraceEvent *ev =3D NULL; while ((ev =3D trace_event_pattern(line_ptr, ev)) !=3D NULL) { if (trace_event_get_state_static(ev)) { + /* start tracing */ trace_event_set_state_dynamic(ev, enable); + /* mark for late vCPU init */ + trace_events_dstate_init[ev->id] =3D true; } } } else { @@ -122,7 +128,10 @@ static void do_trace_enable_events(const char *line_= buf) error_report("WARNING: trace event '%s' is not traceable", line_ptr); } else { + /* start tracing */ trace_event_set_state_dynamic(ev, enable); + /* mark for late vCPU init */ + trace_events_dstate_init[ev->id] =3D true; } } } @@ -212,3 +221,15 @@ bool trace_init_backends(void) =20 return true; } + +void trace_init_vcpu_events(void) +{ + TraceEvent *ev =3D NULL; + while ((ev =3D trace_event_pattern("*", ev)) !=3D NULL) { + if (trace_event_get_cpu_id(ev) !=3D trace_event_cpu_count() && + trace_event_get_state_static(ev) && + trace_events_dstate_init[ev->id]) { + trace_event_set_state_dynamic(ev, true); + } + } +} diff --git a/trace/control.h b/trace/control.h index f014e11..fb7d18e 100644 --- a/trace/control.h +++ b/trace/control.h @@ -77,6 +77,13 @@ static bool trace_event_is_pattern(const char *str); */ static TraceEventID trace_event_count(void); =20 +/** + * trace_event_cpu_count: + * + * Return the number of events with the 'vcpu' property. + */ +static TraceEventVCPUID trace_event_cpu_count(void); + =20 =20 /** @@ -118,6 +125,23 @@ static const char * trace_event_get_name(TraceEvent = *ev); ((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id)) =20 /** + * trace_event_get_cpu_state: + * @cpu: Target vCPU. + * @id: Event identifier (TraceEventID). + * @cpu_id: Per-vCPU event identifier (TraceEventVCPUID). + * + * Get the tracing state of an event (both static and dynamic) for the g= iven + * vCPU. + * + * If the event has the disabled property, the check will have no perfor= mance + * impact. + * + * As a down side, you must always use an immediate #TraceEventID value. + */ +#define trace_event_get_cpu_state(cpu, id, cpu_id) = \ + ((id ##_ENABLED) && trace_event_get_cpu_state_dynamic_by_cpu_id(cpu,= cpu_id)) + +/** * trace_event_get_state_static: * @id: Event identifier. * @@ -132,10 +156,19 @@ static bool trace_event_get_state_static(TraceEvent= *ev); * trace_event_get_state_dynamic: * * Get the dynamic tracing state of an event. + * + * If the event has the 'vcpu' property, gets the OR'ed state of all vCP= Us. */ static bool trace_event_get_state_dynamic(TraceEvent *ev); =20 /** + * trace_event_get_cpu_state_dynamic: + * + * Get the dynamic tracing state of an event for the given vCPU. + */ +static bool trace_event_get_cpu_state_dynamic(CPUState *cpu, TraceEvent = *ev); + +/** * trace_event_set_state: * * Set the tracing state of an event (only if possible). @@ -149,13 +182,38 @@ static bool trace_event_get_state_dynamic(TraceEven= t *ev); } while (0) =20 /** + * trace_event_set_cpu_state: + * + * Set the tracing state of an event for the given vCPU (only if not dis= abled). + */ +#define trace_event_set_cpu_state(cpu, id, state) \ + do { \ + if ((id ##_ENABLED)) { \ + TraceEvent *_e =3D trace_event_id(id); \ + trace_event_set_cpu_state_dynamic(cpu, _e, state); \ + } \ + } while (0) + +/** * trace_event_set_state_dynamic: * * Set the dynamic tracing state of an event. * + * If the event has the 'vcpu' property, sets the state on all vCPUs. + * * Pre-condition: trace_event_get_state_static(ev) =3D=3D true */ -static void trace_event_set_state_dynamic(TraceEvent *ev, bool state); +void trace_event_set_state_dynamic(TraceEvent *ev, bool state); + +/** + * trace_event_set_cpu_state_dynamic: + * + * Set the dynamic tracing state of an event for the given vCPU. + * + * Pre-condition: trace_event_get_cpu_state_static(ev) =3D=3D true + */ +void trace_event_set_cpu_state_dynamic(CPUState *cpu, + TraceEvent *ev, bool state); =20 =20 =20 @@ -208,6 +266,14 @@ void trace_list_events(void); */ void trace_enable_events(const char *line_buf); =20 +/** + * trace_init_vcpu_events: + * + * Re-synchronize initial event state with vCPUs (which can be created a= fter + * trace_init_events()). + */ +void trace_init_vcpu_events(void); + =20 #include "trace/control-internal.h" =20 diff --git a/vl.c b/vl.c index adeddd9..7a1d7f6 100644 --- a/vl.c +++ b/vl.c @@ -4642,6 +4642,7 @@ int main(int argc, char **argv, char **envp) =20 os_setup_post(); =20 + trace_init_vcpu_events(); main_loop(); replay_disable_events(); =20