* [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build
@ 2016-09-14 17:08 Daniel P. Berrange
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 1/6] trace: add trace event iterator APIs Daniel P. Berrange
` (6 more replies)
0 siblings, 7 replies; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-14 17:08 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Lluís Vilanova, Paolo Bonzini, Daniel P. Berrange
These patches were previously posted as part of my
giant trace events modular build series
https://lists.gnu.org/archive/html/qemu-devel/2016-08/msg01714.html
I'm not ready to repost the entire series, but I figure these
6 preparatory changes can be usefully reviewed and potentially
merged on their own.
Changed in v2:
- Fixed filtering of events on first call of
iterator_next (Stefan)
- Switch from size_t to uint32_t for event ID
type (Paolo/Stefan)
- Replace global 'dstate' array with individual
variables (Lluís)
Daniel P. Berrange (6):
trace: add trace event iterator APIs
trace: convert code to use event iterators
trace: remove some now unused functions
trace: remove global 'uint16 dstate[]' array
trace: remove use of event ID enums from APIs
trace: use -1 instead of TRACE_VCPU_EVENT_COUNT as magic value
monitor.c | 16 ++++--
scripts/tracetool/format/events_c.py | 8 ++-
scripts/tracetool/format/events_h.py | 3 +
stubs/trace-control.c | 9 ++-
trace/control-internal.h | 35 +++---------
trace/control-target.c | 22 +++-----
trace/control.c | 105 +++++++++++++++++++----------------
trace/control.h | 94 +++++++++----------------------
trace/event-internal.h | 10 +++-
trace/qmp.c | 16 ++++--
trace/simple.c | 6 +-
trace/simple.h | 2 +-
12 files changed, 145 insertions(+), 181 deletions(-)
--
2.7.4
^ permalink raw reply [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v2 1/6] trace: add trace event iterator APIs
2016-09-14 17:08 [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build Daniel P. Berrange
@ 2016-09-14 17:08 ` Daniel P. Berrange
2016-09-14 21:53 ` Lluís Vilanova
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 2/6] trace: convert code to use event iterators Daniel P. Berrange
` (5 subsequent siblings)
6 siblings, 1 reply; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-14 17:08 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Lluís Vilanova, Paolo Bonzini, Daniel P. Berrange
Currently methods which want to iterate over trace events,
do so using the trace_event_count() and trace_event_id()
methods. This leaks the concept of a single ID enum to
the callers. There is an alternative trace_event_pattern()
method which can be used in an iteration context, but its
design is stateless, so is not easy to expand it in the
future.
This defines a formal iterator API will provide an future
proof way of iterating over events.
The iterator is also able to apply a pattern match filter
to events, further removing the need for the pattern
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
trace/control.c | 20 ++++++++++++++++++++
trace/control.h | 27 +++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
diff --git a/trace/control.c b/trace/control.c
index 05d85ac..b871727 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -125,6 +125,26 @@ TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
return NULL;
}
+void trace_event_iter_init(TraceEventIter *iter, const char *pattern)
+{
+ iter->event = 0;
+ iter->pattern = pattern;
+}
+
+TraceEvent *trace_event_iter_next(TraceEventIter *iter)
+{
+ while (iter->event < TRACE_EVENT_COUNT) {
+ if (!iter->pattern ||
+ pattern_glob(iter->pattern,
+ trace_event_get_name(&(trace_events[iter->event])))) {
+ return &(trace_events[iter->event]);
+ }
+ iter->event++;
+ }
+
+ return NULL;
+}
+
void trace_list_events(void)
{
int i;
diff --git a/trace/control.h b/trace/control.h
index 27a16fc..c71b405 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -13,6 +13,10 @@
#include "qemu-common.h"
#include "trace/generated-events.h"
+typedef struct TraceEventIter {
+ size_t event;
+ const char *pattern;
+} TraceEventIter;
/**
* TraceEventID:
@@ -25,6 +29,29 @@
*/
enum TraceEventID;
+
+/**
+ * trace_event_iter_init:
+ * @iter: the event iterator struct
+ * @pattern: optional pattern to filter events on name
+ *
+ * Initialize the event iterator struct @iter,
+ * optionally using @pattern to filter out events
+ * with non-matching names.
+ */
+void trace_event_iter_init(TraceEventIter *iter, const char *pattern);
+
+/**
+ * trace_event_iter_next:
+ * @iter: the event iterator struct
+ *
+ * Get the next event, if any. When this returns NULL,
+ * the iterator should no longer be used.
+ *
+ * Returns: the next event, or NULL if no more events exist
+ */
+TraceEvent *trace_event_iter_next(TraceEventIter *iter);
+
/**
* trace_event_id:
* @id: Event identifier.
--
2.7.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v2 2/6] trace: convert code to use event iterators
2016-09-14 17:08 [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build Daniel P. Berrange
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 1/6] trace: add trace event iterator APIs Daniel P. Berrange
@ 2016-09-14 17:08 ` Daniel P. Berrange
2016-09-14 22:16 ` Lluís Vilanova
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 3/6] trace: remove some now unused functions Daniel P. Berrange
` (4 subsequent siblings)
6 siblings, 1 reply; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-14 17:08 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Lluís Vilanova, Paolo Bonzini, Daniel P. Berrange
This converts the HMP/QMP monitor API implementations
and some internal trace control methods to use the new
trace event iterator APIs.
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
monitor.c | 16 ++++++----
trace/control.c | 94 ++++++++++++++++++++++++++++++++++-----------------------
trace/qmp.c | 16 ++++++----
3 files changed, 76 insertions(+), 50 deletions(-)
diff --git a/monitor.c b/monitor.c
index 5c00373..7b979a6 100644
--- a/monitor.c
+++ b/monitor.c
@@ -3335,9 +3335,11 @@ void info_trace_events_completion(ReadLineState *rs, int nb_args, const char *st
len = strlen(str);
readline_set_completion_index(rs, len);
if (nb_args == 2) {
- TraceEventID id;
- for (id = 0; id < trace_event_count(); id++) {
- const char *event_name = trace_event_get_name(trace_event_id(id));
+ TraceEventIter iter;
+ TraceEvent *ev;
+ trace_event_iter_init(&iter, NULL);
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
+ const char *event_name = trace_event_get_name(ev);
if (!strncmp(str, event_name, len)) {
readline_add_completion(rs, event_name);
}
@@ -3352,9 +3354,11 @@ void trace_event_completion(ReadLineState *rs, int nb_args, const char *str)
len = strlen(str);
readline_set_completion_index(rs, len);
if (nb_args == 2) {
- TraceEventID id;
- for (id = 0; id < trace_event_count(); id++) {
- const char *event_name = trace_event_get_name(trace_event_id(id));
+ TraceEventIter iter;
+ TraceEvent *ev;
+ trace_event_iter_init(&iter, NULL);
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
+ const char *event_name = trace_event_get_name(ev);
if (!strncmp(str, event_name, len)) {
readline_add_completion(rs, event_name);
}
diff --git a/trace/control.c b/trace/control.c
index b871727..8fa7ed6 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -60,9 +60,10 @@ TraceEvent *trace_event_name(const char *name)
{
assert(name != NULL);
- TraceEventID i;
- for (i = 0; i < trace_event_count(); i++) {
- TraceEvent *ev = trace_event_id(i);
+ TraceEventIter iter;
+ TraceEvent *ev;
+ trace_event_iter_init(&iter, NULL);
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
if (strcmp(trace_event_get_name(ev), name) == 0) {
return ev;
}
@@ -105,21 +106,20 @@ TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
{
assert(pat != NULL);
- TraceEventID i;
-
- if (ev == NULL) {
- i = -1;
- } else {
- i = trace_event_get_id(ev);
- }
- i++;
-
- while (i < trace_event_count()) {
- TraceEvent *res = trace_event_id(i);
- if (pattern_glob(pat, trace_event_get_name(res))) {
- return res;
+ bool matched = ev ? false : true;
+ TraceEventIter iter;
+ TraceEvent *thisev;
+ trace_event_iter_init(&iter, NULL);
+ while ((thisev = trace_event_iter_next(&iter)) != NULL) {
+ if (matched) {
+ if (pattern_glob(pat, trace_event_get_name(thisev))) {
+ return thisev;
+ }
+ } else {
+ if (ev == thisev) {
+ matched = true;
+ }
}
- i++;
}
return NULL;
@@ -147,10 +147,11 @@ TraceEvent *trace_event_iter_next(TraceEventIter *iter)
void trace_list_events(void)
{
- int i;
- for (i = 0; i < trace_event_count(); i++) {
- TraceEvent *res = trace_event_id(i);
- fprintf(stderr, "%s\n", trace_event_get_name(res));
+ TraceEventIter iter;
+ TraceEvent *ev;
+ trace_event_iter_init(&iter, NULL);
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
+ fprintf(stderr, "%s\n", trace_event_get_name(ev));
}
}
@@ -158,25 +159,40 @@ static void do_trace_enable_events(const char *line_buf)
{
const bool enable = ('-' != line_buf[0]);
const char *line_ptr = enable ? line_buf : line_buf + 1;
-
- if (trace_event_is_pattern(line_ptr)) {
- TraceEvent *ev = NULL;
- while ((ev = trace_event_pattern(line_ptr, ev)) != NULL) {
+ TraceEventIter iter;
+ TraceEvent *ev;
+ bool is_pattern = trace_event_is_pattern(line_ptr);
+
+ trace_event_iter_init(&iter, is_pattern ? line_ptr : NULL);
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
+ bool match = false;
+ if (is_pattern) {
if (trace_event_get_state_static(ev)) {
- trace_event_set_state_dynamic_init(ev, enable);
+ match = true;
}
- }
- } else {
- TraceEvent *ev = trace_event_name(line_ptr);
- if (ev == NULL) {
- error_report("WARNING: trace event '%s' does not exist",
- line_ptr);
- } else if (!trace_event_get_state_static(ev)) {
- error_report("WARNING: trace event '%s' is not traceable",
- line_ptr);
} else {
- trace_event_set_state_dynamic_init(ev, enable);
+ if (g_str_equal(trace_event_get_name(ev),
+ line_ptr)) {
+ if (!trace_event_get_state_static(ev)) {
+ error_report("WARNING: trace event '%s' is not traceable",
+ line_ptr);
+ return;
+ }
+ match = true;
+ }
}
+ if (match) {
+ /* start tracing */
+ trace_event_set_state_dynamic(ev, enable);
+ if (!is_pattern) {
+ return;
+ }
+ }
+ }
+
+ if (!is_pattern) {
+ error_report("WARNING: trace event '%s' does not exist",
+ line_ptr);
}
}
@@ -292,8 +308,10 @@ char *trace_opt_parse(const char *optarg)
void trace_init_vcpu_events(void)
{
- TraceEvent *ev = NULL;
- while ((ev = trace_event_pattern("*", ev)) != NULL) {
+ TraceEventIter iter;
+ TraceEvent *ev;
+ trace_event_iter_init(&iter, NULL);
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
if (trace_event_is_vcpu(ev) &&
trace_event_get_state_static(ev) &&
trace_event_get_state_dynamic(ev)) {
diff --git a/trace/qmp.c b/trace/qmp.c
index 11d2564..88a907b 100644
--- a/trace/qmp.c
+++ b/trace/qmp.c
@@ -52,8 +52,10 @@ static bool check_events(bool has_vcpu, bool ignore_unavailable, bool is_pattern
return true;
} else {
/* error for unavailable events */
- TraceEvent *ev = NULL;
- while ((ev = trace_event_pattern(name, ev)) != NULL) {
+ TraceEventIter iter;
+ TraceEvent *ev;
+ trace_event_iter_init(&iter, name);
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
if (!ignore_unavailable && !trace_event_get_state_static(ev)) {
error_setg(errp, "event \"%s\" is disabled", trace_event_get_name(ev));
return false;
@@ -69,6 +71,7 @@ TraceEventInfoList *qmp_trace_event_get_state(const char *name,
{
Error *err = NULL;
TraceEventInfoList *events = NULL;
+ TraceEventIter iter;
TraceEvent *ev;
bool is_pattern = trace_event_is_pattern(name);
CPUState *cpu;
@@ -86,8 +89,8 @@ TraceEventInfoList *qmp_trace_event_get_state(const char *name,
}
/* Get states (all errors checked above) */
- ev = NULL;
- while ((ev = trace_event_pattern(name, ev)) != NULL) {
+ trace_event_iter_init(&iter, is_pattern ? name : NULL);
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
TraceEventInfoList *elem;
bool is_vcpu = trace_event_is_vcpu(ev);
if (has_vcpu && !is_vcpu) {
@@ -132,6 +135,7 @@ void qmp_trace_event_set_state(const char *name, bool enable,
Error **errp)
{
Error *err = NULL;
+ TraceEventIter iter;
TraceEvent *ev;
bool is_pattern = trace_event_is_pattern(name);
CPUState *cpu;
@@ -150,8 +154,8 @@ void qmp_trace_event_set_state(const char *name, bool enable,
}
/* Apply changes (all errors checked above) */
- ev = NULL;
- while ((ev = trace_event_pattern(name, ev)) != NULL) {
+ trace_event_iter_init(&iter, name);
+ while ((ev = trace_event_iter_next(&iter)) != NULL) {
if (!trace_event_get_state_static(ev) ||
(has_vcpu && !trace_event_is_vcpu(ev))) {
continue;
--
2.7.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v2 3/6] trace: remove some now unused functions
2016-09-14 17:08 [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build Daniel P. Berrange
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 1/6] trace: add trace event iterator APIs Daniel P. Berrange
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 2/6] trace: convert code to use event iterators Daniel P. Berrange
@ 2016-09-14 17:08 ` Daniel P. Berrange
2016-09-14 22:21 ` Lluís Vilanova
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 4/6] trace: remove global 'uint16 dstate[]' array Daniel P. Berrange
` (3 subsequent siblings)
6 siblings, 1 reply; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-14 17:08 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Lluís Vilanova, Paolo Bonzini, Daniel P. Berrange
The trace_event_count, trace_event_id and
trace_event_pattern methods are no longer required
now that everything is using the iterator APIs
The trace_event_set_state and trace_event_set_vcpu_state
macros were also unused.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
trace/control-internal.h | 11 ---------
trace/control.c | 22 ------------------
trace/control.h | 59 ------------------------------------------------
3 files changed, 92 deletions(-)
diff --git a/trace/control-internal.h b/trace/control-internal.h
index a4e5f4a..7f31e39 100644
--- a/trace/control-internal.h
+++ b/trace/control-internal.h
@@ -20,17 +20,6 @@ extern uint16_t trace_events_dstate[];
extern int trace_events_enabled_count;
-static inline TraceEventID trace_event_count(void)
-{
- return TRACE_EVENT_COUNT;
-}
-
-static inline TraceEvent *trace_event_id(TraceEventID id)
-{
- assert(id < trace_event_count());
- return &trace_events[id];
-}
-
static inline bool trace_event_is_pattern(const char *str)
{
assert(str != NULL);
diff --git a/trace/control.c b/trace/control.c
index 8fa7ed6..e9a64d0 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -102,28 +102,6 @@ static bool pattern_glob(const char *pat, const char *ev)
}
}
-TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
-{
- assert(pat != NULL);
-
- bool matched = ev ? false : true;
- TraceEventIter iter;
- TraceEvent *thisev;
- trace_event_iter_init(&iter, NULL);
- while ((thisev = trace_event_iter_next(&iter)) != NULL) {
- if (matched) {
- if (pattern_glob(pat, trace_event_get_name(thisev))) {
- return thisev;
- }
- } else {
- if (ev == thisev) {
- matched = true;
- }
- }
- }
-
- return NULL;
-}
void trace_event_iter_init(TraceEventIter *iter, const char *pattern)
{
diff --git a/trace/control.h b/trace/control.h
index c71b405..e80c220 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -52,21 +52,6 @@ void trace_event_iter_init(TraceEventIter *iter, const char *pattern);
*/
TraceEvent *trace_event_iter_next(TraceEventIter *iter);
-/**
- * trace_event_id:
- * @id: Event identifier.
- *
- * Get an event by its identifier.
- *
- * This routine has a constant cost, as opposed to trace_event_name and
- * trace_event_pattern.
- *
- * Pre-conditions: The identifier is valid.
- *
- * Returns: pointer to #TraceEvent.
- *
- */
-static TraceEvent *trace_event_id(TraceEventID id);
/**
* trace_event_name:
@@ -79,31 +64,12 @@ static TraceEvent *trace_event_id(TraceEventID id);
TraceEvent *trace_event_name(const char *name);
/**
- * trace_event_pattern:
- * @pat: Event name pattern.
- * @ev: Event to start searching from (not included).
- *
- * Get all events with a given name pattern.
- *
- * Returns: pointer to #TraceEvent or NULL if not found.
- */
-TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev);
-
-/**
* trace_event_is_pattern:
*
* Whether the given string is an event name pattern.
*/
static bool trace_event_is_pattern(const char *str);
-/**
- * trace_event_count:
- *
- * Return the number of events.
- */
-static TraceEventID trace_event_count(void);
-
-
/**
* trace_event_get_id:
@@ -194,31 +160,6 @@ static bool trace_event_get_state_dynamic(TraceEvent *ev);
*/
static bool trace_event_get_vcpu_state_dynamic(CPUState *vcpu, TraceEvent *ev);
-/**
- * trace_event_set_state:
- *
- * Set the tracing state of an event (only if possible).
- */
-#define trace_event_set_state(id, state) \
- do { \
- if ((id ##_ENABLED)) { \
- TraceEvent *_e = trace_event_id(id); \
- trace_event_set_state_dynamic(_e, state); \
- } \
- } while (0)
-
-/**
- * trace_event_set_vcpu_state:
- *
- * Set the tracing state of an event for the given vCPU (only if not disabled).
- */
-#define trace_event_set_vcpu_state(vcpu, id, state) \
- do { \
- if ((id ##_ENABLED)) { \
- TraceEvent *_e = trace_event_id(id); \
- trace_event_set_vcpu_state_dynamic(vcpu, _e, state); \
- } \
- } while (0)
/**
* trace_event_set_state_dynamic:
--
2.7.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v2 4/6] trace: remove global 'uint16 dstate[]' array
2016-09-14 17:08 [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build Daniel P. Berrange
` (2 preceding siblings ...)
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 3/6] trace: remove some now unused functions Daniel P. Berrange
@ 2016-09-14 17:08 ` Daniel P. Berrange
2016-09-14 22:56 ` Lluís Vilanova
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 5/6] trace: remove use of event ID enums from APIs Daniel P. Berrange
` (2 subsequent siblings)
6 siblings, 1 reply; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-14 17:08 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Lluís Vilanova, Paolo Bonzini, Daniel P. Berrange
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.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
scripts/tracetool/format/events_c.py | 6 +++++-
scripts/tracetool/format/events_h.py | 3 +++
stubs/trace-control.c | 9 ++++-----
trace/control-internal.h | 14 ++++----------
trace/control-target.c | 20 ++++++++------------
trace/control.c | 11 ++---------
trace/event-internal.h | 6 ++++++
7 files changed, 32 insertions(+), 37 deletions(-)
diff --git a/scripts/tracetool/format/events_c.py b/scripts/tracetool/format/events_c.py
index 4012063..a2f457f 100644
--- a/scripts/tracetool/format/events_c.py
+++ b/scripts/tracetool/format/events_c.py
@@ -25,6 +25,9 @@ def generate(events, backend):
'#include "trace/control.h"',
'')
+ for e in events:
+ out('uint16_t TRACE_%s_DSTATE;' % e.name.upper())
+
out('TraceEvent trace_events[TRACE_EVENT_COUNT] = {')
for e in events:
@@ -34,7 +37,8 @@ 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 = &%(id)s_DSTATE, }, ',
id = "TRACE_" + e.name.upper(),
vcpu_id = vcpu_id,
name = e.name,
diff --git a/scripts/tracetool/format/events_h.py b/scripts/tracetool/format/events_h.py
index a9da60b..193b02c 100644
--- a/scripts/tracetool/format/events_h.py
+++ b/scripts/tracetool/format/events_h.py
@@ -32,6 +32,9 @@ def generate(events, backend):
out(' TRACE_EVENT_COUNT',
'} TraceEventID;')
+ for e in events:
+ out('extern uint16_t TRACE_%s_DSTATE;' % e.name.upper())
+
# per-vCPU event identifiers
out('typedef enum {')
diff --git a/stubs/trace-control.c b/stubs/trace-control.c
index 2dfcd9f..dd68f25 100644
--- a/stubs/trace-control.c
+++ b/stubs/trace-control.c
@@ -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;
}
}
}
diff --git a/trace/control-internal.h b/trace/control-internal.h
index 7f31e39..1446498 100644
--- a/trace/control-internal.h
+++ b/trace/control-internal.h
@@ -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];
-}
+/* 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)
{
- 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,
diff --git a/trace/control-target.c b/trace/control-target.c
index 72081e2..c69dda9 100644
--- a/trace/control-target.c
+++ b/trace/control-target.c
@@ -15,21 +15,20 @@
void trace_event_set_state_dynamic_init(TraceEvent *ev, bool state)
{
- TraceEventID id = trace_event_get_id(ev);
bool state_pre;
assert(trace_event_get_state_static(ev));
/*
* We ignore the "vcpu" property here, since no vCPUs have been created
* yet. 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;
}
}
}
@@ -44,15 +43,14 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state)
}
} else {
/* Without the "vcpu" property, dstate can only be 1 or 0 */
- TraceEventID id = trace_event_get_id(ev);
- bool state_pre = trace_events_dstate[id];
+ bool 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;
}
}
}
@@ -61,23 +59,21 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state)
void trace_event_set_vcpu_state_dynamic(CPUState *vcpu,
TraceEvent *ev, bool state)
{
- TraceEventID id;
TraceEventVCPUID vcpu_id;
bool state_pre;
assert(trace_event_get_state_static(ev));
assert(trace_event_is_vcpu(ev));
- id = trace_event_get_id(ev);
vcpu_id = trace_event_get_vcpu_id(ev);
state_pre = test_bit(vcpu_id, vcpu->trace_dstate);
if (state_pre != state) {
if (state) {
trace_events_enabled_count++;
set_bit(vcpu_id, vcpu->trace_dstate);
- trace_events_dstate[id]++;
+ (*ev->dstate)++;
} else {
trace_events_enabled_count--;
clear_bit(vcpu_id, vcpu->trace_dstate);
- trace_events_dstate[id]--;
+ (*ev->dstate)--;
}
}
}
diff --git a/trace/control.c b/trace/control.c
index e9a64d0..c24b863 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -28,12 +28,6 @@
#include "monitor/monitor.h"
int trace_events_enabled_count;
-/*
- * Interpretation depends on wether the event has the 'vcpu' property:
- * - false: Boolean value indicating whether the event is active.
- * - true : Integral counting the number of vCPUs that have this event enabled.
- */
-uint16_t trace_events_dstate[TRACE_EVENT_COUNT];
QemuOptsList qemu_trace_opts = {
.name = "trace",
@@ -293,11 +287,10 @@ void trace_init_vcpu_events(void)
if (trace_event_is_vcpu(ev) &&
trace_event_get_state_static(ev) &&
trace_event_get_state_dynamic(ev)) {
- TraceEventID id = trace_event_get_id(ev);
/* check preconditions */
- assert(trace_events_dstate[id] == 1);
+ assert(*ev->dstate == 1);
/* disable early-init state ... */
- trace_events_dstate[id] = 0;
+ *ev->dstate = 0;
trace_events_enabled_count--;
/* ... and properly re-enable */
trace_event_set_state_dynamic(ev, true);
diff --git a/trace/event-internal.h b/trace/event-internal.h
index 074faf6..3b9ceb5 100644
--- a/trace/event-internal.h
+++ b/trace/event-internal.h
@@ -19,6 +19,11 @@
* @vcpu_id: Unique per-vCPU event identifier.
* @name: Event name.
* @sstate: Static tracing state.
+ * @dstate: Dynamic tracing state
+ *
+ * Interpretation of @dstate depends on wether the event has the 'vcpu' property:
+ * - false: Boolean value indicating whether the event is active.
+ * - true : Integral counting the number of vCPUs that have this event enabled.
*
* Opaque generic description of a tracing event.
*/
@@ -27,6 +32,7 @@ typedef struct TraceEvent {
TraceEventVCPUID vcpu_id;
const char * name;
const bool sstate;
+ uint16_t *dstate;
} TraceEvent;
void trace_event_set_state_dynamic_init(TraceEvent *ev, bool state);
--
2.7.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v2 5/6] trace: remove use of event ID enums from APIs
2016-09-14 17:08 [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build Daniel P. Berrange
` (3 preceding siblings ...)
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 4/6] trace: remove global 'uint16 dstate[]' array Daniel P. Berrange
@ 2016-09-14 17:08 ` Daniel P. Berrange
2016-09-14 23:26 ` Lluís Vilanova
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 6/6] trace: use -1 instead of TRACE_VCPU_EVENT_COUNT as magic value Daniel P. Berrange
2016-09-14 19:41 ` [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build no-reply
6 siblings, 1 reply; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-14 17:08 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Lluís Vilanova, Paolo Bonzini, Daniel P. Berrange
Since there will shortly be multiple event groups allowed,
we can no longer use the TraceEventID and TraceEventVCPUID
enums in the trace control APIs. There will in fact be
multiple distinct enums, and the enum values will only be
required to be unique per group.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
trace/control-internal.h | 8 ++++----
trace/control-target.c | 2 +-
trace/control.h | 24 ++++++------------------
trace/event-internal.h | 4 ++--
trace/simple.c | 6 +++---
trace/simple.h | 2 +-
6 files changed, 17 insertions(+), 29 deletions(-)
diff --git a/trace/control-internal.h b/trace/control-internal.h
index 1446498..2981f11 100644
--- a/trace/control-internal.h
+++ b/trace/control-internal.h
@@ -25,13 +25,13 @@ static inline bool trace_event_is_pattern(const char *str)
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);
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;
}
@@ -63,7 +63,7 @@ static inline bool trace_event_get_state_dynamic(TraceEvent *ev)
}
static inline bool trace_event_get_vcpu_state_dynamic_by_vcpu_id(CPUState *vcpu,
- TraceEventVCPUID id)
+ uint32_t id)
{
/* it's on fast path, avoid consistency checks (asserts) */
if (unlikely(trace_events_enabled_count)) {
@@ -76,7 +76,7 @@ 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,
TraceEvent *ev)
{
- TraceEventVCPUID id;
+ uint32_t id;
assert(trace_event_is_vcpu(ev));
id = trace_event_get_vcpu_id(ev);
return trace_event_get_vcpu_state_dynamic_by_vcpu_id(vcpu, id);
diff --git a/trace/control-target.c b/trace/control-target.c
index c69dda9..ff1bf43 100644
--- a/trace/control-target.c
+++ b/trace/control-target.c
@@ -59,7 +59,7 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state)
void trace_event_set_vcpu_state_dynamic(CPUState *vcpu,
TraceEvent *ev, bool state)
{
- TraceEventVCPUID vcpu_id;
+ uint32_t vcpu_id;
bool state_pre;
assert(trace_event_get_state_static(ev));
assert(trace_event_is_vcpu(ev));
diff --git a/trace/control.h b/trace/control.h
index e80c220..d660fd2 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -19,18 +19,6 @@ typedef struct 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:
* @iter: the event iterator struct
* @pattern: optional pattern to filter events on name
@@ -76,7 +64,7 @@ static bool trace_event_is_pattern(const char *str);
*
* 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:
@@ -86,7 +74,7 @@ static TraceEventID trace_event_get_id(TraceEvent *ev);
* Special value #TRACE_VCPU_EVENT_COUNT means the event is not vCPU-specific
* (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:
@@ -111,7 +99,7 @@ static const char * trace_event_get_name(TraceEvent *ev);
* If the event has the disabled property, the check will have no performance
* impact.
*
- * As a down side, you must always use an immediate #TraceEventID value.
+ * As a down side, you must always use an immediate event ID value.
*/
#define trace_event_get_state(id) \
((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id))
@@ -119,8 +107,8 @@ static const char * trace_event_get_name(TraceEvent *ev);
/**
* trace_event_get_vcpu_state:
* @vcpu: Target vCPU.
- * @id: Event identifier (TraceEventID).
- * @vcpu_id: Per-vCPU event identifier (TraceEventVCPUID).
+ * @id: Event identifier.
+ * @vcpu_id: Per-vCPU event identifier.
*
* Get the tracing state of an event (both static and dynamic) for the given
* vCPU.
@@ -128,7 +116,7 @@ static const char * trace_event_get_name(TraceEvent *ev);
* If the event has the disabled property, the check will have no performance
* impact.
*
- * As a down side, you must always use an immediate #TraceEventID value.
+ * As a down side, you must always use an immediate event ID value.
*/
#define trace_event_get_vcpu_state(vcpu, id, vcpu_id) \
((id ##_ENABLED) && trace_event_get_vcpu_state_dynamic_by_vcpu_id(vcpu, vcpu_id))
diff --git a/trace/event-internal.h b/trace/event-internal.h
index 3b9ceb5..d57f2d9 100644
--- a/trace/event-internal.h
+++ b/trace/event-internal.h
@@ -28,8 +28,8 @@
* Opaque generic description of a tracing event.
*/
typedef struct TraceEvent {
- TraceEventID id;
- TraceEventVCPUID vcpu_id;
+ uint32_t id;
+ uint32_t vcpu_id;
const char * name;
const bool sstate;
uint16_t *dstate;
diff --git a/trace/simple.c b/trace/simple.c
index 2f09daf..6e8013c 100644
--- a/trace/simple.c
+++ b/trace/simple.c
@@ -18,7 +18,7 @@
#include "trace/simple.h"
/** Trace file header event ID */
-#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with TraceEventIDs */
+#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with event IDs */
/** Trace file magic number */
#define HEADER_MAGIC 0xf2b177cb0aa429b4ULL
@@ -58,7 +58,7 @@ static char *trace_file_name;
/* * Trace buffer entry */
typedef struct {
- uint64_t event; /* TraceEventID */
+ uint64_t event; /* event ID */
uint64_t timestamp_ns;
uint32_t length; /* in bytes */
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);
}
-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;
uint32_t rec_len = sizeof(TraceRecord) + datasize;
diff --git a/trace/simple.h b/trace/simple.h
index 1e7de45..17ce472 100644
--- a/trace/simple.h
+++ b/trace/simple.h
@@ -33,7 +33,7 @@ typedef struct {
*
* @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
--
2.7.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v2 6/6] trace: use -1 instead of TRACE_VCPU_EVENT_COUNT as magic value
2016-09-14 17:08 [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build Daniel P. Berrange
` (4 preceding siblings ...)
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 5/6] trace: remove use of event ID enums from APIs Daniel P. Berrange
@ 2016-09-14 17:08 ` Daniel P. Berrange
2016-09-14 23:12 ` Lluís Vilanova
2016-09-14 19:41 ` [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build no-reply
6 siblings, 1 reply; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-14 17:08 UTC (permalink / raw)
To: qemu-devel
Cc: Stefan Hajnoczi, Lluís Vilanova, Paolo Bonzini, Daniel P. Berrange
The TraceEvent struct vcpu_id field uses the constant
TRACE_VCPU_EVENT_COUNT as a magic value to indicate this
is not a per-VCPU event. The max count value will be
different for each event group though, so this is no
longer suitable. Instead use the value (size_t)-1 which
is guaranteed to be available across all event groups.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
scripts/tracetool/format/events_c.py | 2 +-
trace/control-internal.h | 2 +-
trace/control.h | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/scripts/tracetool/format/events_c.py b/scripts/tracetool/format/events_c.py
index a2f457f..104135f 100644
--- a/scripts/tracetool/format/events_c.py
+++ b/scripts/tracetool/format/events_c.py
@@ -34,7 +34,7 @@ def generate(events, backend):
if "vcpu" in e.properties:
vcpu_id = "TRACE_VCPU_" + e.name.upper()
else:
- vcpu_id = "TRACE_VCPU_EVENT_COUNT"
+ vcpu_id = "(uint32_t)-1";
out(' { .id = %(id)s, .vcpu_id = %(vcpu_id)s,'
' .name = \"%(name)s\",'
' .sstate = %(sstate)s,',
diff --git a/trace/control-internal.h b/trace/control-internal.h
index 2981f11..d5ceb42 100644
--- a/trace/control-internal.h
+++ b/trace/control-internal.h
@@ -38,7 +38,7 @@ static inline uint32_t trace_event_get_vcpu_id(TraceEvent *ev)
static inline bool trace_event_is_vcpu(TraceEvent *ev)
{
- return ev->vcpu_id != TRACE_VCPU_EVENT_COUNT;
+ return ev->vcpu_id != (uint32_t)-1;
}
static inline const char * trace_event_get_name(TraceEvent *ev)
diff --git a/trace/control.h b/trace/control.h
index d660fd2..545be29 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -71,7 +71,7 @@ static uint32_t trace_event_get_id(TraceEvent *ev);
*
* Get the per-vCPU identifier of an event.
*
- * Special value #TRACE_VCPU_EVENT_COUNT means the event is not vCPU-specific
+ * Special value (uint32_t)-1 means the event is not vCPU-specific
* (does not have the "vcpu" property).
*/
static uint32_t trace_event_get_vcpu_id(TraceEvent *ev);
--
2.7.4
^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build
2016-09-14 17:08 [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build Daniel P. Berrange
` (5 preceding siblings ...)
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 6/6] trace: use -1 instead of TRACE_VCPU_EVENT_COUNT as magic value Daniel P. Berrange
@ 2016-09-14 19:41 ` no-reply
6 siblings, 0 replies; 20+ messages in thread
From: no-reply @ 2016-09-14 19:41 UTC (permalink / raw)
To: berrange; +Cc: famz, qemu-devel, pbonzini, vilanova, stefanha
Hi,
Your series failed automatic build test. Please find the testing commands and
their output below. If you have docker installed, you can probably reproduce it
locally.
Type: series
Message-id: 1473872922-23449-1-git-send-email-berrange@redhat.com
Subject: [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build
=== TEST SCRIPT BEGIN ===
#!/bin/bash
set -e
git submodule update --init dtc
make J=8 docker-test-quick@centos6
make J=8 docker-test-mingw@fedora
=== TEST SCRIPT END ===
Updating 3c8cf5a9c21ff8782164d1def7f44bd888713384
From https://github.com/patchew-project/qemu
* [new tag] patchew/1473872922-23449-1-git-send-email-berrange@redhat.com -> patchew/1473872922-23449-1-git-send-email-berrange@redhat.com
Switched to a new branch 'test'
de7a8cc trace: use -1 instead of TRACE_VCPU_EVENT_COUNT as magic value
f0ab0b0 trace: remove use of event ID enums from APIs
62abecb trace: remove global 'uint16 dstate[]' array
8c99acf trace: remove some now unused functions
8b7e24e trace: convert code to use event iterators
2cf2a6e trace: add trace event iterator APIs
=== OUTPUT BEGIN ===
Submodule 'dtc' (git://git.qemu-project.org/dtc.git) registered for path 'dtc'
Cloning into 'dtc'...
Submodule path 'dtc': checked out '65cc4d2748a2c2e6f27f1cf39e07a5dbabd80ebf'
BUILD centos6
ARCHIVE qemu.tgz
ARCHIVE dtc.tgz
COPY RUNNER
RUN test-quick in centos6
No C++ compiler available; disabling C++ specific optional code
Install prefix /tmp/qemu-test/src/tests/docker/install
BIOS directory /tmp/qemu-test/src/tests/docker/install/share/qemu
binary directory /tmp/qemu-test/src/tests/docker/install/bin
library directory /tmp/qemu-test/src/tests/docker/install/lib
module directory /tmp/qemu-test/src/tests/docker/install/lib/qemu
libexec directory /tmp/qemu-test/src/tests/docker/install/libexec
include directory /tmp/qemu-test/src/tests/docker/install/include
config directory /tmp/qemu-test/src/tests/docker/install/etc
local state directory /tmp/qemu-test/src/tests/docker/install/var
Manual directory /tmp/qemu-test/src/tests/docker/install/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path /tmp/qemu-test/src
C compiler cc
Host C compiler cc
C++ compiler
Objective-C compiler cc
ARFLAGS rv
CFLAGS -O2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -pthread -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -g
QEMU_CFLAGS -I/usr/include/pixman-1 -fPIE -DPIE -m64 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing -fno-common -fwrapv -Wendif-labels -Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -fstack-protector-all
LDFLAGS -Wl,--warn-common -Wl,-z,relro -Wl,-z,now -pie -m64 -g
make make
install install
python python -B
smbd /usr/sbin/smbd
module support no
host CPU x86_64
host big endian no
target list x86_64-softmmu aarch64-softmmu
tcg debug enabled no
gprof enabled no
sparse enabled no
strip binaries yes
profiler no
static build no
pixman system
SDL support yes (1.2.14)
GTK support no
GTK GL support no
VTE support no
TLS priority NORMAL
GNUTLS support no
GNUTLS rnd no
libgcrypt no
libgcrypt kdf no
nettle no
nettle kdf no
libtasn1 no
curses support no
virgl support no
curl support no
mingw32 support no
Audio drivers oss
Block whitelist (rw)
Block whitelist (ro)
VirtFS support no
VNC support yes
VNC SASL support no
VNC JPEG support no
VNC PNG support no
xen support no
brlapi support no
bluez support no
Documentation no
PIE yes
vde support no
netmap support no
Linux AIO support no
ATTR/XATTR support yes
Install blobs yes
KVM support yes
RDMA support no
TCG interpreter no
fdt support yes
preadv support yes
fdatasync yes
madvise yes
posix_madvise yes
uuid support no
libcap-ng support no
vhost-net support yes
vhost-scsi support yes
vhost-vsock support yes
Trace backends log
spice support no
rbd support no
xfsctl support no
smartcard support no
libusb no
usb net redir no
OpenGL support no
OpenGL dmabufs no
libiscsi support no
libnfs support no
build guest agent yes
QGA VSS support no
QGA w32 disk info no
QGA MSI support no
seccomp support no
coroutine backend ucontext
coroutine pool yes
GlusterFS support no
Archipelago support no
gcov gcov
gcov enabled no
TPM support yes
libssh2 support no
TPM passthrough yes
QOM debugging yes
vhdx no
lzo support no
snappy support no
bzip2 support no
NUMA host support no
tcmalloc support no
jemalloc support no
avx2 optimization no
replication support yes
GEN x86_64-softmmu/config-devices.mak.tmp
GEN aarch64-softmmu/config-devices.mak.tmp
GEN config-host.h
GEN qemu-options.def
GEN qmp-commands.h
GEN qapi-types.h
GEN qapi-visit.h
GEN qapi-event.h
GEN x86_64-softmmu/config-devices.mak
GEN aarch64-softmmu/config-devices.mak
GEN qmp-introspect.h
GEN tests/test-qapi-types.h
GEN tests/test-qapi-visit.h
GEN tests/test-qmp-commands.h
GEN tests/test-qapi-event.h
GEN tests/test-qmp-introspect.h
GEN config-all-devices.mak
GEN trace/generated-events.h
GEN trace/generated-tracers.h
GEN trace/generated-tcg-tracers.h
GEN trace/generated-helpers-wrappers.h
GEN trace/generated-helpers.h
CC tests/qemu-iotests/socket_scm_helper.o
GEN qga/qapi-generated/qga-qapi-types.h
GEN qga/qapi-generated/qga-qapi-visit.h
GEN qga/qapi-generated/qga-qmp-commands.h
GEN qga/qapi-generated/qga-qapi-types.c
GEN qga/qapi-generated/qga-qapi-visit.c
GEN qga/qapi-generated/qga-qmp-marshal.c
GEN qmp-introspect.c
GEN qapi-types.c
GEN qapi-visit.c
GEN qapi-event.c
CC qapi/qapi-visit-core.o
CC qapi/qapi-dealloc-visitor.o
CC qapi/qmp-input-visitor.o
CC qapi/qmp-output-visitor.o
CC qapi/qmp-registry.o
CC qapi/qmp-dispatch.o
CC qapi/string-input-visitor.o
CC qapi/string-output-visitor.o
CC qapi/opts-visitor.o
CC qapi/qapi-clone-visitor.o
CC qapi/qmp-event.o
CC qapi/qapi-util.o
CC qobject/qnull.o
CC qobject/qint.o
CC qobject/qstring.o
CC qobject/qdict.o
CC qobject/qlist.o
CC qobject/qfloat.o
CC qobject/qbool.o
CC qobject/qjson.o
CC qobject/qobject.o
CC qobject/json-lexer.o
CC qobject/json-streamer.o
CC qobject/json-parser.o
GEN trace/generated-events.c
CC trace/control.o
CC trace/qmp.o
CC util/osdep.o
CC util/cutils.o
CC util/unicode.o
CC util/qemu-timer-common.o
CC util/compatfd.o
CC util/event_notifier-posix.o
CC util/mmap-alloc.o
CC util/oslib-posix.o
CC util/qemu-openpty.o
CC util/qemu-thread-posix.o
CC util/memfd.o
CC util/envlist.o
CC util/path.o
CC util/module.o
CC util/bitmap.o
CC util/bitops.o
CC util/hbitmap.o
CC util/fifo8.o
CC util/acl.o
CC util/error.o
CC util/qemu-error.o
CC util/id.o
CC util/iov.o
CC util/qemu-config.o
CC util/qemu-sockets.o
CC util/uri.o
CC util/notify.o
CC util/qemu-option.o
CC util/qemu-progress.o
CC util/hexdump.o
CC util/crc32c.o
CC util/throttle.o
CC util/getauxval.o
CC util/readline.o
CC util/rfifolock.o
CC util/rcu.o
CC util/qemu-coroutine.o
CC util/qemu-coroutine-lock.o
CC util/qemu-coroutine-io.o
CC util/qemu-coroutine-sleep.o
CC util/coroutine-ucontext.o
CC util/buffer.o
CC util/timed-average.o
CC util/base64.o
CC util/log.o
CC util/qdist.o
CC util/qht.o
/tmp/qemu-test/src/util/qht.c: In function ‘qht_reset_size’:
/tmp/qemu-test/src/util/qht.c:413: warning: ‘new’ may be used uninitialized in this function
CC util/range.o
CC crypto/pbkdf-stub.o
CC stubs/arch-query-cpu-def.o
CC stubs/arch-query-cpu-model-expansion.o
CC stubs/arch-query-cpu-model-comparison.o
CC stubs/arch-query-cpu-model-baseline.o
CC stubs/bdrv-next-monitor-owned.o
CC stubs/blk-commit-all.o
CC stubs/blockdev-close-all-bdrv-states.o
CC stubs/clock-warp.o
CC stubs/cpu-get-clock.o
CC stubs/cpu-get-icount.o
CC stubs/dump.o
CC stubs/fdset-add-fd.o
CC stubs/fdset-find-fd.o
CC stubs/fdset-get-fd.o
CC stubs/fdset-remove-fd.o
CC stubs/gdbstub.o
CC stubs/get-fd.o
CC stubs/get-next-serial.o
CC stubs/get-vm-name.o
CC stubs/iothread-lock.o
CC stubs/is-daemonized.o
CC stubs/machine-init-done.o
CC stubs/migr-blocker.o
CC stubs/mon-is-qmp.o
CC stubs/mon-printf.o
CC stubs/monitor-init.o
CC stubs/notify-event.o
CC stubs/qtest.o
CC stubs/replay.o
CC stubs/replay-user.o
CC stubs/reset.o
CC stubs/runstate-check.o
CC stubs/set-fd-handler.o
CC stubs/slirp.o
CC stubs/sysbus.o
CC stubs/trace-control.o
CC stubs/uuid.o
CC stubs/vm-stop.o
CC stubs/vmstate.o
CC stubs/cpus.o
CC stubs/kvm.o
CC stubs/qmp_pc_dimm_device_list.o
CC stubs/target-monitor-defs.o
CC stubs/target-get-monitor-def.o
CC stubs/vhost.o
CC stubs/iohandler.o
CC stubs/smbios_type_38.o
CC stubs/ipmi.o
CC stubs/pc_madt_cpu_entry.o
CC contrib/ivshmem-client/ivshmem-client.o
CC contrib/ivshmem-client/main.o
CC contrib/ivshmem-server/ivshmem-server.o
CC contrib/ivshmem-server/main.o
CC qemu-nbd.o
CC async.o
CC thread-pool.o
CC block.o
CC blockjob.o
CC main-loop.o
CC iohandler.o
CC qemu-timer.o
CC aio-posix.o
CC qemu-io-cmds.o
CC replication.o
CC block/raw_bsd.o
CC block/qcow.o
CC block/vdi.o
CC block/vmdk.o
CC block/cloop.o
CC block/bochs.o
CC block/vpc.o
CC block/vvfat.o
CC block/qcow2.o
CC block/qcow2-refcount.o
CC block/qcow2-cluster.o
CC block/qcow2-snapshot.o
CC block/qcow2-cache.o
CC block/qed.o
CC block/qed-gencb.o
CC block/qed-l2-cache.o
CC block/qed-table.o
CC block/qed-cluster.o
CC block/qed-check.o
CC block/quorum.o
CC block/parallels.o
CC block/blkdebug.o
CC block/blkverify.o
CC block/blkreplay.o
CC block/block-backend.o
CC block/snapshot.o
CC block/qapi.o
CC block/raw-posix.o
CC block/null.o
CC block/mirror.o
CC block/commit.o
CC block/io.o
CC block/throttle-groups.o
CC block/nbd.o
CC block/nbd-client.o
CC block/sheepdog.o
CC block/accounting.o
CC block/dirty-bitmap.o
CC block/write-threshold.o
CC block/backup.o
CC block/replication.o
CC block/crypto.o
CC nbd/server.o
CC nbd/client.o
CC nbd/common.o
CC block/dmg.o
CC crypto/hash.o
CC crypto/init.o
CC crypto/hash-glib.o
CC crypto/aes.o
CC crypto/desrfb.o
CC crypto/cipher.o
CC crypto/tlscreds.o
CC crypto/tlscredsanon.o
CC crypto/tlscredsx509.o
CC crypto/tlssession.o
CC crypto/secret.o
CC crypto/random-platform.o
CC crypto/pbkdf.o
CC crypto/ivgen.o
CC crypto/ivgen-essiv.o
CC crypto/ivgen-plain.o
CC crypto/ivgen-plain64.o
CC crypto/afsplit.o
CC crypto/xts.o
CC crypto/block.o
CC crypto/block-qcow.o
CC crypto/block-luks.o
CC io/channel.o
CC io/channel-buffer.o
CC io/channel-command.o
CC io/channel-file.o
CC io/channel-socket.o
CC io/channel-tls.o
CC io/channel-watch.o
CC io/channel-websock.o
CC io/channel-util.o
CC io/task.o
CC qom/object.o
CC qom/container.o
CC qom/qom-qobject.o
CC qom/object_interfaces.o
GEN qemu-img-cmds.h
CC qemu-io.o
CC qemu-bridge-helper.o
CC blockdev.o
CC blockdev-nbd.o
CC iothread.o
CC qdev-monitor.o
CC device-hotplug.o
CC os-posix.o
CC qemu-char.o
CC page_cache.o
CC accel.o
CC bt-host.o
CC dma-helpers.o
CC bt-vhci.o
CC vl.o
CC tpm.o
CC device_tree.o
GEN qmp-marshal.c
CC qmp.o
CC hmp.o
CC tcg-runtime.o
CC audio/audio.o
CC audio/noaudio.o
CC audio/wavaudio.o
CC audio/mixeng.o
CC audio/sdlaudio.o
CC audio/ossaudio.o
CC audio/wavcapture.o
CC backends/rng.o
CC backends/rng-egd.o
CC backends/rng-random.o
CC backends/msmouse.o
CC backends/testdev.o
CC backends/tpm.o
CC backends/hostmem.o
CC backends/hostmem-ram.o
CC backends/hostmem-file.o
CC block/stream.o
CC disas/arm.o
CC disas/i386.o
CC fsdev/qemu-fsdev-dummy.o
CC fsdev/qemu-fsdev-opts.o
CC hw/acpi/core.o
CC hw/acpi/piix4.o
CC hw/acpi/pcihp.o
CC hw/acpi/ich9.o
CC hw/acpi/tco.o
CC hw/acpi/cpu_hotplug.o
CC hw/acpi/memory_hotplug.o
CC hw/acpi/memory_hotplug_acpi_table.o
CC hw/acpi/cpu.o
CC hw/acpi/acpi_interface.o
CC hw/acpi/bios-linker-loader.o
CC hw/acpi/aml-build.o
CC hw/acpi/ipmi.o
CC hw/audio/sb16.o
CC hw/audio/es1370.o
CC hw/audio/ac97.o
CC hw/audio/fmopl.o
CC hw/audio/adlib.o
CC hw/audio/gus.o
CC hw/audio/gusemu_hal.o
CC hw/audio/gusemu_mixer.o
CC hw/audio/cs4231a.o
CC hw/audio/intel-hda.o
CC hw/audio/hda-codec.o
CC hw/audio/pcspk.o
CC hw/audio/wm8750.o
CC hw/audio/pl041.o
CC hw/audio/lm4549.o
CC hw/audio/marvell_88w8618.o
CC hw/block/block.o
CC hw/block/cdrom.o
CC hw/block/hd-geometry.o
CC hw/block/fdc.o
CC hw/block/m25p80.o
CC hw/block/nand.o
CC hw/block/pflash_cfi01.o
CC hw/block/pflash_cfi02.o
CC hw/block/ecc.o
CC hw/block/onenand.o
CC hw/block/nvme.o
CC hw/bt/core.o
CC hw/bt/l2cap.o
CC hw/bt/sdp.o
CC hw/bt/hci.o
CC hw/bt/hid.o
CC hw/bt/hci-csr.o
CC hw/char/ipoctal232.o
CC hw/char/parallel.o
CC hw/char/pl011.o
CC hw/char/serial.o
CC hw/char/serial-isa.o
CC hw/char/serial-pci.o
CC hw/char/virtio-console.o
CC hw/char/cadence_uart.o
CC hw/char/debugcon.o
CC hw/char/imx_serial.o
CC hw/core/qdev.o
CC hw/core/qdev-properties.o
CC hw/core/bus.o
CC hw/core/fw-path-provider.o
CC hw/core/irq.o
CC hw/core/hotplug.o
CC hw/core/ptimer.o
CC hw/core/sysbus.o
CC hw/core/machine.o
CC hw/core/null-machine.o
CC hw/core/loader.o
CC hw/core/qdev-properties-system.o
CC hw/core/register.o
CC hw/core/platform-bus.o
CC hw/display/ads7846.o
CC hw/display/cirrus_vga.o
CC hw/display/pl110.o
CC hw/display/ssd0303.o
CC hw/display/ssd0323.o
CC hw/display/vga-pci.o
CC hw/display/vga-isa.o
CC hw/display/vmware_vga.o
CC hw/display/blizzard.o
CC hw/display/exynos4210_fimd.o
CC hw/display/framebuffer.o
CC hw/display/tc6393xb.o
CC hw/dma/pl080.o
CC hw/dma/pl330.o
CC hw/dma/i8257.o
CC hw/dma/xlnx-zynq-devcfg.o
CC hw/gpio/max7310.o
CC hw/gpio/pl061.o
CC hw/gpio/zaurus.o
CC hw/gpio/gpio_key.o
CC hw/i2c/core.o
CC hw/i2c/smbus.o
CC hw/i2c/smbus_eeprom.o
CC hw/i2c/i2c-ddc.o
CC hw/i2c/versatile_i2c.o
CC hw/i2c/smbus_ich9.o
CC hw/i2c/pm_smbus.o
CC hw/i2c/bitbang_i2c.o
CC hw/i2c/exynos4210_i2c.o
CC hw/i2c/aspeed_i2c.o
CC hw/i2c/imx_i2c.o
CC hw/ide/core.o
CC hw/ide/atapi.o
CC hw/ide/qdev.o
CC hw/ide/pci.o
CC hw/ide/isa.o
CC hw/ide/piix.o
CC hw/ide/microdrive.o
CC hw/ide/ahci.o
CC hw/ide/ich.o
CC hw/input/hid.o
CC hw/input/lm832x.o
CC hw/input/pckbd.o
CC hw/input/pl050.o
CC hw/input/ps2.o
CC hw/input/stellaris_input.o
CC hw/input/tsc2005.o
CC hw/input/vmmouse.o
CC hw/input/virtio-input.o
CC hw/input/virtio-input-hid.o
CC hw/input/virtio-input-host.o
CC hw/intc/i8259_common.o
CC hw/intc/i8259.o
CC hw/intc/pl190.o
CC hw/intc/imx_avic.o
CC hw/intc/realview_gic.o
CC hw/intc/ioapic_common.o
CC hw/intc/arm_gic_common.o
CC hw/intc/arm_gic.o
CC hw/intc/arm_gicv2m.o
CC hw/intc/arm_gicv3_common.o
CC hw/intc/arm_gicv3.o
CC hw/intc/arm_gicv3_dist.o
CC hw/intc/arm_gicv3_redist.o
CC hw/ipack/ipack.o
CC hw/ipack/tpci200.o
CC hw/ipmi/ipmi.o
CC hw/ipmi/ipmi_bmc_sim.o
CC hw/ipmi/ipmi_bmc_extern.o
CC hw/ipmi/isa_ipmi_kcs.o
CC hw/ipmi/isa_ipmi_bt.o
CC hw/isa/isa-bus.o
CC hw/isa/apm.o
CC hw/mem/pc-dimm.o
CC hw/mem/nvdimm.o
CC hw/misc/applesmc.o
CC hw/misc/max111x.o
CC hw/misc/tmp105.o
CC hw/misc/debugexit.o
CC hw/misc/sga.o
CC hw/misc/pc-testdev.o
CC hw/misc/pci-testdev.o
CC hw/misc/arm_l2x0.o
CC hw/misc/arm_integrator_debug.o
CC hw/misc/a9scu.o
CC hw/misc/arm11scu.o
CC hw/net/ne2000.o
CC hw/net/eepro100.o
CC hw/net/pcnet-pci.o
CC hw/net/pcnet.o
CC hw/net/e1000.o
CC hw/net/e1000x_common.o
CC hw/net/net_tx_pkt.o
CC hw/net/net_rx_pkt.o
CC hw/net/e1000e.o
CC hw/net/e1000e_core.o
CC hw/net/rtl8139.o
CC hw/net/vmxnet3.o
CC hw/net/smc91c111.o
CC hw/net/lan9118.o
CC hw/net/ne2000-isa.o
CC hw/net/xgmac.o
CC hw/net/allwinner_emac.o
CC hw/net/imx_fec.o
CC hw/net/cadence_gem.o
CC hw/net/stellaris_enet.o
CC hw/net/rocker/rocker.o
CC hw/net/rocker/rocker_fp.o
CC hw/net/rocker/rocker_desc.o
CC hw/net/rocker/rocker_world.o
CC hw/net/rocker/rocker_of_dpa.o
CC hw/nvram/eeprom93xx.o
CC hw/nvram/fw_cfg.o
CC hw/pci-bridge/pci_bridge_dev.o
CC hw/pci-bridge/pci_expander_bridge.o
CC hw/pci-bridge/xio3130_upstream.o
CC hw/pci-bridge/xio3130_downstream.o
CC hw/pci-bridge/ioh3420.o
CC hw/pci-bridge/i82801b11.o
CC hw/pci-host/pam.o
CC hw/pci-host/versatile.o
CC hw/pci-host/piix.o
CC hw/pci-host/q35.o
CC hw/pci-host/gpex.o
CC hw/pci/pci.o
CC hw/pci/pci_bridge.o
CC hw/pci/msix.o
CC hw/pci/msi.o
CC hw/pci/shpc.o
CC hw/pci/slotid_cap.o
CC hw/pci/pci_host.o
CC hw/pci/pcie_host.o
CC hw/pci/pcie.o
CC hw/pci/pcie_aer.o
CC hw/pci/pcie_port.o
CC hw/pci/pci-stub.o
CC hw/pcmcia/pcmcia.o
CC hw/scsi/scsi-disk.o
CC hw/scsi/scsi-generic.o
CC hw/scsi/scsi-bus.o
CC hw/scsi/lsi53c895a.o
CC hw/scsi/mptsas.o
CC hw/scsi/mptconfig.o
CC hw/scsi/mptendian.o
/tmp/qemu-test/src/hw/nvram/fw_cfg.c: In function ‘fw_cfg_dma_transfer’:
/tmp/qemu-test/src/hw/nvram/fw_cfg.c:330: warning: ‘read’ may be used uninitialized in this function
CC hw/scsi/megasas.o
CC hw/scsi/vmw_pvscsi.o
CC hw/scsi/esp.o
CC hw/scsi/esp-pci.o
CC hw/sd/pl181.o
CC hw/sd/ssi-sd.o
CC hw/sd/sd.o
CC hw/sd/core.o
CC hw/sd/sdhci.o
CC hw/smbios/smbios.o
CC hw/smbios/smbios_type_38.o
CC hw/ssi/pl022.o
CC hw/ssi/ssi.o
CC hw/ssi/xilinx_spips.o
CC hw/ssi/aspeed_smc.o
CC hw/timer/arm_timer.o
CC hw/timer/arm_mptimer.o
CC hw/timer/a9gtimer.o
CC hw/timer/cadence_ttc.o
CC hw/timer/ds1338.o
CC hw/timer/hpet.o
CC hw/timer/i8254_common.o
CC hw/timer/i8254.o
CC hw/timer/pl031.o
CC hw/timer/twl92230.o
CC hw/timer/imx_epit.o
CC hw/timer/imx_gpt.o
CC hw/timer/stm32f2xx_timer.o
CC hw/timer/aspeed_timer.o
CC hw/tpm/tpm_tis.o
CC hw/tpm/tpm_passthrough.o
CC hw/tpm/tpm_util.o
CC hw/usb/core.o
CC hw/usb/combined-packet.o
CC hw/usb/bus.o
CC hw/usb/libhw.o
CC hw/usb/desc.o
CC hw/usb/desc-msos.o
CC hw/usb/hcd-uhci.o
CC hw/usb/hcd-ohci.o
CC hw/usb/hcd-ehci.o
CC hw/usb/hcd-ehci-pci.o
CC hw/usb/hcd-ehci-sysbus.o
CC hw/usb/hcd-xhci.o
CC hw/usb/hcd-musb.o
CC hw/usb/dev-hub.o
CC hw/usb/dev-hid.o
CC hw/usb/dev-wacom.o
CC hw/usb/dev-storage.o
CC hw/usb/dev-uas.o
CC hw/usb/dev-audio.o
CC hw/usb/dev-serial.o
CC hw/usb/dev-network.o
CC hw/usb/dev-bluetooth.o
CC hw/usb/dev-smartcard-reader.o
CC hw/usb/dev-mtp.o
CC hw/usb/host-stub.o
CC hw/virtio/virtio-rng.o
CC hw/virtio/virtio-pci.o
CC hw/virtio/virtio-bus.o
CC hw/virtio/virtio-mmio.o
CC hw/watchdog/watchdog.o
CC hw/watchdog/wdt_i6300esb.o
CC hw/watchdog/wdt_ib700.o
CC migration/migration.o
CC migration/socket.o
CC migration/fd.o
CC migration/exec.o
CC migration/tls.o
CC migration/vmstate.o
CC migration/qemu-file.o
CC migration/qemu-file-channel.o
CC migration/xbzrle.o
CC migration/postcopy-ram.o
CC migration/qjson.o
CC migration/block.o
CC net/net.o
CC net/queue.o
CC net/checksum.o
CC net/util.o
CC net/hub.o
CC net/socket.o
CC net/dump.o
CC net/eth.o
CC net/l2tpv3.o
CC net/tap.o
CC net/vhost-user.o
CC net/tap-linux.o
CC net/slirp.o
CC net/filter.o
CC net/filter-buffer.o
CC net/filter-mirror.o
CC qom/cpu.o
CC replay/replay.o
CC replay/replay-internal.o
/tmp/qemu-test/src/replay/replay-internal.c: In function ‘replay_put_array’:
/tmp/qemu-test/src/replay/replay-internal.c:68: warning: ignoring return value of ‘fwrite’, declared with attribute warn_unused_result
CC replay/replay-events.o
CC replay/replay-time.o
CC replay/replay-char.o
CC replay/replay-input.o
CC slirp/cksum.o
CC slirp/if.o
CC slirp/ip_icmp.o
CC slirp/ip6_icmp.o
CC slirp/ip6_input.o
CC slirp/ip6_output.o
CC slirp/ip_input.o
CC slirp/ip_output.o
CC slirp/dnssearch.o
CC slirp/dhcpv6.o
CC slirp/slirp.o
CC slirp/mbuf.o
CC slirp/misc.o
CC slirp/sbuf.o
CC slirp/socket.o
CC slirp/tcp_input.o
CC slirp/tcp_output.o
CC slirp/tcp_subr.o
CC slirp/tcp_timer.o
/tmp/qemu-test/src/slirp/tcp_input.c: In function ‘tcp_input’:
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_p’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_len’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_tos’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_id’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_off’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_ttl’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_sum’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_src.s_addr’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:219: warning: ‘save_ip.ip_dst.s_addr’ may be used uninitialized in this function
/tmp/qemu-test/src/slirp/tcp_input.c:220: warning: ‘save_ip6.ip_nh’ may be used uninitialized in this function
CC slirp/udp.o
CC slirp/udp6.o
CC slirp/bootp.o
CC slirp/tftp.o
CC slirp/arp_table.o
CC slirp/ndp_table.o
CC ui/keymaps.o
CC ui/console.o
CC ui/cursor.o
CC ui/qemu-pixman.o
CC ui/input.o
CC ui/input-keymap.o
CC ui/input-legacy.o
CC ui/input-linux.o
CC ui/sdl.o
CC ui/sdl_zoom.o
CC ui/x_keymap.o
CC ui/vnc.o
CC ui/vnc-enc-zlib.o
CC ui/vnc-enc-hextile.o
CC ui/vnc-enc-tight.o
CC ui/vnc-palette.o
CC ui/vnc-enc-zrle.o
CC ui/vnc-auth-vencrypt.o
CC ui/vnc-jobs.o
CC ui/vnc-ws.o
LINK tests/qemu-iotests/socket_scm_helper
CC qga/commands.o
CC qga/guest-agent-command-state.o
CC qga/main.o
CC qga/commands-posix.o
CC qga/channel-posix.o
CC qga/qapi-generated/qga-qapi-types.o
CC qga/qapi-generated/qga-qapi-visit.o
AS optionrom/multiboot.o
AS optionrom/linuxboot.o
CC qga/qapi-generated/qga-qmp-marshal.o
CC optionrom/linuxboot_dma.o
cc: unrecognized option '-no-integrated-as'
cc: unrecognized option '-no-integrated-as'
AS optionrom/kvmvapic.o
CC qmp-introspect.o
Building optionrom/multiboot.img
Building optionrom/linuxboot.img
CC qapi-types.o
Building optionrom/linuxboot_dma.img
Building optionrom/kvmvapic.img
Building optionrom/multiboot.raw
Building optionrom/linuxboot.raw
Building optionrom/linuxboot_dma.raw
Building optionrom/kvmvapic.raw
Signing optionrom/multiboot.bin
Signing optionrom/linuxboot.bin
CC qapi-visit.o
CC qapi-event.o
Signing optionrom/linuxboot_dma.bin
Signing optionrom/kvmvapic.bin
AR libqemustub.a
CC qemu-img.o
CC qmp-marshal.o
CC trace/generated-events.o
AR libqemuutil.a
LINK qemu-ga
LINK ivshmem-client
LINK ivshmem-server
LINK qemu-nbd
LINK qemu-io
LINK qemu-bridge-helper
LINK qemu-img
GEN x86_64-softmmu/hmp-commands.h
GEN x86_64-softmmu/hmp-commands-info.h
GEN x86_64-softmmu/qmp-commands-old.h
GEN x86_64-softmmu/config-target.h
GEN aarch64-softmmu/hmp-commands.h
GEN aarch64-softmmu/hmp-commands-info.h
GEN aarch64-softmmu/qmp-commands-old.h
GEN aarch64-softmmu/config-target.h
CC x86_64-softmmu/exec.o
CC x86_64-softmmu/translate-all.o
CC x86_64-softmmu/cpu-exec.o
CC x86_64-softmmu/translate-common.o
CC x86_64-softmmu/cpu-exec-common.o
CC x86_64-softmmu/tcg/tcg.o
CC x86_64-softmmu/tcg/tcg-op.o
CC aarch64-softmmu/exec.o
CC x86_64-softmmu/tcg/optimize.o
CC x86_64-softmmu/tcg/tcg-common.o
CC x86_64-softmmu/fpu/softfloat.o
CC x86_64-softmmu/disas.o
CC x86_64-softmmu/arch_init.o
CC aarch64-softmmu/translate-all.o
CC x86_64-softmmu/cpus.o
CC x86_64-softmmu/monitor.o
CC x86_64-softmmu/gdbstub.o
CC aarch64-softmmu/cpu-exec.o
CC x86_64-softmmu/balloon.o
CC x86_64-softmmu/ioport.o
CC x86_64-softmmu/numa.o
CC aarch64-softmmu/translate-common.o
CC x86_64-softmmu/qtest.o
CC x86_64-softmmu/bootdevice.o
CC x86_64-softmmu/kvm-all.o
CC x86_64-softmmu/memory.o
CC x86_64-softmmu/cputlb.o
CC aarch64-softmmu/cpu-exec-common.o
CC aarch64-softmmu/tcg/tcg.o
CC x86_64-softmmu/memory_mapping.o
CC x86_64-softmmu/dump.o
CC aarch64-softmmu/tcg/tcg-op.o
CC x86_64-softmmu/migration/ram.o
CC aarch64-softmmu/tcg/optimize.o
CC x86_64-softmmu/migration/savevm.o
CC x86_64-softmmu/xen-common-stub.o
CC x86_64-softmmu/xen-hvm-stub.o
CC x86_64-softmmu/hw/acpi/nvdimm.o
CC x86_64-softmmu/hw/block/virtio-blk.o
CC aarch64-softmmu/tcg/tcg-common.o
CC aarch64-softmmu/fpu/softfloat.o
CC aarch64-softmmu/disas.o
CC x86_64-softmmu/hw/block/dataplane/virtio-blk.o
GEN aarch64-softmmu/gdbstub-xml.c
CC aarch64-softmmu/kvm-stub.o
CC aarch64-softmmu/arch_init.o
CC x86_64-softmmu/hw/char/virtio-serial-bus.o
CC aarch64-softmmu/cpus.o
CC x86_64-softmmu/hw/core/nmi.o
CC x86_64-softmmu/hw/cpu/core.o
CC x86_64-softmmu/hw/display/vga.o
CC aarch64-softmmu/monitor.o
CC aarch64-softmmu/gdbstub.o
CC x86_64-softmmu/hw/display/virtio-gpu.o
CC x86_64-softmmu/hw/display/virtio-gpu-3d.o
CC x86_64-softmmu/hw/display/virtio-gpu-pci.o
CC x86_64-softmmu/hw/display/virtio-vga.o
CC aarch64-softmmu/balloon.o
CC aarch64-softmmu/ioport.o
CC aarch64-softmmu/numa.o
CC aarch64-softmmu/qtest.o
CC x86_64-softmmu/hw/intc/apic.o
CC aarch64-softmmu/bootdevice.o
CC x86_64-softmmu/hw/intc/apic_common.o
CC aarch64-softmmu/memory.o
CC aarch64-softmmu/cputlb.o
CC aarch64-softmmu/memory_mapping.o
CC aarch64-softmmu/dump.o
CC x86_64-softmmu/hw/intc/ioapic.o
CC aarch64-softmmu/migration/ram.o
CC x86_64-softmmu/hw/isa/lpc_ich9.o
CC x86_64-softmmu/hw/misc/vmport.o
CC x86_64-softmmu/hw/misc/ivshmem.o
CC x86_64-softmmu/hw/misc/pvpanic.o
CC x86_64-softmmu/hw/misc/edu.o
CC x86_64-softmmu/hw/misc/hyperv_testdev.o
CC aarch64-softmmu/migration/savevm.o
CC x86_64-softmmu/hw/net/virtio-net.o
CC x86_64-softmmu/hw/net/vhost_net.o
CC x86_64-softmmu/hw/scsi/virtio-scsi.o
CC x86_64-softmmu/hw/scsi/virtio-scsi-dataplane.o
CC x86_64-softmmu/hw/scsi/vhost-scsi.o
CC x86_64-softmmu/hw/timer/mc146818rtc.o
CC aarch64-softmmu/xen-common-stub.o
CC x86_64-softmmu/hw/vfio/common.o
CC x86_64-softmmu/hw/vfio/pci.o
CC aarch64-softmmu/xen-hvm-stub.o
CC aarch64-softmmu/hw/block/virtio-blk.o
CC aarch64-softmmu/hw/block/dataplane/virtio-blk.o
CC x86_64-softmmu/hw/vfio/pci-quirks.o
CC x86_64-softmmu/hw/vfio/platform.o
CC aarch64-softmmu/hw/char/exynos4210_uart.o
CC aarch64-softmmu/hw/char/omap_uart.o
CC x86_64-softmmu/hw/vfio/calxeda-xgmac.o
CC aarch64-softmmu/hw/char/digic-uart.o
CC aarch64-softmmu/hw/char/stm32f2xx_usart.o
CC aarch64-softmmu/hw/char/bcm2835_aux.o
CC x86_64-softmmu/hw/vfio/amd-xgbe.o
CC aarch64-softmmu/hw/char/virtio-serial-bus.o
CC x86_64-softmmu/hw/vfio/spapr.o
CC aarch64-softmmu/hw/core/nmi.o
CC aarch64-softmmu/hw/cpu/arm11mpcore.o
CC x86_64-softmmu/hw/virtio/virtio.o
CC aarch64-softmmu/hw/cpu/realview_mpcore.o
CC aarch64-softmmu/hw/cpu/a9mpcore.o
CC aarch64-softmmu/hw/cpu/a15mpcore.o
CC x86_64-softmmu/hw/virtio/virtio-balloon.o
CC aarch64-softmmu/hw/cpu/core.o
CC aarch64-softmmu/hw/display/omap_dss.o
CC aarch64-softmmu/hw/display/omap_lcdc.o
CC aarch64-softmmu/hw/display/pxa2xx_lcd.o
CC aarch64-softmmu/hw/display/bcm2835_fb.o
CC aarch64-softmmu/hw/display/vga.o
CC aarch64-softmmu/hw/display/virtio-gpu.o
CC aarch64-softmmu/hw/display/virtio-gpu-3d.o
CC x86_64-softmmu/hw/virtio/vhost.o
CC x86_64-softmmu/hw/virtio/vhost-backend.o
CC aarch64-softmmu/hw/display/virtio-gpu-pci.o
CC x86_64-softmmu/hw/virtio/vhost-user.o
CC aarch64-softmmu/hw/display/dpcd.o
CC aarch64-softmmu/hw/display/xlnx_dp.o
CC aarch64-softmmu/hw/dma/xlnx_dpdma.o
CC aarch64-softmmu/hw/dma/omap_dma.o
CC aarch64-softmmu/hw/dma/soc_dma.o
CC aarch64-softmmu/hw/dma/pxa2xx_dma.o
CC x86_64-softmmu/hw/virtio/vhost-vsock.o
CC aarch64-softmmu/hw/dma/bcm2835_dma.o
CC x86_64-softmmu/hw/i386/multiboot.o
CC aarch64-softmmu/hw/gpio/omap_gpio.o
CC aarch64-softmmu/hw/gpio/imx_gpio.o
CC aarch64-softmmu/hw/i2c/omap_i2c.o
CC x86_64-softmmu/hw/i386/pc.o
CC aarch64-softmmu/hw/input/pxa2xx_keypad.o
CC x86_64-softmmu/hw/i386/pc_piix.o
CC aarch64-softmmu/hw/input/tsc210x.o
CC x86_64-softmmu/hw/i386/pc_q35.o
CC aarch64-softmmu/hw/intc/armv7m_nvic.o
CC aarch64-softmmu/hw/intc/exynos4210_gic.o
CC aarch64-softmmu/hw/intc/exynos4210_combiner.o
CC aarch64-softmmu/hw/intc/omap_intc.o
CC aarch64-softmmu/hw/intc/bcm2835_ic.o
CC aarch64-softmmu/hw/intc/bcm2836_control.o
CC aarch64-softmmu/hw/intc/allwinner-a10-pic.o
CC aarch64-softmmu/hw/intc/aspeed_vic.o
CC aarch64-softmmu/hw/intc/arm_gicv3_cpuif.o
CC aarch64-softmmu/hw/misc/ivshmem.o
CC aarch64-softmmu/hw/misc/arm_sysctl.o
CC aarch64-softmmu/hw/misc/cbus.o
CC x86_64-softmmu/hw/i386/pc_sysfw.o
/tmp/qemu-test/src/hw/i386/pc_piix.c: In function ‘igd_passthrough_isa_bridge_create’:
/tmp/qemu-test/src/hw/i386/pc_piix.c:1046: warning: ‘pch_rev_id’ may be used uninitialized in this function
CC x86_64-softmmu/hw/i386/x86-iommu.o
CC x86_64-softmmu/hw/i386/intel_iommu.o
CC x86_64-softmmu/hw/i386/kvmvapic.o
CC x86_64-softmmu/hw/i386/acpi-build.o
CC x86_64-softmmu/hw/i386/pci-assign-load-rom.o
CC aarch64-softmmu/hw/misc/exynos4210_pmu.o
CC x86_64-softmmu/hw/i386/kvm/clock.o
CC x86_64-softmmu/hw/i386/kvm/apic.o
CC aarch64-softmmu/hw/misc/imx_ccm.o
CC x86_64-softmmu/hw/i386/kvm/i8259.o
CC x86_64-softmmu/hw/i386/kvm/ioapic.o
CC aarch64-softmmu/hw/misc/imx31_ccm.o
CC aarch64-softmmu/hw/misc/imx25_ccm.o
CC x86_64-softmmu/hw/i386/kvm/i8254.o
CC x86_64-softmmu/hw/i386/kvm/pci-assign.o
CC aarch64-softmmu/hw/misc/imx6_ccm.o
CC aarch64-softmmu/hw/misc/imx6_src.o
CC aarch64-softmmu/hw/misc/mst_fpga.o
CC x86_64-softmmu/target-i386/translate.o
CC aarch64-softmmu/hw/misc/omap_clk.o
/tmp/qemu-test/src/hw/i386/acpi-build.c: In function ‘build_append_pci_bus_devices’:
/tmp/qemu-test/src/hw/i386/acpi-build.c:471: warning: ‘notify_method’ may be used uninitialized in this function
CC x86_64-softmmu/target-i386/helper.o
CC x86_64-softmmu/target-i386/cpu.o
CC aarch64-softmmu/hw/misc/omap_gpmc.o
CC x86_64-softmmu/target-i386/bpt_helper.o
CC aarch64-softmmu/hw/misc/omap_l4.o
CC x86_64-softmmu/target-i386/excp_helper.o
CC x86_64-softmmu/target-i386/fpu_helper.o
CC aarch64-softmmu/hw/misc/omap_sdrc.o
CC aarch64-softmmu/hw/misc/omap_tap.o
CC x86_64-softmmu/target-i386/cc_helper.o
CC x86_64-softmmu/target-i386/int_helper.o
CC aarch64-softmmu/hw/misc/bcm2835_mbox.o
CC aarch64-softmmu/hw/misc/bcm2835_property.o
CC aarch64-softmmu/hw/misc/zynq_slcr.o
CC aarch64-softmmu/hw/misc/zynq-xadc.o
CC aarch64-softmmu/hw/misc/stm32f2xx_syscfg.o
CC aarch64-softmmu/hw/misc/edu.o
CC x86_64-softmmu/target-i386/svm_helper.o
CC aarch64-softmmu/hw/misc/auxbus.o
CC aarch64-softmmu/hw/misc/aspeed_scu.o
CC aarch64-softmmu/hw/misc/aspeed_sdmc.o
CC x86_64-softmmu/target-i386/smm_helper.o
CC aarch64-softmmu/hw/net/virtio-net.o
CC x86_64-softmmu/target-i386/misc_helper.o
CC x86_64-softmmu/target-i386/mem_helper.o
CC x86_64-softmmu/target-i386/seg_helper.o
CC aarch64-softmmu/hw/net/vhost_net.o
CC aarch64-softmmu/hw/pcmcia/pxa2xx.o
CC x86_64-softmmu/target-i386/mpx_helper.o
CC aarch64-softmmu/hw/scsi/virtio-scsi.o
CC x86_64-softmmu/target-i386/gdbstub.o
CC x86_64-softmmu/target-i386/machine.o
CC aarch64-softmmu/hw/scsi/virtio-scsi-dataplane.o
CC aarch64-softmmu/hw/scsi/vhost-scsi.o
CC aarch64-softmmu/hw/sd/omap_mmc.o
CC aarch64-softmmu/hw/sd/pxa2xx_mmci.o
CC aarch64-softmmu/hw/ssi/omap_spi.o
CC x86_64-softmmu/target-i386/arch_memory_mapping.o
CC x86_64-softmmu/target-i386/arch_dump.o
CC aarch64-softmmu/hw/ssi/imx_spi.o
CC aarch64-softmmu/hw/timer/exynos4210_mct.o
CC x86_64-softmmu/target-i386/monitor.o
CC x86_64-softmmu/target-i386/kvm.o
CC aarch64-softmmu/hw/timer/exynos4210_pwm.o
CC x86_64-softmmu/target-i386/hyperv.o
GEN trace/generated-helpers.c
CC aarch64-softmmu/hw/timer/exynos4210_rtc.o
CC x86_64-softmmu/trace/control-target.o
CC aarch64-softmmu/hw/timer/omap_gptimer.o
CC aarch64-softmmu/hw/timer/omap_synctimer.o
CC aarch64-softmmu/hw/timer/pxa2xx_timer.o
CC x86_64-softmmu/trace/generated-helpers.o
CC aarch64-softmmu/hw/timer/digic-timer.o
CC aarch64-softmmu/hw/timer/allwinner-a10-pit.o
CC aarch64-softmmu/hw/usb/tusb6010.o
CC aarch64-softmmu/hw/vfio/common.o
CC aarch64-softmmu/hw/vfio/pci.o
CC aarch64-softmmu/hw/vfio/pci-quirks.o
CC aarch64-softmmu/hw/vfio/platform.o
CC aarch64-softmmu/hw/vfio/calxeda-xgmac.o
CC aarch64-softmmu/hw/vfio/amd-xgbe.o
CC aarch64-softmmu/hw/vfio/spapr.o
CC aarch64-softmmu/hw/virtio/virtio.o
LINK x86_64-softmmu/qemu-system-x86_64
CC aarch64-softmmu/hw/virtio/virtio-balloon.o
CC aarch64-softmmu/hw/virtio/vhost.o
CC aarch64-softmmu/hw/virtio/vhost-backend.o
CC aarch64-softmmu/hw/virtio/vhost-user.o
CC aarch64-softmmu/hw/virtio/vhost-vsock.o
CC aarch64-softmmu/hw/arm/boot.o
CC aarch64-softmmu/hw/arm/collie.o
CC aarch64-softmmu/hw/arm/exynos4_boards.o
CC aarch64-softmmu/hw/arm/gumstix.o
CC aarch64-softmmu/hw/arm/highbank.o
CC aarch64-softmmu/hw/arm/digic_boards.o
CC aarch64-softmmu/hw/arm/integratorcp.o
CC aarch64-softmmu/hw/arm/mainstone.o
CC aarch64-softmmu/hw/arm/musicpal.o
CC aarch64-softmmu/hw/arm/nseries.o
CC aarch64-softmmu/hw/arm/omap_sx1.o
CC aarch64-softmmu/hw/arm/palm.o
CC aarch64-softmmu/hw/arm/realview.o
CC aarch64-softmmu/hw/arm/spitz.o
CC aarch64-softmmu/hw/arm/stellaris.o
CC aarch64-softmmu/hw/arm/tosa.o
CC aarch64-softmmu/hw/arm/versatilepb.o
CC aarch64-softmmu/hw/arm/vexpress.o
CC aarch64-softmmu/hw/arm/virt.o
CC aarch64-softmmu/hw/arm/xilinx_zynq.o
CC aarch64-softmmu/hw/arm/z2.o
CC aarch64-softmmu/hw/arm/virt-acpi-build.o
CC aarch64-softmmu/hw/arm/netduino2.o
CC aarch64-softmmu/hw/arm/sysbus-fdt.o
CC aarch64-softmmu/hw/arm/armv7m.o
CC aarch64-softmmu/hw/arm/exynos4210.o
CC aarch64-softmmu/hw/arm/pxa2xx.o
CC aarch64-softmmu/hw/arm/pxa2xx_gpio.o
CC aarch64-softmmu/hw/arm/pxa2xx_pic.o
CC aarch64-softmmu/hw/arm/digic.o
CC aarch64-softmmu/hw/arm/omap1.o
CC aarch64-softmmu/hw/arm/omap2.o
CC aarch64-softmmu/hw/arm/strongarm.o
CC aarch64-softmmu/hw/arm/allwinner-a10.o
CC aarch64-softmmu/hw/arm/cubieboard.o
CC aarch64-softmmu/hw/arm/bcm2835_peripherals.o
CC aarch64-softmmu/hw/arm/bcm2836.o
CC aarch64-softmmu/hw/arm/raspi.o
CC aarch64-softmmu/hw/arm/stm32f205_soc.o
CC aarch64-softmmu/hw/arm/xlnx-zynqmp.o
CC aarch64-softmmu/hw/arm/xlnx-ep108.o
CC aarch64-softmmu/hw/arm/fsl-imx25.o
CC aarch64-softmmu/hw/arm/imx25_pdk.o
CC aarch64-softmmu/hw/arm/fsl-imx31.o
CC aarch64-softmmu/hw/arm/kzm.o
CC aarch64-softmmu/hw/arm/fsl-imx6.o
CC aarch64-softmmu/hw/arm/sabrelite.o
CC aarch64-softmmu/hw/arm/ast2400.o
CC aarch64-softmmu/hw/arm/palmetto-bmc.o
CC aarch64-softmmu/target-arm/arm-semi.o
CC aarch64-softmmu/target-arm/machine.o
CC aarch64-softmmu/target-arm/psci.o
CC aarch64-softmmu/target-arm/arch_dump.o
CC aarch64-softmmu/target-arm/monitor.o
CC aarch64-softmmu/target-arm/kvm-stub.o
CC aarch64-softmmu/target-arm/translate.o
CC aarch64-softmmu/target-arm/op_helper.o
CC aarch64-softmmu/target-arm/helper.o
CC aarch64-softmmu/target-arm/cpu.o
CC aarch64-softmmu/target-arm/iwmmxt_helper.o
CC aarch64-softmmu/target-arm/neon_helper.o
CC aarch64-softmmu/target-arm/gdbstub.o
CC aarch64-softmmu/target-arm/cpu64.o
CC aarch64-softmmu/target-arm/translate-a64.o
CC aarch64-softmmu/target-arm/helper-a64.o
CC aarch64-softmmu/target-arm/gdbstub64.o
CC aarch64-softmmu/target-arm/crypto_helper.o
CC aarch64-softmmu/target-arm/arm-powerctl.o
GEN trace/generated-helpers.c
CC aarch64-softmmu/trace/control-target.o
CC aarch64-softmmu/gdbstub-xml.o
CC aarch64-softmmu/trace/generated-helpers.o
/tmp/qemu-test/src/target-arm/translate-a64.c: In function ‘handle_shri_with_rndacc’:
/tmp/qemu-test/src/target-arm/translate-a64.c:6308: warning: ‘tcg_src_hi’ may be used uninitialized in this function
/tmp/qemu-test/src/target-arm/translate-a64.c: In function ‘disas_simd_scalar_two_reg_misc’:
/tmp/qemu-test/src/target-arm/translate-a64.c:8035: warning: ‘rmode’ may be used uninitialized in this function
LINK aarch64-softmmu/qemu-system-aarch64
TEST tests/qapi-schema/alternate-any.out
TEST tests/qapi-schema/alternate-array.out
TEST tests/qapi-schema/alternate-base.out
TEST tests/qapi-schema/alternate-clash.out
TEST tests/qapi-schema/alternate-conflict-dict.out
TEST tests/qapi-schema/alternate-conflict-string.out
TEST tests/qapi-schema/alternate-empty.out
TEST tests/qapi-schema/alternate-nested.out
TEST tests/qapi-schema/alternate-unknown.out
TEST tests/qapi-schema/args-alternate.out
TEST tests/qapi-schema/args-any.out
TEST tests/qapi-schema/args-array-empty.out
TEST tests/qapi-schema/args-array-unknown.out
TEST tests/qapi-schema/args-bad-boxed.out
TEST tests/qapi-schema/args-boxed-anon.out
TEST tests/qapi-schema/args-boxed-empty.out
TEST tests/qapi-schema/args-boxed-string.out
TEST tests/qapi-schema/args-int.out
TEST tests/qapi-schema/args-invalid.out
TEST tests/qapi-schema/args-member-array-bad.out
TEST tests/qapi-schema/args-member-case.out
TEST tests/qapi-schema/args-member-unknown.out
TEST tests/qapi-schema/args-name-clash.out
TEST tests/qapi-schema/args-union.out
TEST tests/qapi-schema/args-unknown.out
TEST tests/qapi-schema/bad-base.out
TEST tests/qapi-schema/bad-data.out
TEST tests/qapi-schema/bad-ident.out
TEST tests/qapi-schema/bad-type-bool.out
TEST tests/qapi-schema/bad-type-dict.out
TEST tests/qapi-schema/bad-type-int.out
TEST tests/qapi-schema/base-cycle-direct.out
TEST tests/qapi-schema/base-cycle-indirect.out
TEST tests/qapi-schema/command-int.out
TEST tests/qapi-schema/comments.out
TEST tests/qapi-schema/double-data.out
TEST tests/qapi-schema/duplicate-key.out
TEST tests/qapi-schema/double-type.out
TEST tests/qapi-schema/empty.out
TEST tests/qapi-schema/enum-bad-name.out
TEST tests/qapi-schema/enum-bad-prefix.out
TEST tests/qapi-schema/enum-clash-member.out
TEST tests/qapi-schema/enum-dict-member.out
TEST tests/qapi-schema/enum-int-member.out
TEST tests/qapi-schema/enum-member-case.out
TEST tests/qapi-schema/enum-missing-data.out
TEST tests/qapi-schema/enum-wrong-data.out
TEST tests/qapi-schema/escape-outside-string.out
TEST tests/qapi-schema/escape-too-big.out
TEST tests/qapi-schema/escape-too-short.out
TEST tests/qapi-schema/event-boxed-empty.out
TEST tests/qapi-schema/event-case.out
TEST tests/qapi-schema/event-nest-struct.out
TEST tests/qapi-schema/flat-union-array-branch.out
TEST tests/qapi-schema/flat-union-bad-base.out
TEST tests/qapi-schema/flat-union-bad-discriminator.out
TEST tests/qapi-schema/flat-union-base-any.out
TEST tests/qapi-schema/flat-union-base-union.out
TEST tests/qapi-schema/flat-union-clash-member.out
TEST tests/qapi-schema/flat-union-empty.out
TEST tests/qapi-schema/flat-union-incomplete-branch.out
TEST tests/qapi-schema/flat-union-inline.out
TEST tests/qapi-schema/flat-union-int-branch.out
TEST tests/qapi-schema/flat-union-invalid-branch-key.out
TEST tests/qapi-schema/flat-union-invalid-discriminator.out
TEST tests/qapi-schema/flat-union-no-base.out
TEST tests/qapi-schema/flat-union-optional-discriminator.out
TEST tests/qapi-schema/flat-union-string-discriminator.out
TEST tests/qapi-schema/funny-char.out
TEST tests/qapi-schema/ident-with-escape.out
TEST tests/qapi-schema/include-before-err.out
TEST tests/qapi-schema/include-cycle.out
TEST tests/qapi-schema/include-format-err.out
TEST tests/qapi-schema/include-nested-err.out
TEST tests/qapi-schema/include-no-file.out
TEST tests/qapi-schema/include-non-file.out
TEST tests/qapi-schema/include-relpath.out
TEST tests/qapi-schema/include-repetition.out
TEST tests/qapi-schema/include-self-cycle.out
TEST tests/qapi-schema/include-simple.out
TEST tests/qapi-schema/indented-expr.out
TEST tests/qapi-schema/leading-comma-list.out
TEST tests/qapi-schema/leading-comma-object.out
TEST tests/qapi-schema/missing-colon.out
TEST tests/qapi-schema/missing-comma-list.out
TEST tests/qapi-schema/missing-comma-object.out
TEST tests/qapi-schema/missing-type.out
TEST tests/qapi-schema/nested-struct-data.out
TEST tests/qapi-schema/non-objects.out
TEST tests/qapi-schema/qapi-schema-test.out
TEST tests/qapi-schema/quoted-structural-chars.out
TEST tests/qapi-schema/redefined-builtin.out
TEST tests/qapi-schema/redefined-command.out
TEST tests/qapi-schema/redefined-event.out
TEST tests/qapi-schema/redefined-type.out
TEST tests/qapi-schema/reserved-command-q.out
TEST tests/qapi-schema/reserved-enum-q.out
TEST tests/qapi-schema/reserved-member-has.out
TEST tests/qapi-schema/reserved-member-q.out
TEST tests/qapi-schema/reserved-member-u.out
TEST tests/qapi-schema/reserved-member-underscore.out
TEST tests/qapi-schema/reserved-type-kind.out
TEST tests/qapi-schema/reserved-type-list.out
TEST tests/qapi-schema/returns-alternate.out
TEST tests/qapi-schema/returns-array-bad.out
TEST tests/qapi-schema/returns-dict.out
TEST tests/qapi-schema/returns-unknown.out
TEST tests/qapi-schema/returns-whitelist.out
TEST tests/qapi-schema/struct-base-clash-deep.out
TEST tests/qapi-schema/struct-base-clash.out
TEST tests/qapi-schema/struct-data-invalid.out
TEST tests/qapi-schema/struct-member-invalid.out
TEST tests/qapi-schema/trailing-comma-list.out
TEST tests/qapi-schema/trailing-comma-object.out
TEST tests/qapi-schema/type-bypass-bad-gen.out
TEST tests/qapi-schema/unclosed-list.out
TEST tests/qapi-schema/unclosed-object.out
TEST tests/qapi-schema/unclosed-string.out
TEST tests/qapi-schema/unicode-str.out
TEST tests/qapi-schema/union-base-no-discriminator.out
TEST tests/qapi-schema/union-branch-case.out
TEST tests/qapi-schema/union-clash-branches.out
TEST tests/qapi-schema/union-empty.out
TEST tests/qapi-schema/union-invalid-base.out
TEST tests/qapi-schema/union-optional-branch.out
TEST tests/qapi-schema/union-unknown.out
TEST tests/qapi-schema/unknown-escape.out
TEST tests/qapi-schema/unknown-expr-key.out
CC tests/check-qdict.o
CC tests/check-qfloat.o
CC tests/check-qint.o
CC tests/check-qstring.o
CC tests/check-qlist.o
CC tests/check-qnull.o
CC tests/check-qjson.o
CC tests/test-qmp-output-visitor.o
GEN tests/test-qapi-visit.c
GEN tests/test-qapi-types.c
GEN tests/test-qapi-event.c
GEN tests/test-qmp-introspect.c
CC tests/test-clone-visitor.o
CC tests/test-qmp-input-visitor.o
CC tests/test-qmp-input-strict.o
CC tests/test-qmp-commands.o
GEN tests/test-qmp-marshal.c
CC tests/test-string-input-visitor.o
CC tests/test-string-output-visitor.o
CC tests/test-qmp-event.o
CC tests/test-opts-visitor.o
CC tests/test-coroutine.o
CC tests/test-visitor-serialization.o
CC tests/test-iov.o
CC tests/test-aio.o
CC tests/test-rfifolock.o
CC tests/test-throttle.o
CC tests/test-thread-pool.o
CC tests/test-hbitmap.o
CC tests/test-blockjob.o
CC tests/test-blockjob-txn.o
CC tests/test-x86-cpuid.o
CC tests/test-xbzrle.o
CC tests/test-vmstate.o
CC tests/test-cutils.o
CC tests/test-mul64.o
CC tests/test-int128.o
CC tests/rcutorture.o
CC tests/test-rcu-list.o
/tmp/qemu-test/src/tests/test-int128.c:180: warning: ‘__noclone__’ attribute directive ignored
CC tests/test-qdist.o
CC tests/test-qht.o
CC tests/test-qht-par.o
CC tests/qht-bench.o
CC tests/test-bitops.o
CC tests/check-qom-interface.o
CC tests/check-qom-proplist.o
CC tests/test-qemu-opts.o
CC tests/test-write-threshold.o
CC tests/test-crypto-hash.o
CC tests/test-crypto-cipher.o
CC tests/test-crypto-secret.o
CC tests/test-qga.o
CC tests/libqtest.o
CC tests/test-timed-average.o
CC tests/test-io-task.o
CC tests/test-io-channel-socket.o
CC tests/io-channel-helpers.o
CC tests/test-io-channel-file.o
CC tests/test-io-channel-command.o
CC tests/test-io-channel-buffer.o
CC tests/test-base64.o
CC tests/test-crypto-ivgen.o
CC tests/test-crypto-afsplit.o
CC tests/test-crypto-xts.o
CC tests/test-crypto-block.o
CC tests/test-logging.o
CC tests/test-replication.o
CC tests/vhost-user-test.o
CC tests/libqos/pci.o
CC tests/libqos/fw_cfg.o
CC tests/libqos/malloc.o
CC tests/libqos/i2c.o
CC tests/libqos/libqos.o
CC tests/libqos/pci-pc.o
CC tests/libqos/malloc-pc.o
CC tests/libqos/libqos-pc.o
CC tests/libqos/ahci.o
CC tests/libqos/virtio.o
CC tests/libqos/virtio-pci.o
CC tests/libqos/virtio-mmio.o
CC tests/libqos/malloc-generic.o
CC tests/endianness-test.o
CC tests/fdc-test.o
CC tests/ide-test.o
CC tests/ahci-test.o
CC tests/hd-geo-test.o
/tmp/qemu-test/src/tests/ide-test.c: In function ‘cdrom_pio_impl’:
/tmp/qemu-test/src/tests/ide-test.c:739: warning: ignoring return value of ‘fwrite’, declared with attribute warn_unused_result
/tmp/qemu-test/src/tests/ide-test.c: In function ‘test_cdrom_dma’:
/tmp/qemu-test/src/tests/ide-test.c:832: warning: ignoring return value of ‘fwrite’, declared with attribute warn_unused_result
CC tests/boot-order-test.o
CC tests/bios-tables-test.o
CC tests/boot-sector.o
CC tests/boot-serial-test.o
CC tests/pxe-test.o
/tmp/qemu-test/src/tests/boot-sector.c: In function ‘boot_sector_init’:
/tmp/qemu-test/src/tests/boot-sector.c:80: warning: ignoring return value of ‘fwrite’, declared with attribute warn_unused_result
CC tests/rtc-test.o
CC tests/ipmi-kcs-test.o
CC tests/ipmi-bt-test.o
CC tests/i440fx-test.o
CC tests/fw_cfg-test.o
CC tests/drive_del-test.o
CC tests/wdt_ib700-test.o
CC tests/tco-test.o
CC tests/e1000-test.o
CC tests/e1000e-test.o
CC tests/rtl8139-test.o
CC tests/pcnet-test.o
CC tests/eepro100-test.o
CC tests/ne2000-test.o
CC tests/nvme-test.o
CC tests/ac97-test.o
CC tests/es1370-test.o
CC tests/virtio-net-test.o
CC tests/virtio-balloon-test.o
CC tests/virtio-blk-test.o
CC tests/virtio-rng-test.o
CC tests/virtio-scsi-test.o
CC tests/virtio-serial-test.o
CC tests/virtio-console-test.o
CC tests/tpci200-test.o
CC tests/ipoctal232-test.o
CC tests/display-vga-test.o
CC tests/intel-hda-test.o
CC tests/ivshmem-test.o
CC tests/vmxnet3-test.o
CC tests/pvpanic-test.o
CC tests/i82801b11-test.o
CC tests/ioh3420-test.o
CC tests/usb-hcd-ohci-test.o
CC tests/libqos/usb.o
CC tests/usb-hcd-uhci-test.o
CC tests/usb-hcd-ehci-test.o
CC tests/usb-hcd-xhci-test.o
CC tests/pc-cpu-test.o
CC tests/q35-test.o
CC tests/test-netfilter.o
CC tests/test-filter-mirror.o
CC tests/test-filter-redirector.o
CC tests/postcopy-test.o
CC tests/device-introspect-test.o
CC tests/qom-test.o
LINK tests/check-qdict
LINK tests/check-qfloat
LINK tests/check-qint
LINK tests/check-qstring
LINK tests/check-qlist
LINK tests/check-qnull
LINK tests/check-qjson
CC tests/test-qapi-visit.o
CC tests/test-qapi-types.o
CC tests/test-qapi-event.o
CC tests/test-qmp-introspect.o
CC tests/test-qmp-marshal.o
LINK tests/test-coroutine
LINK tests/test-iov
LINK tests/test-aio
LINK tests/test-rfifolock
LINK tests/test-throttle
LINK tests/test-thread-pool
LINK tests/test-hbitmap
LINK tests/test-blockjob
LINK tests/test-blockjob-txn
LINK tests/test-x86-cpuid
LINK tests/test-xbzrle
LINK tests/test-vmstate
LINK tests/test-cutils
LINK tests/test-mul64
LINK tests/test-int128
LINK tests/rcutorture
LINK tests/test-rcu-list
LINK tests/test-qdist
LINK tests/test-qht
LINK tests/qht-bench
LINK tests/test-bitops
LINK tests/check-qom-interface
LINK tests/check-qom-proplist
LINK tests/test-qemu-opts
LINK tests/test-write-threshold
LINK tests/test-crypto-hash
LINK tests/test-crypto-cipher
LINK tests/test-crypto-secret
LINK tests/test-qga
LINK tests/test-timed-average
LINK tests/test-io-task
LINK tests/test-io-channel-socket
LINK tests/test-io-channel-file
LINK tests/test-io-channel-command
LINK tests/test-io-channel-buffer
LINK tests/test-base64
LINK tests/test-crypto-ivgen
LINK tests/test-crypto-afsplit
LINK tests/test-crypto-xts
LINK tests/test-crypto-block
LINK tests/test-logging
LINK tests/test-replication
LINK tests/vhost-user-test
LINK tests/endianness-test
LINK tests/fdc-test
LINK tests/ide-test
LINK tests/ahci-test
LINK tests/hd-geo-test
LINK tests/boot-order-test
LINK tests/bios-tables-test
LINK tests/boot-serial-test
LINK tests/pxe-test
LINK tests/rtc-test
LINK tests/ipmi-kcs-test
LINK tests/ipmi-bt-test
LINK tests/i440fx-test
LINK tests/fw_cfg-test
LINK tests/drive_del-test
LINK tests/wdt_ib700-test
LINK tests/tco-test
LINK tests/e1000-test
LINK tests/e1000e-test
LINK tests/rtl8139-test
LINK tests/pcnet-test
LINK tests/eepro100-test
LINK tests/ne2000-test
LINK tests/nvme-test
LINK tests/ac97-test
LINK tests/es1370-test
LINK tests/virtio-net-test
LINK tests/virtio-balloon-test
LINK tests/virtio-blk-test
LINK tests/virtio-rng-test
LINK tests/virtio-scsi-test
LINK tests/virtio-serial-test
LINK tests/virtio-console-test
LINK tests/tpci200-test
LINK tests/ipoctal232-test
LINK tests/display-vga-test
LINK tests/intel-hda-test
LINK tests/ivshmem-test
LINK tests/vmxnet3-test
LINK tests/pvpanic-test
LINK tests/i82801b11-test
LINK tests/ioh3420-test
LINK tests/usb-hcd-ohci-test
LINK tests/usb-hcd-uhci-test
LINK tests/usb-hcd-ehci-test
LINK tests/usb-hcd-xhci-test
LINK tests/pc-cpu-test
LINK tests/q35-test
LINK tests/test-netfilter
LINK tests/test-filter-mirror
LINK tests/test-filter-redirector
LINK tests/postcopy-test
LINK tests/device-introspect-test
LINK tests/qom-test
GTESTER tests/check-qint
GTESTER tests/check-qdict
GTESTER tests/check-qfloat
GTESTER tests/check-qstring
GTESTER tests/check-qlist
GTESTER tests/check-qnull
GTESTER tests/check-qjson
LINK tests/test-qmp-output-visitor
LINK tests/test-clone-visitor
LINK tests/test-qmp-input-visitor
LINK tests/test-qmp-input-strict
LINK tests/test-qmp-commands
LINK tests/test-string-input-visitor
LINK tests/test-string-output-visitor
LINK tests/test-qmp-event
LINK tests/test-opts-visitor
GTESTER tests/test-coroutine
LINK tests/test-visitor-serialization
GTESTER tests/test-iov
GTESTER tests/test-aio
GTESTER tests/test-rfifolock
GTESTER tests/test-throttle
GTESTER tests/test-thread-pool
GTESTER tests/test-hbitmap
GTESTER tests/test-blockjob
GTESTER tests/test-blockjob-txn
GTESTER tests/test-x86-cpuid
GTESTER tests/test-xbzrle
GTESTER tests/test-vmstate
GTESTER tests/test-cutils
GTESTER tests/test-mul64
GTESTER tests/test-int128
GTESTER tests/rcutorture
GTESTER tests/test-rcu-list
GTESTER tests/test-qdist
GTESTER tests/test-qht
LINK tests/test-qht-par
GTESTER tests/test-bitops
GTESTER tests/check-qom-interface
GTESTER tests/check-qom-proplist
GTESTER tests/test-qemu-opts
GTESTER tests/test-write-threshold
GTESTER tests/test-crypto-hash
GTESTER tests/test-crypto-cipher
GTESTER tests/test-crypto-secret
GTESTER tests/test-qga
GTESTER tests/test-timed-average
GTESTER tests/test-io-task
GTESTER tests/test-io-channel-socket
GTESTER tests/test-io-channel-file
GTESTER tests/test-io-channel-command
GTESTER tests/test-io-channel-buffer
GTESTER tests/test-base64
GTESTER tests/test-crypto-ivgen
GTESTER tests/test-crypto-afsplit
GTESTER tests/test-crypto-xts
GTESTER tests/test-crypto-block
GTESTER tests/test-logging
GTESTER tests/test-replication
GTESTER check-qtest-x86_64
GTESTER check-qtest-aarch64
GTESTER tests/test-qmp-output-visitor
GTESTER tests/test-clone-visitor
GTESTER tests/test-qmp-input-visitor
GTESTER tests/test-qmp-input-strict
GTESTER tests/test-qmp-commands
GTESTER tests/test-string-input-visitor
GTESTER tests/test-string-output-visitor
GTESTER tests/test-qmp-event
GTESTER tests/test-opts-visitor
GTESTER tests/test-visitor-serialization
GTESTER tests/test-qht-par
=== OUTPUT END ===
Abort: command timeout (>3600 seconds)
---
Email generated automatically by Patchew [http://patchew.org/].
Please send your feedback to patchew-devel@freelists.org
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/6] trace: add trace event iterator APIs
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 1/6] trace: add trace event iterator APIs Daniel P. Berrange
@ 2016-09-14 21:53 ` Lluís Vilanova
2016-09-15 9:07 ` Daniel P. Berrange
0 siblings, 1 reply; 20+ messages in thread
From: Lluís Vilanova @ 2016-09-14 21:53 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
Daniel P Berrange writes:
> Currently methods which want to iterate over trace events,
> do so using the trace_event_count() and trace_event_id()
> methods. This leaks the concept of a single ID enum to
> the callers. There is an alternative trace_event_pattern()
> method which can be used in an iteration context, but its
> design is stateless, so is not easy to expand it in the
> future.
> This defines a formal iterator API will provide an future
> proof way of iterating over events.
> The iterator is also able to apply a pattern match filter
> to events, further removing the need for the pattern
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> ---
> trace/control.c | 20 ++++++++++++++++++++
> trace/control.h | 27 +++++++++++++++++++++++++++
> 2 files changed, 47 insertions(+)
> diff --git a/trace/control.c b/trace/control.c
> index 05d85ac..b871727 100644
> --- a/trace/control.c
> +++ b/trace/control.c
> @@ -125,6 +125,26 @@ TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
> return NULL;
> }
> +void trace_event_iter_init(TraceEventIter *iter, const char *pattern)
> +{
> + iter->event = 0;
> + iter->pattern = pattern;
> +}
> +
> +TraceEvent *trace_event_iter_next(TraceEventIter *iter)
> +{
> + while (iter->event < TRACE_EVENT_COUNT) {
> + if (!iter->pattern ||
> + pattern_glob(iter->pattern,
> + trace_event_get_name(&(trace_events[iter->event])))) {
> + return &(trace_events[iter->event]);
That's a picky one (feel free to ignore), but can you refactor
"&(trace_events[iter->event])" out into a variable? The long pattern_glob() call
is a bit hard to parse.
> + }
> + iter->event++;
> + }
> +
> + return NULL;
> +}
> +
> void trace_list_events(void)
> {
> int i;
> diff --git a/trace/control.h b/trace/control.h
> index 27a16fc..c71b405 100644
> --- a/trace/control.h
> +++ b/trace/control.h
> @@ -13,6 +13,10 @@
> #include "qemu-common.h"
> #include "trace/generated-events.h"
> +typedef struct TraceEventIter {
> + size_t event;
Shouldn't this be TraceEventID for consistence with "trace/control.h"? But if
you're going to drop TraceEventID in a later series feel free to ignore me.
Other than those two, the rest looks good to me.
Cheers,
Lluis
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 2/6] trace: convert code to use event iterators
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 2/6] trace: convert code to use event iterators Daniel P. Berrange
@ 2016-09-14 22:16 ` Lluís Vilanova
2016-09-15 9:09 ` Daniel P. Berrange
0 siblings, 1 reply; 20+ messages in thread
From: Lluís Vilanova @ 2016-09-14 22:16 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
Daniel P Berrange writes:
> This converts the HMP/QMP monitor API implementations
> and some internal trace control methods to use the new
> trace event iterator APIs.
> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> ---
> monitor.c | 16 ++++++----
> trace/control.c | 94 ++++++++++++++++++++++++++++++++++-----------------------
> trace/qmp.c | 16 ++++++----
> 3 files changed, 76 insertions(+), 50 deletions(-)
> diff --git a/monitor.c b/monitor.c
> index 5c00373..7b979a6 100644
> --- a/monitor.c
> +++ b/monitor.c
> @@ -3335,9 +3335,11 @@ void info_trace_events_completion(ReadLineState *rs, int nb_args, const char *st
> len = strlen(str);
> readline_set_completion_index(rs, len);
> if (nb_args == 2) {
> - TraceEventID id;
> - for (id = 0; id < trace_event_count(); id++) {
> - const char *event_name = trace_event_get_name(trace_event_id(id));
> + TraceEventIter iter;
> + TraceEvent *ev;
> + trace_event_iter_init(&iter, NULL);
> + while ((ev = trace_event_iter_next(&iter)) != NULL) {
> + const char *event_name = trace_event_get_name(ev);
> if (!strncmp(str, event_name, len)) {
> readline_add_completion(rs, event_name);
> }
> @@ -3352,9 +3354,11 @@ void trace_event_completion(ReadLineState *rs, int nb_args, const char *str)
> len = strlen(str);
> readline_set_completion_index(rs, len);
> if (nb_args == 2) {
> - TraceEventID id;
> - for (id = 0; id < trace_event_count(); id++) {
> - const char *event_name = trace_event_get_name(trace_event_id(id));
> + TraceEventIter iter;
> + TraceEvent *ev;
> + trace_event_iter_init(&iter, NULL);
> + while ((ev = trace_event_iter_next(&iter)) != NULL) {
> + const char *event_name = trace_event_get_name(ev);
> if (!strncmp(str, event_name, len)) {
> readline_add_completion(rs, event_name);
> }
> diff --git a/trace/control.c b/trace/control.c
> index b871727..8fa7ed6 100644
> --- a/trace/control.c
> +++ b/trace/control.c
> @@ -60,9 +60,10 @@ TraceEvent *trace_event_name(const char *name)
> {
> assert(name != NULL);
> - TraceEventID i;
> - for (i = 0; i < trace_event_count(); i++) {
> - TraceEvent *ev = trace_event_id(i);
> + TraceEventIter iter;
> + TraceEvent *ev;
> + trace_event_iter_init(&iter, NULL);
> + while ((ev = trace_event_iter_next(&iter)) != NULL) {
> if (strcmp(trace_event_get_name(ev), name) == 0) {
> return ev;
> }
You could pass "name" in the pattern argument, and then remove the
strcmp(). It'll be simpler code, but pattern_glob() is less efficient than
strcmp().
To solve that, maybe you could subsume exact name matching (trace_event_name())
and pattern matching into the iterator interface (strcmp() / pattern_glob()) by
either checking trace_event_is_pattern() when initializing the iterator (pattern
auto-detection), or explicitly passing either a name or pattern argument (if you
want an extra-paranoid API; via two char* or a char*+bool).
I haven't checked if that would weird other code out when using iterators for a
simple exact match.
> @@ -105,21 +106,20 @@ TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
> {
> assert(pat != NULL);
> - TraceEventID i;
> -
> - if (ev == NULL) {
> - i = -1;
> - } else {
> - i = trace_event_get_id(ev);
> - }
> - i++;
> -
> - while (i < trace_event_count()) {
> - TraceEvent *res = trace_event_id(i);
> - if (pattern_glob(pat, trace_event_get_name(res))) {
> - return res;
> + bool matched = ev ? false : true;
> + TraceEventIter iter;
> + TraceEvent *thisev;
> + trace_event_iter_init(&iter, NULL);
> + while ((thisev = trace_event_iter_next(&iter)) != NULL) {
> + if (matched) {
> + if (pattern_glob(pat, trace_event_get_name(thisev))) {
> + return thisev;
> + }
> + } else {
> + if (ev == thisev) {
> + matched = true;
> + }
> }
> - i++;
> }
> return NULL;
Shouldn't this pass "pat" to trace_event_iter_init() and then not use
pattern_glob()?
I just realized this is dropped on next patch, so ignore me.
Cheers,
Lluis
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 3/6] trace: remove some now unused functions
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 3/6] trace: remove some now unused functions Daniel P. Berrange
@ 2016-09-14 22:21 ` Lluís Vilanova
0 siblings, 0 replies; 20+ messages in thread
From: Lluís Vilanova @ 2016-09-14 22:21 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
Daniel P Berrange writes:
> The trace_event_count, trace_event_id and
> trace_event_pattern methods are no longer required
> now that everything is using the iterator APIs
> The trace_event_set_state and trace_event_set_vcpu_state
> macros were also unused.
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Reviewed-by: Lluís Vilanova <vilanova@ac.upc.edu>
> ---
> trace/control-internal.h | 11 ---------
> trace/control.c | 22 ------------------
> trace/control.h | 59 ------------------------------------------------
> 3 files changed, 92 deletions(-)
> diff --git a/trace/control-internal.h b/trace/control-internal.h
> index a4e5f4a..7f31e39 100644
> --- a/trace/control-internal.h
> +++ b/trace/control-internal.h
> @@ -20,17 +20,6 @@ extern uint16_t trace_events_dstate[];
> extern int trace_events_enabled_count;
> -static inline TraceEventID trace_event_count(void)
> -{
> - return TRACE_EVENT_COUNT;
> -}
> -
> -static inline TraceEvent *trace_event_id(TraceEventID id)
> -{
> - assert(id < trace_event_count());
> - return &trace_events[id];
> -}
> -
> static inline bool trace_event_is_pattern(const char *str)
> {
> assert(str != NULL);
> diff --git a/trace/control.c b/trace/control.c
> index 8fa7ed6..e9a64d0 100644
> --- a/trace/control.c
> +++ b/trace/control.c
> @@ -102,28 +102,6 @@ static bool pattern_glob(const char *pat, const char *ev)
> }
> }
> -TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
> -{
> - assert(pat != NULL);
> -
> - bool matched = ev ? false : true;
> - TraceEventIter iter;
> - TraceEvent *thisev;
> - trace_event_iter_init(&iter, NULL);
> - while ((thisev = trace_event_iter_next(&iter)) != NULL) {
> - if (matched) {
> - if (pattern_glob(pat, trace_event_get_name(thisev))) {
> - return thisev;
> - }
> - } else {
> - if (ev == thisev) {
> - matched = true;
> - }
> - }
> - }
> -
> - return NULL;
> -}
> void trace_event_iter_init(TraceEventIter *iter, const char *pattern)
> {
> diff --git a/trace/control.h b/trace/control.h
> index c71b405..e80c220 100644
> --- a/trace/control.h
> +++ b/trace/control.h
> @@ -52,21 +52,6 @@ void trace_event_iter_init(TraceEventIter *iter, const char *pattern);
> */
> TraceEvent *trace_event_iter_next(TraceEventIter *iter);
> -/**
> - * trace_event_id:
> - * @id: Event identifier.
> - *
> - * Get an event by its identifier.
> - *
> - * This routine has a constant cost, as opposed to trace_event_name and
> - * trace_event_pattern.
> - *
> - * Pre-conditions: The identifier is valid.
> - *
> - * Returns: pointer to #TraceEvent.
> - *
> - */
> -static TraceEvent *trace_event_id(TraceEventID id);
> /**
> * trace_event_name:
> @@ -79,31 +64,12 @@ static TraceEvent *trace_event_id(TraceEventID id);
> TraceEvent *trace_event_name(const char *name);
> /**
> - * trace_event_pattern:
> - * @pat: Event name pattern.
> - * @ev: Event to start searching from (not included).
> - *
> - * Get all events with a given name pattern.
> - *
> - * Returns: pointer to #TraceEvent or NULL if not found.
> - */
> -TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev);
> -
> -/**
> * trace_event_is_pattern:
> *
> * Whether the given string is an event name pattern.
> */
> static bool trace_event_is_pattern(const char *str);
> -/**
> - * trace_event_count:
> - *
> - * Return the number of events.
> - */
> -static TraceEventID trace_event_count(void);
> -
> -
> /**
> * trace_event_get_id:
> @@ -194,31 +160,6 @@ static bool trace_event_get_state_dynamic(TraceEvent *ev);
> */
> static bool trace_event_get_vcpu_state_dynamic(CPUState *vcpu, TraceEvent *ev);
> -/**
> - * trace_event_set_state:
> - *
> - * Set the tracing state of an event (only if possible).
> - */
> -#define trace_event_set_state(id, state) \
> - do { \
> - if ((id ##_ENABLED)) { \
> - TraceEvent *_e = trace_event_id(id); \
> - trace_event_set_state_dynamic(_e, state); \
> - } \
> - } while (0)
> -
> -/**
> - * trace_event_set_vcpu_state:
> - *
> - * Set the tracing state of an event for the given vCPU (only if not disabled).
> - */
> -#define trace_event_set_vcpu_state(vcpu, id, state) \
> - do { \
> - if ((id ##_ENABLED)) { \
> - TraceEvent *_e = trace_event_id(id); \
> - trace_event_set_vcpu_state_dynamic(vcpu, _e, state); \
> - } \
> - } while (0)
> /**
> * trace_event_set_state_dynamic:
> --
> 2.7.4
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 4/6] trace: remove global 'uint16 dstate[]' array
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 4/6] trace: remove global 'uint16 dstate[]' array Daniel P. Berrange
@ 2016-09-14 22:56 ` Lluís Vilanova
2016-09-15 9:11 ` Daniel P. Berrange
0 siblings, 1 reply; 20+ messages in thread
From: Lluís Vilanova @ 2016-09-14 22:56 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
Daniel P Berrange writes:
> 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.
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> ---
> scripts/tracetool/format/events_c.py | 6 +++++-
> scripts/tracetool/format/events_h.py | 3 +++
> stubs/trace-control.c | 9 ++++-----
> trace/control-internal.h | 14 ++++----------
> trace/control-target.c | 20 ++++++++------------
> trace/control.c | 11 ++---------
> trace/event-internal.h | 6 ++++++
> 7 files changed, 32 insertions(+), 37 deletions(-)
> diff --git a/scripts/tracetool/format/events_c.py b/scripts/tracetool/format/events_c.py
> index 4012063..a2f457f 100644
> --- a/scripts/tracetool/format/events_c.py
> +++ b/scripts/tracetool/format/events_c.py
> @@ -25,6 +25,9 @@ def generate(events, backend):
> '#include "trace/control.h"',
> '')
> + for e in events:
> + out('uint16_t TRACE_%s_DSTATE;' % e.name.upper())
> +
> out('TraceEvent trace_events[TRACE_EVENT_COUNT] = {')
> for e in events:
I would emit an "obviously non-public" variable name, like
___TRACE_%s_dstate. The "TRACE_%s" is only necesary for consistency with the
"public name" and macro trickery on the fast path.
To make naming consistency easier to track, you can use Event.api(), which needs
only a small extension ("scripts/tracetool/__init__.py"):
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, "NAME": self.name.upper()}
Then change all the places where you generate the dstate symbol name to
something like:
out('uint16_t ' + e.api(e.QEMU_DSTATE)) + ';')
> @@ -34,7 +37,8 @@ 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 = &%(id)s_DSTATE, }, ',
> id = "TRACE_" + e.name.upper(),
> vcpu_id = vcpu_id,
> name = e.name,
> diff --git a/scripts/tracetool/format/events_h.py b/scripts/tracetool/format/events_h.py
> index a9da60b..193b02c 100644
> --- a/scripts/tracetool/format/events_h.py
> +++ b/scripts/tracetool/format/events_h.py
> @@ -32,6 +32,9 @@ def generate(events, backend):
> out(' TRACE_EVENT_COUNT',
> '} TraceEventID;')
> + for e in events:
> + out('extern uint16_t TRACE_%s_DSTATE;' % e.name.upper())
> +
> # per-vCPU event identifiers
> out('typedef enum {')
Idem on the two above.
[...]
> diff --git a/trace/control-internal.h b/trace/control-internal.h
> index 7f31e39..1446498 100644
> --- a/trace/control-internal.h
> +++ b/trace/control-internal.h
> @@ -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];
> -}
> +/* 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)
> {
> - 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;
This one is not on the fast path, so there's no need for the first part of the
AND (shouldn't hurt performance to keep it either).
> }
> static inline bool trace_event_get_vcpu_state_dynamic_by_vcpu_id(CPUState *vcpu,
[...]
All the rest (snipped from this mail) looks good.
Cheers,
Lluis
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 6/6] trace: use -1 instead of TRACE_VCPU_EVENT_COUNT as magic value
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 6/6] trace: use -1 instead of TRACE_VCPU_EVENT_COUNT as magic value Daniel P. Berrange
@ 2016-09-14 23:12 ` Lluís Vilanova
0 siblings, 0 replies; 20+ messages in thread
From: Lluís Vilanova @ 2016-09-14 23:12 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
Daniel P Berrange writes:
> The TraceEvent struct vcpu_id field uses the constant
> TRACE_VCPU_EVENT_COUNT as a magic value to indicate this
> is not a per-VCPU event. The max count value will be
> different for each event group though, so this is no
> longer suitable. Instead use the value (size_t)-1 which
> is guaranteed to be available across all event groups.
The tracetool script should assert used vcpu IDs never reach ~0. Also, this
patch is better sent with your actual event group patches (see comments on patch
5).
Cheers,
Lluis
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 5/6] trace: remove use of event ID enums from APIs
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 5/6] trace: remove use of event ID enums from APIs Daniel P. Berrange
@ 2016-09-14 23:26 ` Lluís Vilanova
2016-09-15 9:26 ` Daniel P. Berrange
0 siblings, 1 reply; 20+ messages in thread
From: Lluís Vilanova @ 2016-09-14 23:26 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
Daniel P Berrange writes:
> Since there will shortly be multiple event groups allowed,
> we can no longer use the TraceEventID and TraceEventVCPUID
> enums in the trace control APIs. There will in fact be
> multiple distinct enums, and the enum values will only be
> required to be unique per group.
This patch serves no purpose without the event group patches.
Also, AFAIR TraceEventVCPUID still needs to be a flat space (they're all used as
bitmask indexes), so keeping the enum won't lose any re-compilation benefit.
And without wanting to sound like a broken record, you can make the
"TRACE_${EVENTNAME}" IDs be global Event* variables (statically initialized in
"trace/generated-events.c"). That still allows using their names in the macros,
avoids having a (two-level) tree of events, and eliminates the need for the
Event::id member (and the trace_event_get_id() function).
Cheers,
Lluis
[...]
> diff --git a/trace/simple.c b/trace/simple.c
> index 2f09daf..6e8013c 100644
> --- a/trace/simple.c
> +++ b/trace/simple.c
> @@ -18,7 +18,7 @@
> #include "trace/simple.h"
> /** Trace file header event ID */
> -#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with TraceEventIDs */
> +#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with event IDs */
> /** Trace file magic number */
> #define HEADER_MAGIC 0xf2b177cb0aa429b4ULL
> @@ -58,7 +58,7 @@ static char *trace_file_name;
> /* * Trace buffer entry */
> typedef struct {
> - uint64_t event; /* TraceEventID */
> + uint64_t event; /* event ID */
> uint64_t timestamp_ns;
> uint32_t length; /* in bytes */
> 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);
> }
> -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;
> uint32_t rec_len = sizeof(TraceRecord) + datasize;
> diff --git a/trace/simple.h b/trace/simple.h
> index 1e7de45..17ce472 100644
> --- a/trace/simple.h
> +++ b/trace/simple.h
> @@ -33,7 +33,7 @@ typedef struct {
> *
> * @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
Not incorrect, but it's weird that the simple backend emits 64-bit identifiers
while QEMU uses 32-bit ones.
Cheers,
Lluis
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 1/6] trace: add trace event iterator APIs
2016-09-14 21:53 ` Lluís Vilanova
@ 2016-09-15 9:07 ` Daniel P. Berrange
0 siblings, 0 replies; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-15 9:07 UTC (permalink / raw)
To: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
On Wed, Sep 14, 2016 at 11:53:10PM +0200, Lluís Vilanova wrote:
> Daniel P Berrange writes:
>
> > Currently methods which want to iterate over trace events,
> > do so using the trace_event_count() and trace_event_id()
> > methods. This leaks the concept of a single ID enum to
> > the callers. There is an alternative trace_event_pattern()
> > method which can be used in an iteration context, but its
> > design is stateless, so is not easy to expand it in the
> > future.
>
> > This defines a formal iterator API will provide an future
> > proof way of iterating over events.
>
> > The iterator is also able to apply a pattern match filter
> > to events, further removing the need for the pattern
>
> > Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> > ---
> > trace/control.c | 20 ++++++++++++++++++++
> > trace/control.h | 27 +++++++++++++++++++++++++++
> > 2 files changed, 47 insertions(+)
>
> > diff --git a/trace/control.c b/trace/control.c
> > index 05d85ac..b871727 100644
> > --- a/trace/control.c
> > +++ b/trace/control.c
> > @@ -125,6 +125,26 @@ TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
> > return NULL;
> > }
>
> > +void trace_event_iter_init(TraceEventIter *iter, const char *pattern)
> > +{
> > + iter->event = 0;
> > + iter->pattern = pattern;
> > +}
> > +
> > +TraceEvent *trace_event_iter_next(TraceEventIter *iter)
> > +{
> > + while (iter->event < TRACE_EVENT_COUNT) {
> > + if (!iter->pattern ||
> > + pattern_glob(iter->pattern,
> > + trace_event_get_name(&(trace_events[iter->event])))) {
> > + return &(trace_events[iter->event]);
>
> That's a picky one (feel free to ignore), but can you refactor
> "&(trace_events[iter->event])" out into a variable? The long pattern_glob() call
> is a bit hard to parse.
>
>
> > + }
> > + iter->event++;
> > + }
> > +
> > + return NULL;
> > +}
> > +
> > void trace_list_events(void)
> > {
> > int i;
> > diff --git a/trace/control.h b/trace/control.h
> > index 27a16fc..c71b405 100644
> > --- a/trace/control.h
> > +++ b/trace/control.h
> > @@ -13,6 +13,10 @@
> > #include "qemu-common.h"
> > #include "trace/generated-events.h"
>
> > +typedef struct TraceEventIter {
> > + size_t event;
>
> Shouldn't this be TraceEventID for consistence with "trace/control.h"? But if
> you're going to drop TraceEventID in a later series feel free to ignore me.
For array indexes size_t is always the optimal type, since that matches
the maximum logical size that an array can be. It just happens that
array indexes match TraceEventID but since that'll be killed in the API
later, I figured it best to stick to the normal size_t .
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 2/6] trace: convert code to use event iterators
2016-09-14 22:16 ` Lluís Vilanova
@ 2016-09-15 9:09 ` Daniel P. Berrange
0 siblings, 0 replies; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-15 9:09 UTC (permalink / raw)
To: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
On Thu, Sep 15, 2016 at 12:16:52AM +0200, Lluís Vilanova wrote:
> Daniel P Berrange writes:
>
> > This converts the HMP/QMP monitor API implementations
> > and some internal trace control methods to use the new
> > trace event iterator APIs.
>
> > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
> > Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> > ---
> > monitor.c | 16 ++++++----
> > trace/control.c | 94 ++++++++++++++++++++++++++++++++++-----------------------
> > trace/qmp.c | 16 ++++++----
> > 3 files changed, 76 insertions(+), 50 deletions(-)
>
> > diff --git a/monitor.c b/monitor.c
> > index 5c00373..7b979a6 100644
> > --- a/monitor.c
> > +++ b/monitor.c
> > @@ -3335,9 +3335,11 @@ void info_trace_events_completion(ReadLineState *rs, int nb_args, const char *st
> > len = strlen(str);
> > readline_set_completion_index(rs, len);
> > if (nb_args == 2) {
> > - TraceEventID id;
> > - for (id = 0; id < trace_event_count(); id++) {
> > - const char *event_name = trace_event_get_name(trace_event_id(id));
> > + TraceEventIter iter;
> > + TraceEvent *ev;
> > + trace_event_iter_init(&iter, NULL);
> > + while ((ev = trace_event_iter_next(&iter)) != NULL) {
> > + const char *event_name = trace_event_get_name(ev);
> > if (!strncmp(str, event_name, len)) {
> > readline_add_completion(rs, event_name);
> > }
> > @@ -3352,9 +3354,11 @@ void trace_event_completion(ReadLineState *rs, int nb_args, const char *str)
> > len = strlen(str);
> > readline_set_completion_index(rs, len);
> > if (nb_args == 2) {
> > - TraceEventID id;
> > - for (id = 0; id < trace_event_count(); id++) {
> > - const char *event_name = trace_event_get_name(trace_event_id(id));
> > + TraceEventIter iter;
> > + TraceEvent *ev;
> > + trace_event_iter_init(&iter, NULL);
> > + while ((ev = trace_event_iter_next(&iter)) != NULL) {
> > + const char *event_name = trace_event_get_name(ev);
> > if (!strncmp(str, event_name, len)) {
> > readline_add_completion(rs, event_name);
> > }
> > diff --git a/trace/control.c b/trace/control.c
> > index b871727..8fa7ed6 100644
> > --- a/trace/control.c
> > +++ b/trace/control.c
> > @@ -60,9 +60,10 @@ TraceEvent *trace_event_name(const char *name)
> > {
> > assert(name != NULL);
>
> > - TraceEventID i;
> > - for (i = 0; i < trace_event_count(); i++) {
> > - TraceEvent *ev = trace_event_id(i);
> > + TraceEventIter iter;
> > + TraceEvent *ev;
> > + trace_event_iter_init(&iter, NULL);
> > + while ((ev = trace_event_iter_next(&iter)) != NULL) {
> > if (strcmp(trace_event_get_name(ev), name) == 0) {
> > return ev;
> > }
>
> You could pass "name" in the pattern argument, and then remove the
> strcmp(). It'll be simpler code, but pattern_glob() is less efficient than
> strcmp().
>
> To solve that, maybe you could subsume exact name matching (trace_event_name())
> and pattern matching into the iterator interface (strcmp() / pattern_glob()) by
> either checking trace_event_is_pattern() when initializing the iterator (pattern
> auto-detection), or explicitly passing either a name or pattern argument (if you
> want an extra-paranoid API; via two char* or a char*+bool).
>
> I haven't checked if that would weird other code out when using iterators for a
> simple exact match.
I tend to think it is overkill to try and munge this exact match
case into the pattern match handling.
> > @@ -105,21 +106,20 @@ TraceEvent *trace_event_pattern(const char *pat, TraceEvent *ev)
> > {
> > assert(pat != NULL);
>
> > - TraceEventID i;
> > -
> > - if (ev == NULL) {
> > - i = -1;
> > - } else {
> > - i = trace_event_get_id(ev);
> > - }
> > - i++;
> > -
> > - while (i < trace_event_count()) {
> > - TraceEvent *res = trace_event_id(i);
> > - if (pattern_glob(pat, trace_event_get_name(res))) {
> > - return res;
> > + bool matched = ev ? false : true;
> > + TraceEventIter iter;
> > + TraceEvent *thisev;
> > + trace_event_iter_init(&iter, NULL);
> > + while ((thisev = trace_event_iter_next(&iter)) != NULL) {
> > + if (matched) {
> > + if (pattern_glob(pat, trace_event_get_name(thisev))) {
> > + return thisev;
> > + }
> > + } else {
> > + if (ev == thisev) {
> > + matched = true;
> > + }
> > }
> > - i++;
> > }
>
> > return NULL;
>
> Shouldn't this pass "pat" to trace_event_iter_init() and then not use
> pattern_glob()?
Yes, you're right it should have.
> I just realized this is dropped on next patch, so ignore me.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 4/6] trace: remove global 'uint16 dstate[]' array
2016-09-14 22:56 ` Lluís Vilanova
@ 2016-09-15 9:11 ` Daniel P. Berrange
0 siblings, 0 replies; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-15 9:11 UTC (permalink / raw)
To: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
On Thu, Sep 15, 2016 at 12:56:57AM +0200, Lluís Vilanova wrote:
> Daniel P Berrange writes:
>
> > 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.
>
> > Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> > ---
> > scripts/tracetool/format/events_c.py | 6 +++++-
> > scripts/tracetool/format/events_h.py | 3 +++
> > stubs/trace-control.c | 9 ++++-----
> > trace/control-internal.h | 14 ++++----------
> > trace/control-target.c | 20 ++++++++------------
> > trace/control.c | 11 ++---------
> > trace/event-internal.h | 6 ++++++
> > 7 files changed, 32 insertions(+), 37 deletions(-)
>
> > diff --git a/scripts/tracetool/format/events_c.py b/scripts/tracetool/format/events_c.py
> > index 4012063..a2f457f 100644
> > --- a/scripts/tracetool/format/events_c.py
> > +++ b/scripts/tracetool/format/events_c.py
> > @@ -25,6 +25,9 @@ def generate(events, backend):
> > '#include "trace/control.h"',
> > '')
>
> > + for e in events:
> > + out('uint16_t TRACE_%s_DSTATE;' % e.name.upper())
> > +
> > out('TraceEvent trace_events[TRACE_EVENT_COUNT] = {')
>
> > for e in events:
>
> I would emit an "obviously non-public" variable name, like
> ___TRACE_%s_dstate. The "TRACE_%s" is only necesary for consistency with the
> "public name" and macro trickery on the fast path.
>
> To make naming consistency easier to track, you can use Event.api(), which needs
> only a small extension ("scripts/tracetool/__init__.py"):
>
> 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, "NAME": self.name.upper()}
>
> Then change all the places where you generate the dstate symbol name to
> something like:
>
> out('uint16_t ' + e.api(e.QEMU_DSTATE)) + ';')
Ah interesting, I hadn't noticed the Event.api() method.
> > @@ -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];
> > -}
> > +/* 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)
> > {
> > - 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;
>
> This one is not on the fast path, so there's no need for the first part of the
> AND (shouldn't hurt performance to keep it either).
Yep, I just figured it'd be nice to keep the two methods having the
same logic even if this second one isn't so performance critical.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 5/6] trace: remove use of event ID enums from APIs
2016-09-14 23:26 ` Lluís Vilanova
@ 2016-09-15 9:26 ` Daniel P. Berrange
2016-09-15 12:20 ` Lluís Vilanova
0 siblings, 1 reply; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-15 9:26 UTC (permalink / raw)
To: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
On Thu, Sep 15, 2016 at 01:26:06AM +0200, Lluís Vilanova wrote:
> Daniel P Berrange writes:
>
> > Since there will shortly be multiple event groups allowed,
> > we can no longer use the TraceEventID and TraceEventVCPUID
> > enums in the trace control APIs. There will in fact be
> > multiple distinct enums, and the enum values will only be
> > required to be unique per group.
>
> This patch serves no purpose without the event group patches.
>
> Also, AFAIR TraceEventVCPUID still needs to be a flat space (they're all used as
> bitmask indexes), so keeping the enum won't lose any re-compilation benefit.
>
> And without wanting to sound like a broken record, you can make the
> "TRACE_${EVENTNAME}" IDs be global Event* variables (statically initialized in
> "trace/generated-events.c"). That still allows using their names in the macros,
> avoids having a (two-level) tree of events, and eliminates the need for the
> Event::id member (and the trace_event_get_id() function).
Regardless of whether its used in the public API, we still need to
be able to assign a unique 32bit event ID to every event, because
simpletrace currently needs to output that in its trace files.
That said, i have been wondering if people are very tied to the
current simple trace output format ? My ideal solution would be
for us to dynamically assign id values to trace events when QEMU
starts up.
If we did this, hen in the simpletrace output file, we would have
to insert a new record type which records an (event name, ID)
value mapping, the first time any individual event type is
emitted.
Thus when simpletrace.py comes to load the trace data, instead
of using the event ID to lookup the event directly, it would use
the event ID to get the name from the trace data, and then lookup
the event based on name.
> [...]
> > diff --git a/trace/simple.c b/trace/simple.c
> > index 2f09daf..6e8013c 100644
> > --- a/trace/simple.c
> > +++ b/trace/simple.c
> > @@ -18,7 +18,7 @@
> > #include "trace/simple.h"
>
> > /** Trace file header event ID */
> > -#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with TraceEventIDs */
> > +#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with event IDs */
>
> > /** Trace file magic number */
> > #define HEADER_MAGIC 0xf2b177cb0aa429b4ULL
> > @@ -58,7 +58,7 @@ static char *trace_file_name;
>
> > /* * Trace buffer entry */
> > typedef struct {
> > - uint64_t event; /* TraceEventID */
> > + uint64_t event; /* event ID */
> > uint64_t timestamp_ns;
> > uint32_t length; /* in bytes */
> > 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);
> > }
>
> > -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;
> > uint32_t rec_len = sizeof(TraceRecord) + datasize;
> > diff --git a/trace/simple.h b/trace/simple.h
> > index 1e7de45..17ce472 100644
> > --- a/trace/simple.h
> > +++ b/trace/simple.h
> > @@ -33,7 +33,7 @@ typedef struct {
> > *
> > * @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
>
> Not incorrect, but it's weird that the simple backend emits 64-bit identifiers
> while QEMU uses 32-bit ones.
The trace_record_start method *is* given a 32-bit id value not a 64-bit value.
That comment you're quoting here is nothing todo with the ID values, it is
about writing 64-bit parameter values.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 5/6] trace: remove use of event ID enums from APIs
2016-09-15 9:26 ` Daniel P. Berrange
@ 2016-09-15 12:20 ` Lluís Vilanova
2016-09-15 12:29 ` Daniel P. Berrange
0 siblings, 1 reply; 20+ messages in thread
From: Lluís Vilanova @ 2016-09-15 12:20 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
Daniel P Berrange writes:
> On Thu, Sep 15, 2016 at 01:26:06AM +0200, Lluís Vilanova wrote:
>> Daniel P Berrange writes:
>>
>> > Since there will shortly be multiple event groups allowed,
>> > we can no longer use the TraceEventID and TraceEventVCPUID
>> > enums in the trace control APIs. There will in fact be
>> > multiple distinct enums, and the enum values will only be
>> > required to be unique per group.
>>
>> This patch serves no purpose without the event group patches.
>>
>> Also, AFAIR TraceEventVCPUID still needs to be a flat space (they're all used as
>> bitmask indexes), so keeping the enum won't lose any re-compilation benefit.
>>
>> And without wanting to sound like a broken record, you can make the
>> "TRACE_${EVENTNAME}" IDs be global Event* variables (statically initialized in
>> "trace/generated-events.c"). That still allows using their names in the macros,
>> avoids having a (two-level) tree of events, and eliminates the need for the
>> Event::id member (and the trace_event_get_id() function).
> Regardless of whether its used in the public API, we still need to
> be able to assign a unique 32bit event ID to every event, because
> simpletrace currently needs to output that in its trace files.
> That said, i have been wondering if people are very tied to the
> current simple trace output format ? My ideal solution would be
> for us to dynamically assign id values to trace events when QEMU
> starts up.
> If we did this, hen in the simpletrace output file, we would have
> to insert a new record type which records an (event name, ID)
> value mapping, the first time any individual event type is
> emitted.
> Thus when simpletrace.py comes to load the trace data, instead
> of using the event ID to lookup the event directly, it would use
> the event ID to get the name from the trace data, and then lookup
> the event based on name.
A self-describing simpletrace would be so much better... Instead of registering
event types the first time they're emitted, it'd be more efficient (and probably
simpler) to register them during initialization of the trace subsystem.
Probably not worth the effort, but you also have the self-describing CTF trace
format. Already has tools for reading, converting and visualizing traces.
>> [...]
>> > diff --git a/trace/simple.c b/trace/simple.c
>> > index 2f09daf..6e8013c 100644
>> > --- a/trace/simple.c
>> > +++ b/trace/simple.c
>> > @@ -18,7 +18,7 @@
>> > #include "trace/simple.h"
>>
>> > /** Trace file header event ID */
>> > -#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with TraceEventIDs */
>> > +#define HEADER_EVENT_ID (~(uint64_t)0) /* avoids conflicting with event IDs */
>>
>> > /** Trace file magic number */
>> > #define HEADER_MAGIC 0xf2b177cb0aa429b4ULL
>> > @@ -58,7 +58,7 @@ static char *trace_file_name;
>>
>> > /* * Trace buffer entry */
>> > typedef struct {
>> > - uint64_t event; /* TraceEventID */
>> > + uint64_t event; /* event ID */
>> > uint64_t timestamp_ns;
>> > uint32_t length; /* in bytes */
>> > 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);
>> > }
>>
>> > -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;
>> > uint32_t rec_len = sizeof(TraceRecord) + datasize;
>> > diff --git a/trace/simple.h b/trace/simple.h
>> > index 1e7de45..17ce472 100644
>> > --- a/trace/simple.h
>> > +++ b/trace/simple.h
>> > @@ -33,7 +33,7 @@ typedef struct {
>> > *
>> > * @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
>>
>> Not incorrect, but it's weird that the simple backend emits 64-bit identifiers
>> while QEMU uses 32-bit ones.
> The trace_record_start method *is* given a 32-bit id value not a 64-bit value.
> That comment you're quoting here is nothing todo with the ID values, it is
> about writing 64-bit parameter values.
Makes sense.
Cheers,
Lluis
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v2 5/6] trace: remove use of event ID enums from APIs
2016-09-15 12:20 ` Lluís Vilanova
@ 2016-09-15 12:29 ` Daniel P. Berrange
0 siblings, 0 replies; 20+ messages in thread
From: Daniel P. Berrange @ 2016-09-15 12:29 UTC (permalink / raw)
To: qemu-devel, Stefan Hajnoczi, Paolo Bonzini
On Thu, Sep 15, 2016 at 02:20:05PM +0200, Lluís Vilanova wrote:
> Daniel P Berrange writes:
>
> > On Thu, Sep 15, 2016 at 01:26:06AM +0200, Lluís Vilanova wrote:
> >> Daniel P Berrange writes:
> >>
> >> > Since there will shortly be multiple event groups allowed,
> >> > we can no longer use the TraceEventID and TraceEventVCPUID
> >> > enums in the trace control APIs. There will in fact be
> >> > multiple distinct enums, and the enum values will only be
> >> > required to be unique per group.
> >>
> >> This patch serves no purpose without the event group patches.
> >>
> >> Also, AFAIR TraceEventVCPUID still needs to be a flat space (they're all used as
> >> bitmask indexes), so keeping the enum won't lose any re-compilation benefit.
> >>
> >> And without wanting to sound like a broken record, you can make the
> >> "TRACE_${EVENTNAME}" IDs be global Event* variables (statically initialized in
> >> "trace/generated-events.c"). That still allows using their names in the macros,
> >> avoids having a (two-level) tree of events, and eliminates the need for the
> >> Event::id member (and the trace_event_get_id() function).
>
> > Regardless of whether its used in the public API, we still need to
> > be able to assign a unique 32bit event ID to every event, because
> > simpletrace currently needs to output that in its trace files.
>
> > That said, i have been wondering if people are very tied to the
> > current simple trace output format ? My ideal solution would be
> > for us to dynamically assign id values to trace events when QEMU
> > starts up.
>
> > If we did this, hen in the simpletrace output file, we would have
> > to insert a new record type which records an (event name, ID)
> > value mapping, the first time any individual event type is
> > emitted.
>
> > Thus when simpletrace.py comes to load the trace data, instead
> > of using the event ID to lookup the event directly, it would use
> > the event ID to get the name from the trace data, and then lookup
> > the event based on name.
>
> A self-describing simpletrace would be so much better... Instead of registering
> event types the first time they're emitted, it'd be more efficient (and probably
> simpler) to register them during initialization of the trace subsystem.
We can easily make it self-describing enough that you don't
need to read 'trace-events' in order to parse the data. Whether
we go further and also include the arg names and format strings
to enable analysers to process the data, I'm not sure. We can
do it incrementally I guess.
THe only reason I suggested at time of first use is that we
have quite a large number of events and so emitting description
for all of them would take non-negligble time and possibly use
significant space. I will investigate further to see if this
is genuinely a problem.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2016-09-15 12:30 UTC | newest]
Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-09-14 17:08 [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build Daniel P. Berrange
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 1/6] trace: add trace event iterator APIs Daniel P. Berrange
2016-09-14 21:53 ` Lluís Vilanova
2016-09-15 9:07 ` Daniel P. Berrange
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 2/6] trace: convert code to use event iterators Daniel P. Berrange
2016-09-14 22:16 ` Lluís Vilanova
2016-09-15 9:09 ` Daniel P. Berrange
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 3/6] trace: remove some now unused functions Daniel P. Berrange
2016-09-14 22:21 ` Lluís Vilanova
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 4/6] trace: remove global 'uint16 dstate[]' array Daniel P. Berrange
2016-09-14 22:56 ` Lluís Vilanova
2016-09-15 9:11 ` Daniel P. Berrange
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 5/6] trace: remove use of event ID enums from APIs Daniel P. Berrange
2016-09-14 23:26 ` Lluís Vilanova
2016-09-15 9:26 ` Daniel P. Berrange
2016-09-15 12:20 ` Lluís Vilanova
2016-09-15 12:29 ` Daniel P. Berrange
2016-09-14 17:08 ` [Qemu-devel] [PATCH v2 6/6] trace: use -1 instead of TRACE_VCPU_EVENT_COUNT as magic value Daniel P. Berrange
2016-09-14 23:12 ` Lluís Vilanova
2016-09-14 19:41 ` [Qemu-devel] [PATCH v2 0/6] Prep changes for modular trace-events build no-reply
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.