mirror of https://github.com/xemu-project/xemu.git
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:
parent
79218be42b
commit
ef4c9fc854
|
@ -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:
|
||||||
|
|
|
@ -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,',
|
||||||
|
'};',
|
||||||
'')
|
'')
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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 ||
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue