Re: [Qemu-devel] [PATCH v4 11/17] trace: provide mechanism for registering trace events
On Thu, Sep 22, 2016 at 02:44:11PM +0200, Lluís Vilanova wrote: > Daniel P Berrange writes: > > > Remove the notion of there being a single global array > > of trace events, by introducing a method for registering > > groups of events. > > > Signed-off-by: Daniel P. Berrange> > Except for the calls to module_call_init() (I did not check if they're all > necessary and sufficient): Every binary that can trigger tracepoints should have the module_call_init(). I'd done it for emulators, qemu-img, qemu-nbd, and qemu-io. I could tell which need it, since they're the ones that need to link to the trace.o files, otherwise you'll unresolved symbol errors. So I think what I have is correct. Regards, Daniel -- |: http://berrange.com -o-http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
Re: [Qemu-devel] [PATCH v4 11/17] trace: provide mechanism for registering trace events
Daniel P Berrange writes: > Remove the notion of there being a single global array > of trace events, by introducing a method for registering > groups of events. > Signed-off-by: Daniel P. BerrangeExcept for the calls to module_call_init() (I did not check if they're all necessary and sufficient): Reviewed-by: Lluís Vilanova > --- > include/qemu/module.h| 2 ++ > 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 ++ > 9 files changed, 40 insertions(+), 3 deletions(-) > diff --git a/include/qemu/module.h b/include/qemu/module.h > index 2370708..c700961 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) > void register_module_init(void (*fn)(void), module_init_type type); > void register_dso_module_init(void (*fn)(void), module_init_type type); > diff --git a/qemu-img.c b/qemu-img.c > index ea52486..bbe648a 100644 > --- a/qemu-img.c > +++ b/qemu-img.c > @@ -3824,6 +3824,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 99297a5..361880b 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, _sigterm, NULL); > +module_call_init(MODULE_INIT_TRACE); > qcrypto_init(_fatal); > module_call_init(MODULE_INIT_QOM); > diff --git a/scripts/tracetool/format/events_c.py > b/scripts/tracetool/format/events_c.py > index 325f4e0..766bc09 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 8bfbdfb..206906a 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 64aaede..7be654d 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] !=
[Qemu-devel] [PATCH v4 11/17] trace: provide mechanism for registering trace events
Remove the notion of there being a single global array of trace events, by introducing a method for registering groups of events. Signed-off-by: Daniel P. Berrange--- include/qemu/module.h| 2 ++ 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 ++ 9 files changed, 40 insertions(+), 3 deletions(-) diff --git a/include/qemu/module.h b/include/qemu/module.h index 2370708..c700961 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) void register_module_init(void (*fn)(void), module_init_type type); void register_dso_module_init(void (*fn)(void), module_init_type type); diff --git a/qemu-img.c b/qemu-img.c index ea52486..bbe648a 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -3824,6 +3824,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 99297a5..361880b 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, _sigterm, NULL); +module_call_init(MODULE_INIT_TRACE); qcrypto_init(_fatal); module_call_init(MODULE_INIT_QOM); diff --git a/scripts/tracetool/format/events_c.py b/scripts/tracetool/format/events_c.py index 325f4e0..766bc09 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 8bfbdfb..206906a 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 64aaede..7be654d 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 ||