trace: remove the TraceEventID and TraceEventVCPUID enums

The TraceEventID and TraceEventVCPUID enums constants are
no longer actually used for anything critical.

The TRACE_EVENT_COUNT limit is used to determine the size
of the TraceEvents array, and can be removed if we just
NULL terminate the array instead.

The TRACE_VCPU_EVENT_COUNT limit is used as a magic value
for marking non-vCPU events, and also for declaring the
size of the trace dstate mask in the CPUState struct.
The former usage can be replaced by a dedicated constant
TRACE_EVENT_VCPU_NONE, defined as (uint32_t)-1. For the
latter usage, we can simply define a constant for the
number of VCPUs, avoiding the need for the full enum.

The only other usages of the enum values can be replaced
by accesing the id/vcpu_id fields via the named TraceEvent
structs.

Reviewed-by: Lluís Vilanova <vilanova@ac.upc.edu>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-id: 1475588159-30598-11-git-send-email-berrange@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Daniel P. Berrange 2016-10-04 14:35:49 +01:00 committed by Stefan Hajnoczi
parent 79218be42b
commit ef4c9fc854
11 changed files with 48 additions and 65 deletions

View File

@ -80,11 +80,11 @@ def generate_c(event):
' return;', ' return;',
' }', ' }',
'', '',
' if (trace_record_start(&rec, %(event_id)s, %(size_str)s)) {', ' if (trace_record_start(&rec, %(event_obj)s.id, %(size_str)s)) {',
' return; /* Trace Buffer Full, Event Dropped ! */', ' return; /* Trace Buffer Full, Event Dropped ! */',
' }', ' }',
cond=cond, cond=cond,
event_id=event_id, event_obj=event.api(event.QEMU_EVENT),
size_str=sizestr) size_str=sizestr)
if len(event.args) > 0: if len(event.args) > 0:

View File

@ -28,11 +28,16 @@ def generate(events, backend):
for e in events: for e in events:
out('uint16_t %s;' % e.api(e.QEMU_DSTATE)) out('uint16_t %s;' % e.api(e.QEMU_DSTATE))
next_id = 0
next_vcpu_id = 0
for e in events: for e in events:
id = next_id
next_id += 1
if "vcpu" in e.properties: if "vcpu" in e.properties:
vcpu_id = "TRACE_VCPU_" + e.name.upper() vcpu_id = next_vcpu_id
next_vcpu_id += 1
else: else:
vcpu_id = "TRACE_VCPU_EVENT_COUNT" vcpu_id = "TRACE_VCPU_EVENT_NONE"
out('TraceEvent %(event)s = {', out('TraceEvent %(event)s = {',
' .id = %(id)s,', ' .id = %(id)s,',
' .vcpu_id = %(vcpu_id)s,', ' .vcpu_id = %(vcpu_id)s,',
@ -41,16 +46,17 @@ def generate(events, backend):
' .dstate = &%(dstate)s ', ' .dstate = &%(dstate)s ',
'};', '};',
event = e.api(e.QEMU_EVENT), event = e.api(e.QEMU_EVENT),
id = "TRACE_" + e.name.upper(), id = id,
vcpu_id = vcpu_id, vcpu_id = vcpu_id,
name = e.name, name = e.name,
sstate = "TRACE_%s_ENABLED" % e.name.upper(), sstate = "TRACE_%s_ENABLED" % e.name.upper(),
dstate = e.api(e.QEMU_DSTATE)) dstate = e.api(e.QEMU_DSTATE))
out('TraceEvent *trace_events[TRACE_EVENT_COUNT] = {') out('TraceEvent *trace_events[] = {')
for e in events: for e in events:
out(' &%(event)s,', event = e.api(e.QEMU_EVENT)) out(' &%(event)s,', event = e.api(e.QEMU_EVENT))
out('};', out(' NULL,',
'};',
'') '')

View File

