[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 12/20] trace: provide mechanism for registering tr
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL v2 12/20] trace: provide mechanism for registering trace events |
Date: |
Wed, 12 Oct 2016 10:47:30 +0200 |
From: "Daniel P. Berrange" <address@hidden>
Remove the notion of there being a single global array
of trace events, by introducing a method for registering
groups of events.
The module_call_init() needs to be invoked at the start
of any program that wants to make use of the trace
support. Currently this covers system emulators qemu-nbd,
qemu-img and qemu-io.
[Squashed the following fix from Daniel P. Berrange
<address@hidden>:
linux-user/bsd-user: initialize trace events subsystem
The bsd-user/linux-user programs make use of the CPU emulation
code and this now requires that the trace events subsystem
is enabled, otherwise it'll crash trying to allocate an empty
trace events bitmap for the CPU object.
--Stefan]
Reviewed-by: Stefan Hajnoczi <address@hidden>
Reviewed-by: LluĂs Vilanova <address@hidden>
Signed-off-by: Daniel P. Berrange <address@hidden>
Message-id: address@hidden
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
bsd-user/main.c | 1 +
include/qemu/module.h | 2 ++
linux-user/main.c | 1 +
qemu-img.c | 1 +
qemu-io.c | 1 +
qemu-nbd.c | 1 +
scripts/tracetool/format/events_c.py | 6 ++++++
trace/control-internal.h | 4 +++-
trace/control.c | 25 +++++++++++++++++++++++--
trace/control.h | 1 +
vl.c | 2 ++
11 files changed, 42 insertions(+), 3 deletions(-)
diff --git a/bsd-user/main.c b/bsd-user/main.c
index d8367bd..4fd7b63 100644
--- a/bsd-user/main.c
+++ b/bsd-user/main.c
@@ -740,6 +740,7 @@ int main(int argc, char **argv)
if (argc <= 1)
usage();
+ module_call_init(MODULE_INIT_TRACE);
qemu_init_cpu_list();
module_call_init(MODULE_INIT_QOM);
diff --git a/include/qemu/module.h b/include/qemu/module.h
index dc2c9d4..877cca7 100644
--- a/include/qemu/module.h
+++ b/include/qemu/module.h
@@ -44,6 +44,7 @@ typedef enum {
MODULE_INIT_OPTS,
MODULE_INIT_QAPI,
MODULE_INIT_QOM,
+ MODULE_INIT_TRACE,
MODULE_INIT_MAX
} module_init_type;
@@ -51,6 +52,7 @@ typedef enum {
#define opts_init(function) module_init(function, MODULE_INIT_OPTS)
#define qapi_init(function) module_init(function, MODULE_INIT_QAPI)
#define type_init(function) module_init(function, MODULE_INIT_QOM)
+#define trace_init(function) module_init(function, MODULE_INIT_TRACE)
#define block_module_load_one(lib) module_load_one("block-", lib)
diff --git a/linux-user/main.c b/linux-user/main.c
index 9e4b430..0e31dad 100644
--- a/linux-user/main.c
+++ b/linux-user/main.c
@@ -4158,6 +4158,7 @@ int main(int argc, char **argv, char **envp)
int ret;
int execfd;
+ module_call_init(MODULE_INIT_TRACE);
qemu_init_cpu_list();
module_call_init(MODULE_INIT_QOM);
diff --git a/qemu-img.c b/qemu-img.c
index ceffefe..02c07b9 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -4165,6 +4165,7 @@ int main(int argc, char **argv)
signal(SIGPIPE, SIG_IGN);
#endif
+ module_call_init(MODULE_INIT_TRACE);
error_set_progname(argv[0]);
qemu_init_exec_dir(argv[0]);
diff --git a/qemu-io.c b/qemu-io.c
index db129ea..23a229f 100644
--- a/qemu-io.c
+++ b/qemu-io.c
@@ -467,6 +467,7 @@ int main(int argc, char **argv)
signal(SIGPIPE, SIG_IGN);
#endif
+ module_call_init(MODULE_INIT_TRACE);
progname = basename(argv[0]);
qemu_init_exec_dir(argv[0]);
diff --git a/qemu-nbd.c b/qemu-nbd.c
index 705b95e..cca4a98 100644
--- a/qemu-nbd.c
+++ b/qemu-nbd.c
@@ -533,6 +533,7 @@ int main(int argc, char **argv)
sa_sigterm.sa_handler = termsig_handler;
sigaction(SIGTERM, &sa_sigterm, NULL);
+ module_call_init(MODULE_INIT_TRACE);
qcrypto_init(&error_fatal);
module_call_init(MODULE_INIT_QOM);
diff --git a/scripts/tracetool/format/events_c.py
b/scripts/tracetool/format/events_c.py
index 40ae395..8817555 100644
--- a/scripts/tracetool/format/events_c.py
+++ b/scripts/tracetool/format/events_c.py
@@ -60,3 +60,9 @@ def generate(events, backend):
out(' NULL,',
'};',
'')
+
+ out('static void trace_register_events(void)',
+ '{',
+ ' trace_event_register_group(trace_events);',
+ '}',
+ 'trace_init(trace_register_events)')
diff --git a/trace/control-internal.h b/trace/control-internal.h
index 9abbc96..a9d395a 100644
--- a/trace/control-internal.h
+++ b/trace/control-internal.h
@@ -15,7 +15,6 @@
#include "qom/cpu.h"
-extern TraceEvent *trace_events[];
extern int trace_events_enabled_count;
@@ -83,4 +82,7 @@ static inline bool
trace_event_get_vcpu_state_dynamic(CPUState *vcpu,
return trace_event_get_vcpu_state_dynamic_by_vcpu_id(vcpu, vcpu_id);
}
+
+void trace_event_register_group(TraceEvent **events);
+
#endif /* TRACE__CONTROL_INTERNAL_H */
diff --git a/trace/control.c b/trace/control.c
index 6b32511..a231327 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -29,6 +29,13 @@
int trace_events_enabled_count;
+typedef struct TraceEventGroup {
+ TraceEvent **events;
+} TraceEventGroup;
+
+static TraceEventGroup *event_groups;
+static size_t nevent_groups;
+
QemuOptsList qemu_trace_opts = {
.name = "trace",
.implied_opt_name = "enable",
@@ -50,6 +57,14 @@ QemuOptsList qemu_trace_opts = {
};
+void trace_event_register_group(TraceEvent **events)
+{
+ event_groups = g_renew(TraceEventGroup, event_groups, nevent_groups + 1);
+ event_groups[nevent_groups].events = events;
+ nevent_groups++;
+}
+
+
TraceEvent *trace_event_name(const char *name)
{
assert(name != NULL);
@@ -100,14 +115,20 @@ static bool pattern_glob(const char *pat, const char *ev)
void trace_event_iter_init(TraceEventIter *iter, const char *pattern)
{
iter->event = 0;
+ iter->group = 0;
iter->pattern = pattern;
}
TraceEvent *trace_event_iter_next(TraceEventIter *iter)
{
- while (trace_events[iter->event] != NULL) {
- TraceEvent *ev = trace_events[iter->event];
+ while (iter->group < nevent_groups &&
+ event_groups[iter->group].events[iter->event] != NULL) {
+ TraceEvent *ev = event_groups[iter->group].events[iter->event];
iter->event++;
+ if (event_groups[iter->group].events[iter->event] == NULL) {
+ iter->event = 0;
+ iter->group++;
+ }
if (!iter->pattern ||
pattern_glob(iter->pattern,
trace_event_get_name(ev))) {
diff --git a/trace/control.h b/trace/control.h
index cccd2a2..3f30a0c 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -15,6 +15,7 @@
typedef struct TraceEventIter {
size_t event;
+ size_t group;
const char *pattern;
} TraceEventIter;
diff --git a/vl.c b/vl.c
index eb3c5ee..c657acd 100644
--- a/vl.c
+++ b/vl.c
@@ -3024,6 +3024,8 @@ int main(int argc, char **argv, char **envp)
Error *err = NULL;
bool list_data_dirs = false;
+ module_call_init(MODULE_INIT_TRACE);
+
qemu_init_cpu_list();
qemu_init_cpu_loop();
qemu_mutex_lock_iothread();
--
2.7.4
- [Qemu-devel] [PULL v2 04/20] trace: remove some now unused functions, (continued)
- [Qemu-devel] [PULL v2 04/20] trace: remove some now unused functions, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 02/20] trace: add trace event iterator APIs, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 03/20] trace: convert code to use event iterators, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 05/20] trace: remove global 'uint16 dstate[]' array, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 06/20] trace: remove duplicate control.h includes in generated-tracers.h, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 07/20] trace: break circular dependency in event-internal.h, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 08/20] trace: give each trace event a named TraceEvent struct, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 09/20] trace: remove the TraceEventID and TraceEventVCPUID enums, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 10/20] trace: emit name <-> ID mapping in simpletrace header, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 11/20] trace: don't abort qemu if ftrace can't be initialized, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 12/20] trace: provide mechanism for registering trace events,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL v2 13/20] trace: dynamically allocate trace_dstate in CPUState, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 14/20] trace: dynamically allocate event IDs at runtime, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 15/20] trace: get rid of generated-events.h/generated-events.c, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 16/20] trace: rename _read_events to read_events, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 17/20] trace: push reading of events up a level to tracetool main, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 18/20] trace: pass trace-events to tracetool as a positional param, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 20/20] trace: Add missing execution mode of guest events, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 19/20] trace: introduce a formal group name for trace events, Stefan Hajnoczi, 2016/10/12