fe4db84d49
Remove the notion of there being a single global array of trace events, by introducing a method for registering groups of events. The module_call_init() needs to be invoked at the start of any program that wants to make use of the trace support. Currently this covers system emulators qemu-nbd, qemu-img and qemu-io. [Squashed the following fix from Daniel P. Berrange <berrange@redhat.com>: linux-user/bsd-user: initialize trace events subsystem The bsd-user/linux-user programs make use of the CPU emulation code and this now requires that the trace events subsystem is enabled, otherwise it'll crash trying to allocate an empty trace events bitmap for the CPU object. --Stefan] Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Lluís Vilanova <vilanova@ac.upc.edu> Signed-off-by: Daniel P. Berrange <berrange@redhat.com> Message-id: 1475588159-30598-14-git-send-email-berrange@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
89 lines
2.2 KiB
C
89 lines
2.2 KiB
C
/*
|
|
* Interface for configuring and controlling the state of tracing events.
|
|
*
|
|
* Copyright (C) 2011-2016 Lluís Vilanova <vilanova@ac.upc.edu>
|
|
*
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
* See the COPYING file in the top-level directory.
|
|
*/
|
|
|
|
#ifndef TRACE__CONTROL_INTERNAL_H
|
|
#define TRACE__CONTROL_INTERNAL_H
|
|
|
|
#include <stddef.h> /* size_t */
|
|
|
|
#include "qom/cpu.h"
|
|
|
|
|
|
extern int trace_events_enabled_count;
|
|
|
|
|
|
static inline bool trace_event_is_pattern(const char *str)
|
|
{
|
|
assert(str != NULL);
|
|
return strchr(str, '*') != NULL;
|
|
}
|
|
|
|
static inline uint32_t trace_event_get_id(TraceEvent *ev)
|
|
{
|
|
assert(ev != NULL);
|
|
return ev->id;
|
|
}
|
|
|
|
static inline uint32_t trace_event_get_vcpu_id(TraceEvent *ev)
|
|
{
|
|
return ev->vcpu_id;
|
|
}
|
|
|
|
static inline bool trace_event_is_vcpu(TraceEvent *ev)
|
|
{
|
|
return ev->vcpu_id != TRACE_VCPU_EVENT_NONE;
|
|
}
|
|
|
|
static inline const char * trace_event_get_name(TraceEvent *ev)
|
|
{
|
|
assert(ev != NULL);
|
|
return ev->name;
|
|
}
|
|
|
|
static inline bool trace_event_get_state_static(TraceEvent *ev)
|
|
{
|
|
assert(ev != NULL);
|
|
return ev->sstate;
|
|
}
|
|
|
|
/* it's on fast path, avoid consistency checks (asserts) */
|
|
#define trace_event_get_state_dynamic_by_id(id) \
|
|
(unlikely(trace_events_enabled_count) && _ ## id ## _DSTATE)
|
|
|
|
static inline bool trace_event_get_state_dynamic(TraceEvent *ev)
|
|
{
|
|
return unlikely(trace_events_enabled_count) && *ev->dstate;
|
|
}
|
|
|
|
static inline bool
|
|
trace_event_get_vcpu_state_dynamic_by_vcpu_id(CPUState *vcpu,
|
|
uint32_t vcpu_id)
|
|
{
|
|
/* it's on fast path, avoid consistency checks (asserts) */
|
|
if (unlikely(trace_events_enabled_count)) {
|
|
return test_bit(vcpu_id, vcpu->trace_dstate);
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static inline bool trace_event_get_vcpu_state_dynamic(CPUState *vcpu,
|
|
TraceEvent *ev)
|
|
{
|
|
uint32_t vcpu_id;
|
|
assert(trace_event_is_vcpu(ev));
|
|
vcpu_id = trace_event_get_vcpu_id(ev);
|
|
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 */
|