Message ID | 147388821876.17002.6684458103246806554.stgit@fimbulvetr.bsc.es |
---|---|
State | New |
Headers | show |
On Wed, Sep 14, 2016 at 11:23:38PM +0200, Lluís Vilanova wrote: > If an event is dynamically disabled, the TCG code that calls the > execution-time tracer is not generated. > > Removes the overheads of execution-time tracers for dynamically disabled > events. As a bonus, also avoids checking the event state when the > execution-time tracer is called from TCG-generated code (since otherwise > TCG would simply not call it). > > Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> > --- > scripts/tracetool/backend/dtrace.py | 2 +- > scripts/tracetool/backend/ftrace.py | 20 ++++++++++---------- > scripts/tracetool/backend/log.py | 16 ++++++++-------- > scripts/tracetool/backend/simple.py | 2 +- > scripts/tracetool/backend/syslog.py | 6 +++--- > scripts/tracetool/backend/ust.py | 2 +- > scripts/tracetool/format/h.py | 23 +++++++++++++++++------ > scripts/tracetool/format/tcg_h.py | 20 +++++++++++++++++--- > scripts/tracetool/format/tcg_helper_c.py | 3 ++- > 9 files changed, 60 insertions(+), 34 deletions(-) > > diff --git a/scripts/tracetool/backend/dtrace.py b/scripts/tracetool/backend/dtrace.py > index ab9ecfa..20242f2 100644 > --- a/scripts/tracetool/backend/dtrace.py > +++ b/scripts/tracetool/backend/dtrace.py > @@ -41,6 +41,6 @@ def generate_h_begin(events): > > > def generate_h(event): > - out(' QEMU_%(uppername)s(%(argnames)s);', > + out(' QEMU_%(uppername)s(%(argnames)s);', > uppername=event.name.upper(), > argnames=", ".join(event.args.names())) > diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py > index 80dcf30..d798c71 100644 > --- a/scripts/tracetool/backend/ftrace.py > +++ b/scripts/tracetool/backend/ftrace.py > @@ -30,17 +30,17 @@ def generate_h(event): > if len(event.args) > 0: > argnames = ", " + argnames > > - out(' {', > - ' char ftrace_buf[MAX_TRACE_STRLEN];', > - ' int unused __attribute__ ((unused));', > - ' int trlen;', > - ' if (trace_event_get_state(%(event_id)s)) {', > - ' trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,', > - ' "%(name)s " %(fmt)s "\\n" %(argnames)s);', > - ' trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);', > - ' unused = write(trace_marker_fd, ftrace_buf, trlen);', > - ' }', > + out(' {', > + ' char ftrace_buf[MAX_TRACE_STRLEN];', > + ' int unused __attribute__ ((unused));', > + ' int trlen;', > + ' if (trace_event_get_state(%(event_id)s)) {', > + ' trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,', > + ' "%(name)s " %(fmt)s "\\n" %(argnames)s);', > + ' trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);', > + ' unused = write(trace_marker_fd, ftrace_buf, trlen);', > ' }', > + ' }', > name=event.name, > args=event.args, > event_id="TRACE_" + event.name.upper(), > diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py > index b3ff064..6818147 100644 > --- a/scripts/tracetool/backend/log.py > +++ b/scripts/tracetool/backend/log.py > @@ -36,14 +36,14 @@ def generate_h(event): > else: > cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper()) > > - out(' if (%(cond)s) {', > - ' struct timeval _now;', > - ' gettimeofday(&_now, NULL);', > - ' qemu_log_mask(LOG_TRACE, "%%d@%%zd.%%06zd:%(name)s " %(fmt)s "\\n",', > - ' getpid(),', > - ' (size_t)_now.tv_sec, (size_t)_now.tv_usec', > - ' %(argnames)s);', > - ' }', > + out(' if (%(cond)s) {', > + ' struct timeval _now;', > + ' gettimeofday(&_now, NULL);', > + ' qemu_log_mask(LOG_TRACE, "%%d@%%zd.%%06zd:%(name)s " %(fmt)s "\\n",', > + ' getpid(),', > + ' (size_t)_now.tv_sec, (size_t)_now.tv_usec', > + ' %(argnames)s);', > + ' }', > cond=cond, > name=event.name, > fmt=event.fmt.rstrip("\n"), > diff --git a/scripts/tracetool/backend/simple.py b/scripts/tracetool/backend/simple.py > index 1bccada..4acf23f 100644 > --- a/scripts/tracetool/backend/simple.py > +++ b/scripts/tracetool/backend/simple.py > @@ -36,7 +36,7 @@ def generate_h_begin(events): > > > def generate_h(event): > - out(' _simple_%(api)s(%(args)s);', > + out(' _simple_%(api)s(%(args)s);', > api=event.api(), > args=", ".join(event.args.names())) > > diff --git a/scripts/tracetool/backend/syslog.py b/scripts/tracetool/backend/syslog.py > index 89019bc..b355121 100644 > --- a/scripts/tracetool/backend/syslog.py > +++ b/scripts/tracetool/backend/syslog.py > @@ -36,9 +36,9 @@ def generate_h(event): > else: > cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper()) > > - out(' if (%(cond)s) {', > - ' syslog(LOG_INFO, "%(name)s " %(fmt)s %(argnames)s);', > - ' }', > + out(' if (%(cond)s) {', > + ' syslog(LOG_INFO, "%(name)s " %(fmt)s %(argnames)s);', > + ' }', > cond=cond, > name=event.name, > fmt=event.fmt.rstrip("\n"), > diff --git a/scripts/tracetool/backend/ust.py b/scripts/tracetool/backend/ust.py > index ed4c227..88d13e2 100644 > --- a/scripts/tracetool/backend/ust.py > +++ b/scripts/tracetool/backend/ust.py > @@ -30,6 +30,6 @@ def generate_h(event): > if len(event.args) > 0: > argnames = ", " + argnames > > - out(' tracepoint(qemu, %(name)s%(tp_args)s);', > + out(' tracepoint(qemu, %(name)s%(tp_args)s);', > name=event.name, > tp_args=argnames) All the stylistic whitespace changes should be done as a separate patch from the the functional changes. Regards, Daniel
Daniel P Berrange writes: > On Wed, Sep 14, 2016 at 11:23:38PM +0200, Lluís Vilanova wrote: >> If an event is dynamically disabled, the TCG code that calls the >> execution-time tracer is not generated. >> >> Removes the overheads of execution-time tracers for dynamically disabled >> events. As a bonus, also avoids checking the event state when the >> execution-time tracer is called from TCG-generated code (since otherwise >> TCG would simply not call it). >> >> Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> >> --- >> scripts/tracetool/backend/dtrace.py | 2 +- >> scripts/tracetool/backend/ftrace.py | 20 ++++++++++---------- >> scripts/tracetool/backend/log.py | 16 ++++++++-------- >> scripts/tracetool/backend/simple.py | 2 +- >> scripts/tracetool/backend/syslog.py | 6 +++--- >> scripts/tracetool/backend/ust.py | 2 +- >> scripts/tracetool/format/h.py | 23 +++++++++++++++++------ >> scripts/tracetool/format/tcg_h.py | 20 +++++++++++++++++--- >> scripts/tracetool/format/tcg_helper_c.py | 3 ++- >> 9 files changed, 60 insertions(+), 34 deletions(-) >> >> diff --git a/scripts/tracetool/backend/dtrace.py b/scripts/tracetool/backend/dtrace.py >> index ab9ecfa..20242f2 100644 >> --- a/scripts/tracetool/backend/dtrace.py >> +++ b/scripts/tracetool/backend/dtrace.py >> @@ -41,6 +41,6 @@ def generate_h_begin(events): >> >> >> def generate_h(event): >> - out(' QEMU_%(uppername)s(%(argnames)s);', >> + out(' QEMU_%(uppername)s(%(argnames)s);', >> uppername=event.name.upper(), >> argnames=", ".join(event.args.names())) >> diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py >> index 80dcf30..d798c71 100644 >> --- a/scripts/tracetool/backend/ftrace.py >> +++ b/scripts/tracetool/backend/ftrace.py >> @@ -30,17 +30,17 @@ def generate_h(event): >> if len(event.args) > 0: >> argnames = ", " + argnames >> >> - out(' {', >> - ' char ftrace_buf[MAX_TRACE_STRLEN];', >> - ' int unused __attribute__ ((unused));', >> - ' int trlen;', >> - ' if (trace_event_get_state(%(event_id)s)) {', >> - ' trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,', >> - ' "%(name)s " %(fmt)s "\\n" %(argnames)s);', >> - ' trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);', >> - ' unused = write(trace_marker_fd, ftrace_buf, trlen);', >> - ' }', >> + out(' {', >> + ' char ftrace_buf[MAX_TRACE_STRLEN];', >> + ' int unused __attribute__ ((unused));', >> + ' int trlen;', >> + ' if (trace_event_get_state(%(event_id)s)) {', >> + ' trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,', >> + ' "%(name)s " %(fmt)s "\\n" %(argnames)s);', >> + ' trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);', >> + ' unused = write(trace_marker_fd, ftrace_buf, trlen);', >> ' }', >> + ' }', >> name=event.name, >> args=event.args, >> event_id="TRACE_" + event.name.upper(), >> diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py >> index b3ff064..6818147 100644 >> --- a/scripts/tracetool/backend/log.py >> +++ b/scripts/tracetool/backend/log.py >> @@ -36,14 +36,14 @@ def generate_h(event): >> else: >> cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper()) >> >> - out(' if (%(cond)s) {', >> - ' struct timeval _now;', >> - ' gettimeofday(&_now, NULL);', >> - ' qemu_log_mask(LOG_TRACE, "%%d@%%zd.%%06zd:%(name)s " %(fmt)s "\\n",', >> - ' getpid(),', >> - ' (size_t)_now.tv_sec, (size_t)_now.tv_usec', >> - ' %(argnames)s);', >> - ' }', >> + out(' if (%(cond)s) {', >> + ' struct timeval _now;', >> + ' gettimeofday(&_now, NULL);', >> + ' qemu_log_mask(LOG_TRACE, "%%d@%%zd.%%06zd:%(name)s " %(fmt)s "\\n",', >> + ' getpid(),', >> + ' (size_t)_now.tv_sec, (size_t)_now.tv_usec', >> + ' %(argnames)s);', >> + ' }', >> cond=cond, >> name=event.name, >> fmt=event.fmt.rstrip("\n"), >> diff --git a/scripts/tracetool/backend/simple.py b/scripts/tracetool/backend/simple.py >> index 1bccada..4acf23f 100644 >> --- a/scripts/tracetool/backend/simple.py >> +++ b/scripts/tracetool/backend/simple.py >> @@ -36,7 +36,7 @@ def generate_h_begin(events): >> >> >> def generate_h(event): >> - out(' _simple_%(api)s(%(args)s);', >> + out(' _simple_%(api)s(%(args)s);', >> api=event.api(), >> args=", ".join(event.args.names())) >> >> diff --git a/scripts/tracetool/backend/syslog.py b/scripts/tracetool/backend/syslog.py >> index 89019bc..b355121 100644 >> --- a/scripts/tracetool/backend/syslog.py >> +++ b/scripts/tracetool/backend/syslog.py >> @@ -36,9 +36,9 @@ def generate_h(event): >> else: >> cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper()) >> >> - out(' if (%(cond)s) {', >> - ' syslog(LOG_INFO, "%(name)s " %(fmt)s %(argnames)s);', >> - ' }', >> + out(' if (%(cond)s) {', >> + ' syslog(LOG_INFO, "%(name)s " %(fmt)s %(argnames)s);', >> + ' }', >> cond=cond, >> name=event.name, >> fmt=event.fmt.rstrip("\n"), >> diff --git a/scripts/tracetool/backend/ust.py b/scripts/tracetool/backend/ust.py >> index ed4c227..88d13e2 100644 >> --- a/scripts/tracetool/backend/ust.py >> +++ b/scripts/tracetool/backend/ust.py >> @@ -30,6 +30,6 @@ def generate_h(event): >> if len(event.args) > 0: >> argnames = ", " + argnames >> >> - out(' tracepoint(qemu, %(name)s%(tp_args)s);', >> + out(' tracepoint(qemu, %(name)s%(tp_args)s);', >> name=event.name, >> tp_args=argnames) > All the stylistic whitespace changes should be done as a separate > patch from the the functional changes. Ok!
diff --git a/scripts/tracetool/backend/dtrace.py b/scripts/tracetool/backend/dtrace.py index ab9ecfa..20242f2 100644 --- a/scripts/tracetool/backend/dtrace.py +++ b/scripts/tracetool/backend/dtrace.py @@ -41,6 +41,6 @@ def generate_h_begin(events): def generate_h(event): - out(' QEMU_%(uppername)s(%(argnames)s);', + out(' QEMU_%(uppername)s(%(argnames)s);', uppername=event.name.upper(), argnames=", ".join(event.args.names())) diff --git a/scripts/tracetool/backend/ftrace.py b/scripts/tracetool/backend/ftrace.py index 80dcf30..d798c71 100644 --- a/scripts/tracetool/backend/ftrace.py +++ b/scripts/tracetool/backend/ftrace.py @@ -30,17 +30,17 @@ def generate_h(event): if len(event.args) > 0: argnames = ", " + argnames - out(' {', - ' char ftrace_buf[MAX_TRACE_STRLEN];', - ' int unused __attribute__ ((unused));', - ' int trlen;', - ' if (trace_event_get_state(%(event_id)s)) {', - ' trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,', - ' "%(name)s " %(fmt)s "\\n" %(argnames)s);', - ' trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);', - ' unused = write(trace_marker_fd, ftrace_buf, trlen);', - ' }', + out(' {', + ' char ftrace_buf[MAX_TRACE_STRLEN];', + ' int unused __attribute__ ((unused));', + ' int trlen;', + ' if (trace_event_get_state(%(event_id)s)) {', + ' trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,', + ' "%(name)s " %(fmt)s "\\n" %(argnames)s);', + ' trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);', + ' unused = write(trace_marker_fd, ftrace_buf, trlen);', ' }', + ' }', name=event.name, args=event.args, event_id="TRACE_" + event.name.upper(), diff --git a/scripts/tracetool/backend/log.py b/scripts/tracetool/backend/log.py index b3ff064..6818147 100644 --- a/scripts/tracetool/backend/log.py +++ b/scripts/tracetool/backend/log.py @@ -36,14 +36,14 @@ def generate_h(event): else: cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper()) - out(' if (%(cond)s) {', - ' struct timeval _now;', - ' gettimeofday(&_now, NULL);', - ' qemu_log_mask(LOG_TRACE, "%%d@%%zd.%%06zd:%(name)s " %(fmt)s "\\n",', - ' getpid(),', - ' (size_t)_now.tv_sec, (size_t)_now.tv_usec', - ' %(argnames)s);', - ' }', + out(' if (%(cond)s) {', + ' struct timeval _now;', + ' gettimeofday(&_now, NULL);', + ' qemu_log_mask(LOG_TRACE, "%%d@%%zd.%%06zd:%(name)s " %(fmt)s "\\n",', + ' getpid(),', + ' (size_t)_now.tv_sec, (size_t)_now.tv_usec', + ' %(argnames)s);', + ' }', cond=cond, name=event.name, fmt=event.fmt.rstrip("\n"), diff --git a/scripts/tracetool/backend/simple.py b/scripts/tracetool/backend/simple.py index 1bccada..4acf23f 100644 --- a/scripts/tracetool/backend/simple.py +++ b/scripts/tracetool/backend/simple.py @@ -36,7 +36,7 @@ def generate_h_begin(events): def generate_h(event): - out(' _simple_%(api)s(%(args)s);', + out(' _simple_%(api)s(%(args)s);', api=event.api(), args=", ".join(event.args.names())) diff --git a/scripts/tracetool/backend/syslog.py b/scripts/tracetool/backend/syslog.py index 89019bc..b355121 100644 --- a/scripts/tracetool/backend/syslog.py +++ b/scripts/tracetool/backend/syslog.py @@ -36,9 +36,9 @@ def generate_h(event): else: cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper()) - out(' if (%(cond)s) {', - ' syslog(LOG_INFO, "%(name)s " %(fmt)s %(argnames)s);', - ' }', + out(' if (%(cond)s) {', + ' syslog(LOG_INFO, "%(name)s " %(fmt)s %(argnames)s);', + ' }', cond=cond, name=event.name, fmt=event.fmt.rstrip("\n"), diff --git a/scripts/tracetool/backend/ust.py b/scripts/tracetool/backend/ust.py index ed4c227..88d13e2 100644 --- a/scripts/tracetool/backend/ust.py +++ b/scripts/tracetool/backend/ust.py @@ -30,6 +30,6 @@ def generate_h(event): if len(event.args) > 0: argnames = ", " + argnames - out(' tracepoint(qemu, %(name)s%(tp_args)s);', + out(' tracepoint(qemu, %(name)s%(tp_args)s);', name=event.name, tp_args=argnames) diff --git a/scripts/tracetool/format/h.py b/scripts/tracetool/format/h.py index 3763e9a..99fcbc0 100644 --- a/scripts/tracetool/format/h.py +++ b/scripts/tracetool/format/h.py @@ -29,6 +29,19 @@ def generate(events, backend): backend.generate_begin(events) for e in events: + # tracer without checks + out('', + 'static inline void __nocheck__%(api)s(%(args)s)', + '{', + api=e.api(), + args=e.args) + + if "disable" not in e.properties: + backend.generate(e) + + out('}') + + # tracer wrapper with checks (per-vCPU tracing) if "vcpu" in e.properties: trace_cpu = next(iter(e.args))[1] cond = "trace_event_get_vcpu_state(%(cpu)s,"\ @@ -44,16 +57,14 @@ def generate(events, backend): 'static inline void %(api)s(%(args)s)', '{', ' if (%(cond)s) {', + ' __nocheck__%(api)s(%(names)s);', + ' }', + '}', api=e.api(), args=e.args, + names=", ".join(e.args.names()), cond=cond) - if "disable" not in e.properties: - backend.generate(e) - - out(' }', - '}') - backend.generate_end(events) out('#endif /* TRACE__GENERATED_TRACERS_H */') diff --git a/scripts/tracetool/format/tcg_h.py b/scripts/tracetool/format/tcg_h.py index e2331f2..fb2503a 100644 --- a/scripts/tracetool/format/tcg_h.py +++ b/scripts/tracetool/format/tcg_h.py @@ -41,7 +41,7 @@ def generate(events, backend): for e in events: # just keep one of them - if "tcg-trans" not in e.properties: + if "tcg-exec" not in e.properties: continue out('static inline void %(name_tcg)s(%(args)s)', @@ -53,12 +53,26 @@ def generate(events, backend): args_trans = e.original.event_trans.args args_exec = tracetool.vcpu.transform_args( "tcg_helper_c", e.original.event_exec, "wrapper") + if "vcpu" in e.properties: + trace_cpu = e.args.names()[0] + cond = "trace_event_get_vcpu_state(%(cpu)s,"\ + " TRACE_%(id)s,"\ + " TRACE_VCPU_%(id)s)"\ + % dict( + cpu=trace_cpu, + id=e.original.event_exec.name.upper()) + else: + cond = "true" + out(' %(name_trans)s(%(argnames_trans)s);', - ' gen_helper_%(name_exec)s(%(argnames_exec)s);', + ' if (%(cond)s) {', + ' gen_helper_%(name_exec)s(%(argnames_exec)s);', + ' }', name_trans=e.original.event_trans.api(e.QEMU_TRACE), name_exec=e.original.event_exec.api(e.QEMU_TRACE), argnames_trans=", ".join(args_trans.names()), - argnames_exec=", ".join(args_exec.names())) + argnames_exec=", ".join(args_exec.names()), + cond=cond) out('}') diff --git a/scripts/tracetool/format/tcg_helper_c.py b/scripts/tracetool/format/tcg_helper_c.py index e3485b7..f9adb3c 100644 --- a/scripts/tracetool/format/tcg_helper_c.py +++ b/scripts/tracetool/format/tcg_helper_c.py @@ -66,7 +66,8 @@ def generate(events, backend): out('void %(name_tcg)s(%(args_api)s)', '{', - ' %(name)s(%(args_call)s);', + # NOTE: the check was already performed at TCG-generation time + ' __nocheck__%(name)s(%(args_call)s);', '}', name_tcg="helper_%s_proxy" % e.api(), name=e.api(),
If an event is dynamically disabled, the TCG code that calls the execution-time tracer is not generated. Removes the overheads of execution-time tracers for dynamically disabled events. As a bonus, also avoids checking the event state when the execution-time tracer is called from TCG-generated code (since otherwise TCG would simply not call it). Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu> --- scripts/tracetool/backend/dtrace.py | 2 +- scripts/tracetool/backend/ftrace.py | 20 ++++++++++---------- scripts/tracetool/backend/log.py | 16 ++++++++-------- scripts/tracetool/backend/simple.py | 2 +- scripts/tracetool/backend/syslog.py | 6 +++--- scripts/tracetool/backend/ust.py | 2 +- scripts/tracetool/format/h.py | 23 +++++++++++++++++------ scripts/tracetool/format/tcg_h.py | 20 +++++++++++++++++--- scripts/tracetool/format/tcg_helper_c.py | 3 ++- 9 files changed, 60 insertions(+), 34 deletions(-)