Skip to content

Commit

Permalink
trace: track enabled events in a separate array
Browse files Browse the repository at this point in the history
This is more cache friendly on the fast path, where we already have
the event id available.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
  • Loading branch information
bonzini authored and stefanhaRH committed Feb 3, 2016
1 parent 43b48cf commit 585ec72
Show file tree
Hide file tree
Showing 5 changed files with 14 additions and 8 deletions.
2 changes: 1 addition & 1 deletion scripts/tracetool/format/events_c.py
Expand Up @@ -27,7 +27,7 @@ def generate(events, backend):
out('TraceEvent trace_events[TRACE_EVENT_COUNT] = {')

for e in events:
out(' { .id = %(id)s, .name = \"%(name)s\", .sstate = %(sstate)s, .dstate = 0 },',
out(' { .id = %(id)s, .name = \"%(name)s\", .sstate = %(sstate)s },',
id = "TRACE_" + e.name.upper(),
name = e.name,
sstate = "TRACE_%s_ENABLED" % e.name.upper())
Expand Down
15 changes: 11 additions & 4 deletions trace/control-internal.h
Expand Up @@ -14,6 +14,7 @@


extern TraceEvent trace_events[];
extern bool trace_events_dstate[];
extern int trace_events_enabled_count;


Expand Down Expand Up @@ -52,18 +53,24 @@ static inline bool trace_event_get_state_static(TraceEvent *ev)
return ev->sstate;
}

static inline bool trace_event_get_state_dynamic_by_id(int id)
{
return unlikely(trace_events_enabled_count) && trace_events_dstate[id];
}

static inline bool trace_event_get_state_dynamic(TraceEvent *ev)
{
assert(ev != NULL);
return unlikely(trace_events_enabled_count) && ev->dstate;
int id = trace_event_get_id(ev);
return trace_event_get_state_dynamic_by_id(id);
}

static inline void trace_event_set_state_dynamic(TraceEvent *ev, bool state)
{
int id = trace_event_get_id(ev);
assert(ev != NULL);
assert(trace_event_get_state_static(ev));
trace_events_enabled_count += state - ev->dstate;
ev->dstate = state;
trace_events_enabled_count += state - trace_events_dstate[id];
trace_events_dstate[id] = state;
}

#endif /* TRACE__CONTROL_INTERNAL_H */
1 change: 1 addition & 0 deletions trace/control.c
Expand Up @@ -17,6 +17,7 @@
#include "qemu/error-report.h"

int trace_events_enabled_count;
bool trace_events_dstate[TRACE_EVENT_COUNT];

TraceEvent *trace_event_name(const char *name)
{
Expand Down
2 changes: 1 addition & 1 deletion trace/control.h
Expand Up @@ -104,7 +104,7 @@ static const char * trace_event_get_name(TraceEvent *ev);
* As a down side, you must always use an immediate #TraceEventID value.
*/
#define trace_event_get_state(id) \
((id ##_ENABLED) && trace_event_get_state_dynamic(trace_event_id(id)))
((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id))

/**
* trace_event_get_state_static:
Expand Down
2 changes: 0 additions & 2 deletions trace/event-internal.h
Expand Up @@ -18,15 +18,13 @@
* @id: Unique event identifier.
* @name: Event name.
* @sstate: Static tracing state.
* @dstate: Dynamic tracing state.
*
* Opaque generic description of a tracing event.
*/
typedef struct TraceEvent {
TraceEventID id;
const char * name;
const bool sstate;
bool dstate;
} TraceEvent;


Expand Down

0 comments on commit 585ec72

Please sign in to comment.