@ -29,27 +29,12 @@ def generate(events, backend):
out('extern TraceEvent %(event)s;', out('extern TraceEvent %(event)s;',
event = e.api(e.QEMU_EVENT)) event = e.api(e.QEMU_EVENT))
# event identifiers
out('typedef enum {')
for e in events:
out(' TRACE_%s,' % e.name.upper())
out(' TRACE_EVENT_COUNT',
'} TraceEventID;')
for e in events: for e in events:
out('extern uint16_t %s;' % e.api(e.QEMU_DSTATE)) out('extern uint16_t %s;' % e.api(e.QEMU_DSTATE))
# per-vCPU event identifiers numvcpu = len([e for e in events if "vcpu" in e.properties])
out('typedef enum {')
for e in events: out("#define TRACE_VCPU_EVENT_COUNT %d" % numvcpu)
if "vcpu" in e.properties:
out(' TRACE_VCPU_%s,' % e.name.upper())
out(' TRACE_VCPU_EVENT_COUNT',
'} TraceEventVCPUID;')
# static state # static state
for e in events: for e in events:

View File

@ -32,8 +32,7 @@ def generate(events, backend):
if "vcpu" in e.properties: if "vcpu" in e.properties:
trace_cpu = next(iter(e.args))[1] trace_cpu = next(iter(e.args))[1]
cond = "trace_event_get_vcpu_state(%(cpu)s,"\ cond = "trace_event_get_vcpu_state(%(cpu)s,"\
" TRACE_%(id)s,"\ " TRACE_%(id)s)"\
" TRACE_VCPU_%(id)s)"\
% dict( % dict(
cpu=trace_cpu, cpu=trace_cpu,
id=e.name.upper()) id=e.name.upper())

View File

