* [Qemu-devel] [PATCH v3 0/2] trace: Simplify late initialization @ 2016-08-11 16:11 Lluís Vilanova 2016-08-11 16:11 ` [Qemu-devel] [PATCH v3 1/2] trace: Remove 'trace_events_dstate_init' Lluís Vilanova 2016-08-11 16:11 ` [Qemu-devel] [PATCH v3 2/2] trace: Avoid implicit bool->integer conversions Lluís Vilanova 0 siblings, 2 replies; 7+ messages in thread From: Lluís Vilanova @ 2016-08-11 16:11 UTC (permalink / raw) To: qemu-devel; +Cc: Paolo Bonzini, 'Daniel P. Berrange', Stefan Hajnoczi Removes the need for 'trace_events_dstate_init' and does a little cleanup in how state values are modified (to avoid implicit conversions from bool). Changes in v2 ============= * Fix late-init state value [Daniel P. Berrange]. Changes in v3 ============= * Avoid implicit conversions from bool to integers (second patch) [Daniel P. Berrange]. Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> --- Lluís Vilanova (2): trace: Remove 'trace_events_dstate_init' trace: Avoid implicit bool->integer conversions stubs/trace-control.c | 14 ++++++++++++-- trace/control-target.c | 23 +++++++++++++++++++++-- trace/control.c | 23 ++++++++++------------- trace/control.h | 3 +++ trace/event-internal.h | 1 + 5 files changed, 47 insertions(+), 17 deletions(-) To: qemu-devel@nongnu.org Cc: Stefan Hajnoczi <stefanha@redhat.com> Cc: 'Daniel P. Berrange' <berrange@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH v3 1/2] trace: Remove 'trace_events_dstate_init' 2016-08-11 16:11 [Qemu-devel] [PATCH v3 0/2] trace: Simplify late initialization Lluís Vilanova @ 2016-08-11 16:11 ` Lluís Vilanova 2016-08-11 16:11 ` [Qemu-devel] [PATCH v3 2/2] trace: Avoid implicit bool->integer conversions Lluís Vilanova 1 sibling, 0 replies; 7+ messages in thread From: Lluís Vilanova @ 2016-08-11 16:11 UTC (permalink / raw) To: qemu-devel; +Cc: Paolo Bonzini, 'Daniel P. Berrange', Stefan Hajnoczi Removes the event state array used for early initialization. Since only events with the "vcpu" property need a late initialization fixup, threats their initialization specially. Assumes that the user won't touch the state of "vcpu" events between early and late initialization (e.g., through QMP). Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> --- stubs/trace-control.c | 5 +++++ trace/control-target.c | 9 +++++++++ trace/control.c | 23 ++++++++++------------- trace/control.h | 3 +++ trace/event-internal.h | 1 + 5 files changed, 28 insertions(+), 13 deletions(-) diff --git a/stubs/trace-control.c b/stubs/trace-control.c index fe59836..3740c38 100644 --- a/stubs/trace-control.c +++ b/stubs/trace-control.c @@ -11,6 +11,11 @@ #include "trace/control.h" +void trace_event_set_state_dynamic_init(TraceEvent *ev, bool state) +{ + trace_event_set_state_dynamic(ev, state); +} + void trace_event_set_state_dynamic(TraceEvent *ev, bool state) { TraceEventID id; diff --git a/trace/control-target.c b/trace/control-target.c index 74c029a..4ee3733 100644 --- a/trace/control-target.c +++ b/trace/control-target.c @@ -13,6 +13,15 @@ #include "translate-all.h" +void trace_event_set_state_dynamic_init(TraceEvent *ev, bool state) +{ + TraceEventID id = trace_event_get_id(ev); + assert(trace_event_get_state_static(ev)); + /* Ignore "vcpu" property, since no vCPUs have been created yet */ + trace_events_enabled_count += state - trace_events_dstate[id]; + trace_events_dstate[id] = state; +} + void trace_event_set_state_dynamic(TraceEvent *ev, bool state) { CPUState *vcpu; diff --git a/trace/control.c b/trace/control.c index d173c09..f6e06cc 100644 --- a/trace/control.c +++ b/trace/control.c @@ -31,8 +31,6 @@ int trace_events_enabled_count; * - true : Integral counting the number of vCPUs that have this event enabled. */ uint16_t trace_events_dstate[TRACE_EVENT_COUNT]; -/* Marks events for late vCPU state init */ -static bool trace_events_dstate_init[TRACE_EVENT_COUNT]; QemuOptsList qemu_trace_opts = { .name = "trace", @@ -142,10 +140,7 @@ static void do_trace_enable_events(const char *line_buf) TraceEvent *ev = NULL; while ((ev = trace_event_pattern(line_ptr, ev)) != NULL) { if (trace_event_get_state_static(ev)) { - /* start tracing */ - trace_event_set_state_dynamic(ev, enable); - /* mark for late vCPU init */ - trace_events_dstate_init[ev->id] = true; + trace_event_set_state_dynamic_init(ev, enable); } } } else { @@ -157,10 +152,7 @@ static void do_trace_enable_events(const char *line_buf) error_report("WARNING: trace event '%s' is not traceable", line_ptr); } else { - /* start tracing */ - trace_event_set_state_dynamic(ev, enable); - /* mark for late vCPU init */ - trace_events_dstate_init[ev->id] = true; + trace_event_set_state_dynamic_init(ev, enable); } } } @@ -275,9 +267,14 @@ void trace_init_vcpu_events(void) { TraceEvent *ev = NULL; while ((ev = trace_event_pattern("*", ev)) != NULL) { - if (trace_event_is_vcpu(ev) && - trace_event_get_state_static(ev) && - trace_events_dstate_init[ev->id]) { + if (trace_event_is_vcpu(ev) && trace_event_get_state_dynamic(ev)) { + TraceEventID id = trace_event_get_id(ev); + /* check preconditions */ + assert(trace_events_dstate[id] == 1); + /* disable early-init state ... */ + trace_events_dstate[id] = 0; + trace_events_enabled_count--; + /* ... and properly re-enable */ trace_event_set_state_dynamic(ev, true); } } diff --git a/trace/control.h b/trace/control.h index 0413b28..27a16fc 100644 --- a/trace/control.h +++ b/trace/control.h @@ -274,6 +274,9 @@ char *trace_opt_parse(const char *optarg); * * Re-synchronize initial event state with vCPUs (which can be created after * trace_init_events()). + * + * Precondition: event states won't be changed between trace_enable_events() and + * trace_init_vcpu_events() (e.g., through QMP). */ void trace_init_vcpu_events(void); diff --git a/trace/event-internal.h b/trace/event-internal.h index 5d8fa97..074faf6 100644 --- a/trace/event-internal.h +++ b/trace/event-internal.h @@ -29,5 +29,6 @@ typedef struct TraceEvent { const bool sstate; } TraceEvent; +void trace_event_set_state_dynamic_init(TraceEvent *ev, bool state); #endif /* TRACE__EVENT_INTERNAL_H */ ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH v3 2/2] trace: Avoid implicit bool->integer conversions 2016-08-11 16:11 [Qemu-devel] [PATCH v3 0/2] trace: Simplify late initialization Lluís Vilanova 2016-08-11 16:11 ` [Qemu-devel] [PATCH v3 1/2] trace: Remove 'trace_events_dstate_init' Lluís Vilanova @ 2016-08-11 16:11 ` Lluís Vilanova 2016-08-11 16:31 ` Daniel P. Berrange 1 sibling, 1 reply; 7+ messages in thread From: Lluís Vilanova @ 2016-08-11 16:11 UTC (permalink / raw) To: qemu-devel; +Cc: Paolo Bonzini, 'Daniel P. Berrange', Stefan Hajnoczi An explicit if/else is clearer than arithmetic assuming #true is 1, while the compiler should be able to generate just as optimal code. Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> --- stubs/trace-control.c | 9 +++++++-- trace/control-target.c | 18 ++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/stubs/trace-control.c b/stubs/trace-control.c index 3740c38..099c2b5 100644 --- a/stubs/trace-control.c +++ b/stubs/trace-control.c @@ -21,8 +21,13 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state) TraceEventID id; assert(trace_event_get_state_static(ev)); id = trace_event_get_id(ev); - trace_events_enabled_count += state - trace_events_dstate[id]; - trace_events_dstate[id] = state; + if (state) { + trace_events_enabled_count++; + trace_events_dstate[id] = 1; + } else { + trace_events_enabled_count--; + trace_events_dstate[id] = 0; + } } void trace_event_set_vcpu_state_dynamic(CPUState *vcpu, diff --git a/trace/control-target.c b/trace/control-target.c index 4ee3733..4e2e727 100644 --- a/trace/control-target.c +++ b/trace/control-target.c @@ -18,8 +18,13 @@ void trace_event_set_state_dynamic_init(TraceEvent *ev, bool state) TraceEventID id = trace_event_get_id(ev); assert(trace_event_get_state_static(ev)); /* Ignore "vcpu" property, since no vCPUs have been created yet */ - trace_events_enabled_count += state - trace_events_dstate[id]; - trace_events_dstate[id] = state; + if (state) { + trace_events_enabled_count++; + trace_events_dstate[id] = 1; + } else { + trace_events_enabled_count--; + trace_events_dstate[id] = 0; + } } void trace_event_set_state_dynamic(TraceEvent *ev, bool state) @@ -32,8 +37,13 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state) } } else { TraceEventID id = trace_event_get_id(ev); - trace_events_enabled_count += state - trace_events_dstate[id]; - trace_events_dstate[id] = state; + if (state) { + trace_events_enabled_count++; + trace_events_dstate[id] = 1; + } else { + trace_events_enabled_count--; + trace_events_dstate[id] = 0; + } } } ^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/2] trace: Avoid implicit bool->integer conversions 2016-08-11 16:11 ` [Qemu-devel] [PATCH v3 2/2] trace: Avoid implicit bool->integer conversions Lluís Vilanova @ 2016-08-11 16:31 ` Daniel P. Berrange 2016-08-11 16:41 ` Lluís Vilanova 0 siblings, 1 reply; 7+ messages in thread From: Daniel P. Berrange @ 2016-08-11 16:31 UTC (permalink / raw) To: Lluís Vilanova; +Cc: qemu-devel, Paolo Bonzini, Stefan Hajnoczi On Thu, Aug 11, 2016 at 06:11:29PM +0200, Lluís Vilanova wrote: > An explicit if/else is clearer than arithmetic assuming #true is 1, > while the compiler should be able to generate just as optimal code. > > Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> > --- > stubs/trace-control.c | 9 +++++++-- > trace/control-target.c | 18 ++++++++++++++---- > 2 files changed, 21 insertions(+), 6 deletions(-) > > diff --git a/stubs/trace-control.c b/stubs/trace-control.c > index 3740c38..099c2b5 100644 > --- a/stubs/trace-control.c > +++ b/stubs/trace-control.c > @@ -21,8 +21,13 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state) > TraceEventID id; > assert(trace_event_get_state_static(ev)); > id = trace_event_get_id(ev); > - trace_events_enabled_count += state - trace_events_dstate[id]; > - trace_events_dstate[id] = state; > + if (state) { > + trace_events_enabled_count++; > + trace_events_dstate[id] = 1; > + } else { > + trace_events_enabled_count--; SHouldn't this be trace_events_enabled_count -= trace_events_dstate[id]; as it is possible to call this method for a trace event that is a per-vcpu event > + trace_events_dstate[id] = 0; > + } > } > > void trace_event_set_vcpu_state_dynamic(CPUState *vcpu, > diff --git a/trace/control-target.c b/trace/control-target.c > index 4ee3733..4e2e727 100644 > --- a/trace/control-target.c > +++ b/trace/control-target.c > @@ -18,8 +18,13 @@ void trace_event_set_state_dynamic_init(TraceEvent *ev, bool state) > TraceEventID id = trace_event_get_id(ev); > assert(trace_event_get_state_static(ev)); > /* Ignore "vcpu" property, since no vCPUs have been created yet */ > - trace_events_enabled_count += state - trace_events_dstate[id]; > - trace_events_dstate[id] = state; > + if (state) { > + trace_events_enabled_count++; > + trace_events_dstate[id] = 1; > + } else { > + trace_events_enabled_count--; > + trace_events_dstate[id] = 0; > + } > } > > void trace_event_set_state_dynamic(TraceEvent *ev, bool state) > @@ -32,8 +37,13 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state) > } > } else { > TraceEventID id = trace_event_get_id(ev); > - trace_events_enabled_count += state - trace_events_dstate[id]; > - trace_events_dstate[id] = state; > + if (state) { > + trace_events_enabled_count++; > + trace_events_dstate[id] = 1; > + } else { > + trace_events_enabled_count--; > + trace_events_dstate[id] = 0; > + } > } > } > > 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] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/2] trace: Avoid implicit bool->integer conversions 2016-08-11 16:31 ` Daniel P. Berrange @ 2016-08-11 16:41 ` Lluís Vilanova 2016-08-11 16:51 ` Daniel P. Berrange 0 siblings, 1 reply; 7+ messages in thread From: Lluís Vilanova @ 2016-08-11 16:41 UTC (permalink / raw) To: Daniel P. Berrange; +Cc: Paolo Bonzini, qemu-devel, Stefan Hajnoczi Daniel P Berrange writes: > On Thu, Aug 11, 2016 at 06:11:29PM +0200, Lluís Vilanova wrote: >> An explicit if/else is clearer than arithmetic assuming #true is 1, >> while the compiler should be able to generate just as optimal code. >> >> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> >> --- >> stubs/trace-control.c | 9 +++++++-- >> trace/control-target.c | 18 ++++++++++++++---- >> 2 files changed, 21 insertions(+), 6 deletions(-) >> >> diff --git a/stubs/trace-control.c b/stubs/trace-control.c >> index 3740c38..099c2b5 100644 >> --- a/stubs/trace-control.c >> +++ b/stubs/trace-control.c >> @@ -21,8 +21,13 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state) >> TraceEventID id; >> assert(trace_event_get_state_static(ev)); >> id = trace_event_get_id(ev); >> - trace_events_enabled_count += state - trace_events_dstate[id]; >> - trace_events_dstate[id] = state; >> + if (state) { >> + trace_events_enabled_count++; >> + trace_events_dstate[id] = 1; >> + } else { >> + trace_events_enabled_count--; > SHouldn't this be trace_events_enabled_count -= trace_events_dstate[id]; > as it is possible to call this method for a trace event that is a per-vcpu > event The "stub" code will never have vCPUs around, it's used by qemu-img and the like (any program without "target" code). I can send a v4 explicitly commenting that if you think that's necessary. Thanks, Lluis ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/2] trace: Avoid implicit bool->integer conversions 2016-08-11 16:41 ` Lluís Vilanova @ 2016-08-11 16:51 ` Daniel P. Berrange 2016-08-11 17:22 ` Lluís Vilanova 0 siblings, 1 reply; 7+ messages in thread From: Daniel P. Berrange @ 2016-08-11 16:51 UTC (permalink / raw) To: Paolo Bonzini, qemu-devel, Stefan Hajnoczi On Thu, Aug 11, 2016 at 06:41:36PM +0200, Lluís Vilanova wrote: > Daniel P Berrange writes: > > > On Thu, Aug 11, 2016 at 06:11:29PM +0200, Lluís Vilanova wrote: > >> An explicit if/else is clearer than arithmetic assuming #true is 1, > >> while the compiler should be able to generate just as optimal code. > >> > >> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> > >> --- > >> stubs/trace-control.c | 9 +++++++-- > >> trace/control-target.c | 18 ++++++++++++++---- > >> 2 files changed, 21 insertions(+), 6 deletions(-) > >> > >> diff --git a/stubs/trace-control.c b/stubs/trace-control.c > >> index 3740c38..099c2b5 100644 > >> --- a/stubs/trace-control.c > >> +++ b/stubs/trace-control.c > >> @@ -21,8 +21,13 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state) > >> TraceEventID id; > >> assert(trace_event_get_state_static(ev)); > >> id = trace_event_get_id(ev); > >> - trace_events_enabled_count += state - trace_events_dstate[id]; > >> - trace_events_dstate[id] = state; > >> + if (state) { > >> + trace_events_enabled_count++; > >> + trace_events_dstate[id] = 1; > >> + } else { > >> + trace_events_enabled_count--; > > > SHouldn't this be trace_events_enabled_count -= trace_events_dstate[id]; > > as it is possible to call this method for a trace event that is a per-vcpu > > event > > The "stub" code will never have vCPUs around, it's used by qemu-img and the like > (any program without "target" code). I just picked the first example of that in this file - you've got the same pattern in the other 2 places you change 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] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/2] trace: Avoid implicit bool->integer conversions 2016-08-11 16:51 ` Daniel P. Berrange @ 2016-08-11 17:22 ` Lluís Vilanova 0 siblings, 0 replies; 7+ messages in thread From: Lluís Vilanova @ 2016-08-11 17:22 UTC (permalink / raw) To: Daniel P. Berrange; +Cc: Paolo Bonzini, qemu-devel, Stefan Hajnoczi Daniel P Berrange writes: > On Thu, Aug 11, 2016 at 06:41:36PM +0200, Lluís Vilanova wrote: >> Daniel P Berrange writes: >> >> > On Thu, Aug 11, 2016 at 06:11:29PM +0200, Lluís Vilanova wrote: >> >> An explicit if/else is clearer than arithmetic assuming #true is 1, >> >> while the compiler should be able to generate just as optimal code. >> >> >> >> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> >> >> --- >> >> stubs/trace-control.c | 9 +++++++-- >> >> trace/control-target.c | 18 ++++++++++++++---- >> >> 2 files changed, 21 insertions(+), 6 deletions(-) >> >> >> >> diff --git a/stubs/trace-control.c b/stubs/trace-control.c >> >> index 3740c38..099c2b5 100644 >> >> --- a/stubs/trace-control.c >> >> +++ b/stubs/trace-control.c >> >> @@ -21,8 +21,13 @@ void trace_event_set_state_dynamic(TraceEvent *ev, bool state) >> >> TraceEventID id; >> >> assert(trace_event_get_state_static(ev)); >> >> id = trace_event_get_id(ev); >> >> - trace_events_enabled_count += state - trace_events_dstate[id]; >> >> - trace_events_dstate[id] = state; >> >> + if (state) { >> >> + trace_events_enabled_count++; >> >> + trace_events_dstate[id] = 1; >> >> + } else { >> >> + trace_events_enabled_count--; >> >> > SHouldn't this be trace_events_enabled_count -= trace_events_dstate[id]; >> > as it is possible to call this method for a trace event that is a per-vcpu >> > event >> >> The "stub" code will never have vCPUs around, it's used by qemu-img and the like >> (any program without "target" code). > I just picked the first example of that in this file - you've got the same > pattern in the other 2 places you change In the "control-target.c" file, there's two places where this pattern also appears. In trace_event_set_state_dynamic(), the pattern only appears on events that do *not* have the "vcpu" property, and so the counter is always either 1 or 0. In trace_event_set_state_dynamic_init() there's the "special" case where we assume there won't be multiple enables of a single event with "vcpu" (as the comment says); this is what let's us get rid of the dstate_init array. What I just saw is wrong is that this code looses the ability to make enable/disable operations idempotent. I'll send a v4 with that fixed. Thanks, Lluis ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2016-08-11 17:22 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-08-11 16:11 [Qemu-devel] [PATCH v3 0/2] trace: Simplify late initialization Lluís Vilanova 2016-08-11 16:11 ` [Qemu-devel] [PATCH v3 1/2] trace: Remove 'trace_events_dstate_init' Lluís Vilanova 2016-08-11 16:11 ` [Qemu-devel] [PATCH v3 2/2] trace: Avoid implicit bool->integer conversions Lluís Vilanova 2016-08-11 16:31 ` Daniel P. Berrange 2016-08-11 16:41 ` Lluís Vilanova 2016-08-11 16:51 ` Daniel P. Berrange 2016-08-11 17:22 ` Lluís Vilanova
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).