[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 1/3] trace: Properly initialize dynamic event sta
From: |
Lluís Vilanova |
Subject: |
[Qemu-devel] [PATCH v2 1/3] trace: Properly initialize dynamic event states in hot-plugged vCPUs |
Date: |
Thu, 15 Sep 2016 17:25:36 +0200 |
User-agent: |
StGit/0.17.1-dirty |
Every time a vCPU is hot-plugged, it will "inherit" its tracing state
from the global state array. That is, if *any* existing vCPU has an
event enabled, new vCPUs will have too.
Signed-off-by: Lluís Vilanova <address@hidden>
---
bsd-user/main.c | 1 -
linux-user/main.c | 1 -
qom/cpu.c | 3 +++
stubs/trace-control.c | 6 ++++++
trace/control-target.c | 37 +++++++++++++++++++++++++++++++++++++
trace/control.c | 15 +++++----------
trace/control.h | 19 ++++++++-----------
vl.c | 1 -
8 files changed, 59 insertions(+), 24 deletions(-)
diff --git a/bsd-user/main.c b/bsd-user/main.c
index 0fb08e4..f58bb43 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -1133,7 +1133,6 @@ 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/linux-user/main.c b/linux-user/main.c
index f2f4d2f..b792c91 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -4810,7 +4810,6 @@ 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 2553247..7e2e523 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -333,6 +333,9 @@ static void cpu_common_realizefn(DeviceState *dev, Error
**errp)
cpu_synchronize_post_init(cpu);
cpu_resume(cpu);
}
+
+ /* NOTE: latest generic point where the cpu is fully relized */
+ trace_init_vcpu(cpu);
}
static void cpu_common_initfn(Object *obj)
diff --git a/stubs/trace-control.c b/stubs/trace-control.c
index 2dfcd9f..f765a02 100644
--- a/stubs/trace-control.c
+++ b/stubs/trace-control.c
@@ -44,3 +44,9 @@ void trace_event_set_vcpu_state_dynamic(CPUState *vcpu,
/* should never be called on non-target binaries */
abort();
}
+
+void trace_init_vcpu(CPUState *vcpu)
+{
+ /* should never be called on non-target binaries */
+ abort();
+}
diff --git a/trace/control-target.c b/trace/control-target.c
index 72081e2..3b7d99b 100644
--- a/trace/control-target.c
+++ b/trace/control-target.c
@@ -81,3 +81,40 @@ void trace_event_set_vcpu_state_dynamic(CPUState *vcpu,
}
}
}
+
+static bool adding_first_cpu(void)
+{
+ CPUState *cpu;
+ size_t count = 0;
+ CPU_FOREACH(cpu) {
+ count++;
+ if (count > 1) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void trace_init_vcpu(CPUState *vcpu)
+{
+ TraceEvent *ev = NULL;
+
+ while ((ev = trace_event_pattern("*", ev)) != NULL) {
+ if (trace_event_is_vcpu(ev) &&
+ trace_event_get_state_static(ev) &&
+ trace_event_get_state_dynamic(ev)) {
+ TraceEventID id = trace_event_get_id(ev);
+ if (adding_first_cpu()) {
+ /* check preconditions */
+ assert(trace_events_dstate[id] == 1);
+ /* disable early-init state ... */
+ trace_events_dstate[id] = 0;
+ trace_events_enabled_count--;
+ /* ... and properly re-enable */
+ trace_event_set_vcpu_state_dynamic(vcpu, ev, true);
+ } else {
+ trace_event_set_vcpu_state_dynamic(vcpu, ev, true);
+ }
+ }
+ }
+}
diff --git a/trace/control.c b/trace/control.c
index 05d85ac..8fff534 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -270,21 +270,16 @@ char *trace_opt_parse(const char *optarg)
return trace_file;
}
-void trace_init_vcpu_events(void)
+void trace_fini_vcpu(CPUState *vcpu)
{
TraceEvent *ev = NULL;
+
while ((ev = trace_event_pattern("*", ev)) != NULL) {
if (trace_event_is_vcpu(ev) &&
trace_event_get_state_static(ev) &&
- trace_event_get_state_dynamic(ev)) {
- TraceEventID id = trace_event_get_id(ev);
- /* check preconditions */
- assert(trace_events_dstate[id] == 1);
- /* disable early-init state ... */
- trace_events_dstate[id] = 0;
- trace_events_enabled_count--;
- /* ... and properly re-enable */
- trace_event_set_state_dynamic(ev, true);
+ trace_event_get_vcpu_state_dynamic(vcpu, ev)) {
+ /* must disable to affect the global counter */
+ trace_event_set_vcpu_state_dynamic(vcpu, ev, false);
}
}
}
diff --git a/trace/control.h b/trace/control.h
index 27a16fc..a22d112 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -239,6 +239,14 @@ bool trace_init_backends(void);
void trace_init_file(const char *file);
/**
+ * trace_init_vcpu:
+ * @vcpu: Added vCPU.
+ *
+ * Set initial dynamic event state for a hot-plugged vCPU.
+ */
+void trace_init_vcpu(CPUState *vcpu);
+
+/**
* trace_list_events:
*
* List all available events.
@@ -269,17 +277,6 @@ extern QemuOptsList qemu_trace_opts;
*/
char *trace_opt_parse(const char *optarg);
-/**
- * trace_init_vcpu_events:
- *
- * Re-synchronize initial event state with vCPUs (which can be created after
- * trace_init_events()).
- *
- * Precondition: event states won't be changed between trace_enable_events()
and
- * trace_init_vcpu_events() (e.g., through QMP).
- */
-void trace_init_vcpu_events(void);
-
#include "trace/control-internal.h"
diff --git a/vl.c b/vl.c
index ee557a1..5d4d837 100644
--- a/vl.c
+++ b/vl.c
@@ -4613,7 +4613,6 @@ int main(int argc, char **argv, char **envp)
os_setup_post();
- trace_init_vcpu_events();
main_loop();
replay_disable_events();