From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40951) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bX91M-0006K6-5b for qemu-devel@nongnu.org; Tue, 09 Aug 2016 11:32:50 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bX91J-0005e2-0l for qemu-devel@nongnu.org; Tue, 09 Aug 2016 11:32:48 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49552) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bX91I-0005dl-OW for qemu-devel@nongnu.org; Tue, 09 Aug 2016 11:32:44 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5F6BA83F47 for ; Tue, 9 Aug 2016 15:32:44 +0000 (UTC) From: "Daniel P. Berrange" Date: Tue, 9 Aug 2016 16:31:36 +0100 Message-Id: <1470756748-18933-9-git-send-email-berrange@redhat.com> In-Reply-To: <1470756748-18933-1-git-send-email-berrange@redhat.com> References: <1470756748-18933-1-git-send-email-berrange@redhat.com> Subject: [Qemu-devel] [PATCH for-2.8 v1 08/60] trace: provide mechanism for registering trace events List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Stefan Hajnoczi , "Daniel P. Berrange" Remove the notion of there being a single global array of trace events, by introducing a method for registering groups of events. The ID values will only be required to be unique within the scope of a group 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 ++++++ scripts/tracetool/format/events_h.py | 1 + trace/control-internal.h | 5 ++++- trace/control.c | 38 +++++++++++++++++++++++++++++++----- trace/control.h | 1 + vl.c | 2 ++ 10 files changed, 52 insertions(+), 6 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 d2865a5..db97195 100644 --- a/qemu-img.c +++ b/qemu-img.c @@ -3822,6 +3822,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 e3571c2..ea1beed 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 4012063..9203377 100644 --- a/scripts/tracetool/format/events_c.py +++ b/scripts/tracetool/format/events_c.py @@ -42,3 +42,9 @@ def generate(events, backend): out('};', '') + + out('void trace_register_events(void)', + '{', + ' trace_event_register_group(trace_events, TRACE_EVENT_COUNT);', + '}', + 'trace_init(trace_register_events)') diff --git a/scripts/tracetool/format/events_h.py b/scripts/tracetool/format/events_h.py index a9da60b..291c183 100644 --- a/scripts/tracetool/format/events_h.py +++ b/scripts/tracetool/format/events_h.py @@ -56,5 +56,6 @@ def generate(events, backend): out('#define TRACE_%s_ENABLED %d' % (e.name.upper(), enabled)) out('#include "trace/event-internal.h"', + 'void trace_register_events(void);', '', '#endif /* TRACE__GENERATED_EVENTS_H */') diff --git a/trace/control-internal.h b/trace/control-internal.h index 7f31e39..e95b031 100644 --- a/trace/control-internal.h +++ b/trace/control-internal.h @@ -15,7 +15,6 @@ #include "qom/cpu.h" -extern TraceEvent trace_events[]; extern uint16_t trace_events_dstate[]; extern int trace_events_enabled_count; @@ -88,4 +87,8 @@ static inline bool trace_event_get_vcpu_state_dynamic(CPUState *vcpu, return trace_event_get_vcpu_state_dynamic_by_vcpu_id(vcpu, id); } + +void trace_event_register_group(TraceEvent *events, + size_t nevents); + #endif /* TRACE__CONTROL_INTERNAL_H */ diff --git a/trace/control.c b/trace/control.c index 7ba171b..4847a51 100644 --- a/trace/control.c +++ b/trace/control.c @@ -25,6 +25,15 @@ #include "monitor/monitor.h" int trace_events_enabled_count; + +typedef struct TraceEventGroup { + TraceEvent *events; + size_t nevents; +} TraceEventGroup; + +static TraceEventGroup *event_groups; +static size_t nevent_groups; + /* * Interpretation depends on wether the event has the 'vcpu' property: * - false: Boolean value indicating whether the event is active. @@ -55,6 +64,16 @@ QemuOptsList qemu_trace_opts = { }; +void trace_event_register_group(TraceEvent *events, + size_t nevents) +{ + event_groups = g_renew(TraceEventGroup, event_groups, nevent_groups + 1); + event_groups[nevent_groups].events = events; + event_groups[nevent_groups].nevents = nevents; + nevent_groups++; +} + + TraceEvent *trace_event_name(const char *name) { assert(name != NULL); @@ -105,6 +124,7 @@ 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; } @@ -112,18 +132,26 @@ TraceEvent *trace_event_iter_next(TraceEventIter *iter) { TraceEvent *ev; - if (iter->event >= TRACE_EVENT_COUNT) { + if (iter->group >= nevent_groups || + iter->event >= event_groups[iter->group].nevents) { return NULL; } - ev = &(trace_events[iter->event]); + ev = &(event_groups[iter->group].events[iter->event]); do { iter->event++; - } while (iter->event < TRACE_EVENT_COUNT && + if (iter->event >= event_groups[iter->group].nevents) { + iter->event = 0; + iter->group++; + } + } while (iter->group < nevent_groups && + iter->event < event_groups[iter->group].nevents && iter->pattern && - !pattern_glob(iter->pattern, - trace_event_get_name(&(trace_events[iter->event])))); + !pattern_glob( + iter->pattern, + trace_event_get_name( + &(event_groups[iter->group].events[iter->event])))); return ev; } diff --git a/trace/control.h b/trace/control.h index 3f00adc..81471ad 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 c4eeaff..f65deca 100644 --- a/vl.c +++ b/vl.c @@ -2964,6 +2964,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_loop(); qemu_mutex_lock_iothread(); -- 2.7.4