All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.