Commit 93977402 authored by Daniel P. Berrangé's avatar Daniel P. Berrangé Committed by Stefan Hajnoczi
Browse files

trace: remove global 'uint16 dstate[]' array



Instead of having a global dstate array, declare a single
'uint16 TRACE_${EVENT_NAME}_DSTATE' variable for each
trace event. Record a pointer to this variable in the
TraceEvent struct too.

By turning trace_event_get_state_dynamic_by_id into a
macro, this still hits the fast path, and cache affinity
is ensured by declaring all the uint16 vars adjacent to
each other.

Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: default avatarLluís Vilanova <vilanova@ac.upc.edu>
Signed-off-by: default avatarDaniel P. Berrange <berrange@redhat.com>
Message-id: 1475588159-30598-7-git-send-email-berrange@redhat.com
Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
parent 599ab2f2
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -265,11 +265,12 @@ class Event(object):

    QEMU_TRACE               = "trace_%(name)s"
    QEMU_TRACE_TCG           = QEMU_TRACE + "_tcg"
    QEMU_DSTATE              = "_TRACE_%(NAME)s_DSTATE"

    def api(self, fmt=None):
        if fmt is None:
            fmt = Event.QEMU_TRACE
        return fmt % {"name": self.name}
        return fmt % {"name": self.name, "NAME": self.name.upper()}

    def transform(self, *trans):
        """Return a new Event with transformed Arguments."""
+7 −2
Original line number Diff line number Diff line
@@ -25,6 +25,9 @@ def generate(events, backend):
        '#include "trace/control.h"',
        '')

    for e in events:
        out('uint16_t %s;' % e.api(e.QEMU_DSTATE))

    out('TraceEvent trace_events[TRACE_EVENT_COUNT] = {')

    for e in events:
@@ -34,11 +37,13 @@ def generate(events, backend):
            vcpu_id = "TRACE_VCPU_EVENT_COUNT"
        out('    { .id = %(id)s, .vcpu_id = %(vcpu_id)s,'
            ' .name = \"%(name)s\",'
            ' .sstate = %(sstate)s },',
            ' .sstate = %(sstate)s,',
            ' .dstate = &%(dstate)s, }, ',
            id = "TRACE_" + e.name.upper(),
            vcpu_id = vcpu_id,
            name = e.name,
            sstate = "TRACE_%s_ENABLED" % e.name.upper())
            sstate = "TRACE_%s_ENABLED" % e.name.upper(),
            dstate = e.api(e.QEMU_DSTATE))

    out('};',
        '')
+3 −0
Original line number Diff line number Diff line
@@ -32,6 +32,9 @@ def generate(events, backend):
    out('    TRACE_EVENT_COUNT',
        '} TraceEventID;')

    for e in events:
        out('extern uint16_t %s;' % e.api(e.QEMU_DSTATE))

    # per-vCPU event identifiers
    out('typedef enum {')

+4 −5
Original line number Diff line number Diff line
@@ -18,22 +18,21 @@ void trace_event_set_state_dynamic_init(TraceEvent *ev, bool state)

void trace_event_set_state_dynamic(TraceEvent *ev, bool state)
{
    TraceEventID id;
    bool state_pre;
    assert(trace_event_get_state_static(ev));
    id = trace_event_get_id(ev);

    /*
     * We ignore the "vcpu" property here, since there's no target code. Then
     * dstate can only be 1 or 0.
     */
    state_pre = trace_events_dstate[id];
    state_pre = *(ev->dstate);
    if (state_pre != state) {
        if (state) {
            trace_events_enabled_count++;
            trace_events_dstate[id] = 1;
            *(ev->dstate) = 1;
        } else {
            trace_events_enabled_count--;
            trace_events_dstate[id] = 0;
            *(ev->dstate) = 0;
        }
    }
}
+4 −10
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@


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


@@ -54,18 +53,13 @@ static inline bool trace_event_get_state_static(TraceEvent *ev)
    return ev->sstate;
}

static inline bool trace_event_get_state_dynamic_by_id(TraceEventID id)
{
/* it's on fast path, avoid consistency checks (asserts) */
    return unlikely(trace_events_enabled_count) && trace_events_dstate[id];
}
#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)
{
    TraceEventID id;
    assert(trace_event_get_state_static(ev));
    id = trace_event_get_id(ev);
    return trace_event_get_state_dynamic_by_id(id);
    return unlikely(trace_events_enabled_count) && *ev->dstate;
}

static inline bool trace_event_get_vcpu_state_dynamic_by_vcpu_id(CPUState *vcpu,
Loading