@ -25,20 +25,20 @@ static inline bool trace_event_is_pattern(const char *str)
return strchr(str, '*') != NULL; return strchr(str, '*') != NULL;
} }
static inline TraceEventID trace_event_get_id(TraceEvent *ev) static inline uint32_t trace_event_get_id(TraceEvent *ev)
{ {
assert(ev != NULL); assert(ev != NULL);
return ev->id; return ev->id;
} }
static inline TraceEventVCPUID trace_event_get_vcpu_id(TraceEvent *ev) static inline uint32_t trace_event_get_vcpu_id(TraceEvent *ev)
{ {
return ev->vcpu_id; return ev->vcpu_id;
} }
static inline bool trace_event_is_vcpu(TraceEvent *ev) static inline bool trace_event_is_vcpu(TraceEvent *ev)
{ {
return ev->vcpu_id != TRACE_VCPU_EVENT_COUNT; return ev->vcpu_id != TRACE_VCPU_EVENT_NONE;
} }
static inline const char * trace_event_get_name(TraceEvent *ev) static inline const char * trace_event_get_name(TraceEvent *ev)
@ -62,12 +62,13 @@ static inline bool trace_event_get_state_dynamic(TraceEvent *ev)
return unlikely(trace_events_enabled_count) && *ev->dstate; return unlikely(trace_events_enabled_count) && *ev->dstate;
} }
static inline bool trace_event_get_vcpu_state_dynamic_by_vcpu_id(CPUState *vcpu, static inline bool
TraceEventVCPUID id) trace_event_get_vcpu_state_dynamic_by_vcpu_id(CPUState *vcpu,
uint32_t vcpu_id)
{ {
/* it's on fast path, avoid consistency checks (asserts) */ /* it's on fast path, avoid consistency checks (asserts) */
if (unlikely(trace_events_enabled_count)) { if (unlikely(trace_events_enabled_count)) {
return test_bit(id, vcpu->trace_dstate); return test_bit(vcpu_id, vcpu->trace_dstate);
} else { } else {
return false; return false;
} }
@ -76,10 +77,10 @@ static inline bool trace_event_get_vcpu_state_dynamic_by_vcpu_id(CPUState *vcpu,
static inline bool trace_event_get_vcpu_state_dynamic(CPUState *vcpu, static inline bool trace_event_get_vcpu_state_dynamic(CPUState *vcpu,
TraceEvent *ev) TraceEvent *ev)
{ {
TraceEventVCPUID id; uint32_t vcpu_id;
assert(trace_event_is_vcpu(ev)); assert(trace_event_is_vcpu(ev));
id = trace_event_get_vcpu_id(ev); vcpu_id = trace_event_get_vcpu_id(ev);
return trace_event_get_vcpu_state_dynamic_by_vcpu_id(vcpu, id); return trace_event_get_vcpu_state_dynamic_by_vcpu_id(vcpu, vcpu_id);
} }
#endif /* TRACE__CONTROL_INTERNAL_H */ #endif /* TRACE__CONTROL_INTERNAL_H */

View File

@ -60,7 +60,7 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state)
void trace_event_set_vcpu_state_dynamic(CPUState *vcpu, void trace_event_set_vcpu_state_dynamic(CPUState *vcpu,
TraceEvent *ev, bool state) TraceEvent *ev, bool state)
{ {
TraceEventVCPUID vcpu_id; uint32_t vcpu_id;
bool state_pre; bool state_pre;
assert(trace_event_get_state_static(ev)); assert(trace_event_get_state_static(ev));
assert(trace_event_is_vcpu(ev)); assert(trace_event_is_vcpu(ev));

View File

@ -105,7 +105,7 @@ void trace_event_iter_init(TraceEventIter *iter, const char *pattern)
TraceEvent *trace_event_iter_next(TraceEventIter *iter) TraceEvent *trace_event_iter_next(TraceEventIter *iter)
{ {
while (iter->event < TRACE_EVENT_COUNT) { while (trace_events[iter->event] != NULL) {
TraceEvent *ev = trace_events[iter->event]; TraceEvent *ev = trace_events[iter->event];
iter->event++; iter->event++;
if (!iter->pattern || if (!iter->pattern ||

View File

@ -18,17 +18,6 @@ typedef struct TraceEventIter {
const char *pattern; const char *pattern;
} TraceEventIter; } TraceEventIter;
/**
* TraceEventID:
*
* Unique tracing event identifier.
*
* These are named as 'TRACE_${EVENT_NAME}'.
*
* See also: "trace/generated-events.h"
*/
enum TraceEventID;
/** /**
* trace_event_iter_init: * trace_event_iter_init:
@ -76,17 +65,17 @@ static bool trace_event_is_pattern(const char *str);
* *
* Get the identifier of an event. * Get the identifier of an event.
*/ */
static TraceEventID trace_event_get_id(TraceEvent *ev); static uint32_t trace_event_get_id(TraceEvent *ev);
/** /**
* trace_event_get_vcpu_id: * trace_event_get_vcpu_id:
* *
* Get the per-vCPU identifier of an event. * Get the per-vCPU identifier of an event.
* *
* Special value #TRACE_VCPU_EVENT_COUNT means the event is not vCPU-specific * Special value #TRACE_VCPU_EVENT_NONE means the event is not vCPU-specific
* (does not have the "vcpu" property). * (does not have the "vcpu" property).
*/ */
static TraceEventVCPUID trace_event_get_vcpu_id(TraceEvent *ev); static uint32_t trace_event_get_vcpu_id(TraceEvent *ev);
/** /**
* trace_event_is_vcpu: * trace_event_is_vcpu:
@ -104,14 +93,12 @@ static const char * trace_event_get_name(TraceEvent *ev);
/** /**
* trace_event_get_state: * trace_event_get_state:
* @id: Event identifier. * @id: Event identifier name.
* *
* Get the tracing state of an event (both static and dynamic). * Get the tracing state of an event (both static and dynamic).
* *
* If the event has the disabled property, the check will have no performance * If the event has the disabled property, the check will have no performance
* impact. * impact.
*
* As a down side, you must always use an immediate #TraceEventID value.
*/ */
#define trace_event_get_state(id) \ #define trace_event_get_state(id) \
((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id)) ((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id))
@ -119,19 +106,18 @@ static const char * trace_event_get_name(TraceEvent *ev);
/** /**
* trace_event_get_vcpu_state: * trace_event_get_vcpu_state:
* @vcpu: Target vCPU. * @vcpu: Target vCPU.
* @id: Event identifier (TraceEventID). * @id: Event identifier name.
* @vcpu_id: Per-vCPU event identifier (TraceEventVCPUID).
* *
* Get the tracing state of an event (both static and dynamic) for the given * Get the tracing state of an event (both static and dynamic) for the given
* vCPU. * vCPU.
* *
* If the event has the disabled property, the check will have no performance * If the event has the disabled property, the check will have no performance
* impact. * impact.
*
* As a down side, you must always use an immediate #TraceEventID value.
*/ */
#define trace_event_get_vcpu_state(vcpu, id, vcpu_id) \ #define trace_event_get_vcpu_state(vcpu, id) \
((id ##_ENABLED) && trace_event_get_vcpu_state_dynamic_by_vcpu_id(vcpu, vcpu_id)) ((id ##_ENABLED) && \
trace_event_get_vcpu_state_dynamic_by_vcpu_id( \
vcpu, _ ## id ## _EVENT.vcpu_id))
/** /**
* trace_event_get_state_static: * trace_event_get_state_static:

View File

@ -10,6 +10,12 @@
#ifndef TRACE__EVENT_INTERNAL_H #ifndef TRACE__EVENT_INTERNAL_H
#define TRACE__EVENT_INTERNAL_H #define TRACE__EVENT_INTERNAL_H
/*
* Special value for TraceEvent.vcpu_id field to indicate
* that the event is not VCPU specific
*/
#define TRACE_VCPU_EVENT_NONE ((uint32_t)-1)
/** /**
* TraceEvent: * TraceEvent:
* @id: Unique event identifier. * @id: Unique event identifier.

View File

@ -17,8 +17,8 @@
#include "trace/control.h" #include "trace/control.h"
#include "trace/simple.h" #include "trace/simple.h"
/** Trace file header event ID */ /** Trace file header event ID, picked to avoid conflict with real event IDs */
#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with TraceEventIDs */ #define HEADER_EVENT_ID (~(uint64_t)0)
/** Trace file magic number */ /** Trace file magic number */
#define HEADER_MAGIC 0xf2b177cb0aa429b4ULL #define HEADER_MAGIC 0xf2b177cb0aa429b4ULL
@ -58,7 +58,7 @@ static char *trace_file_name;
/* * Trace buffer entry */ /* * Trace buffer entry */
typedef struct { typedef struct {
uint64_t event; /* TraceEventID */ uint64_t event; /* event ID value */
uint64_t timestamp_ns; uint64_t timestamp_ns;
uint32_t length; /* in bytes */ uint32_t length; /* in bytes */
uint32_t pid; uint32_t pid;
@ -202,7 +202,7 @@ void trace_record_write_str(TraceBufferRecord *rec, const char *s, uint32_t slen
rec->rec_off = write_to_buffer(rec->rec_off, (void*)s, slen); rec->rec_off = write_to_buffer(rec->rec_off, (void*)s, slen);
} }
int trace_record_start(TraceBufferRecord *rec, TraceEventID event, size_t datasize) int trace_record_start(TraceBufferRecord *rec, uint32_t event, size_t datasize)
{ {
unsigned int idx, rec_off, old_idx, new_idx; unsigned int idx, rec_off, old_idx, new_idx;
uint32_t rec_len = sizeof(TraceRecord) + datasize; uint32_t rec_len = sizeof(TraceRecord) + datasize;

View File

@ -33,7 +33,7 @@ typedef struct {
* *
* @arglen number of bytes required for arguments * @arglen number of bytes required for arguments
*/ */
int trace_record_start(TraceBufferRecord *rec, TraceEventID id, size_t arglen); int trace_record_start(TraceBufferRecord *rec, uint32_t id, size_t arglen);
/** /**
* Append a 64-bit argument to a trace record * Append a 64-bit argument to a trace record