qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 2/2] trace: check backend dstate in trace_event_


From: Lluís Vilanova
Subject: Re: [Qemu-devel] [PATCH 2/2] trace: check backend dstate in trace_event_get_state()
Date: Fri, 28 Jul 2017 19:42:51 +0300
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)

Daniel P Berrange writes:

> On Fri, Jul 28, 2017 at 10:20:53AM +0100, Stefan Hajnoczi wrote:
>> Code that checks dstate is unaware of SystemTap and LTTng UST dstate, so
>> the following trace event will not fire when solely enabled by SystemTap
>> or LTTng UST:
>> 
>> if (trace_event_get_state(TRACE_MY_EVENT)) {
>> str = g_strdup_printf("Expensive string to generate ...",
>> ...);
>> trace_my_event(str);
>> g_free(str);
>> }
>> 
>> Most users of trace_event_get_state() want to know both QEMU and backend
>> dstate for the event.  Update the macro to include backend dstate.
>> 
>> Introduce trace_event_get_state_qemu() for those callers who really only
>> want QEMU dstate.  This includes the trace backends (like 'log') which
>> should only trigger when event are enabled via QEMU.

> I'm not convinced this is quite right as is.

> The QEMU state for an event is set via cli flags to -trace and that
> is intended for use with with things like simpletrace or log which
> have no other way to filter which events are turned on at runtime.
> For these calling trace_event_get_state_dynamic_by_id() is right.

> For DTrace / LTT-NG, and event is active if the kernel has turned
> on the dynamic probe location.  Any command line args like -trace
> should not influence this at all, so we should *not* involve QEMU
> state at all - only the backend state. So for these we should only
> be calling the backend specific test and ignoring
> trace_event_get_state_dynamic_by_id() entirely. Your patch though
> makes it consider both.

I think this is because Stefan's proposal is to have code written into QEMU's
code that needs to know if *any+ backend has that event enabled, in order to
know if the expensive argument must be generated. Remember, that's regular QEMU
code, not auto-generated.

I would also try to minimise changes and name this new functionality as
trace_event_get_state_all, _any, _backends or something on those
lines. Otherwise we'll break the consistency of the API with other functions
(e.g., trace_event_get_vcpu_state only checks QEMU's state, and will always do
so because external backends do not support that feature).


Thanks,
  Lluis



>> Signed-off-by: Stefan Hajnoczi <address@hidden>
>> ---
>> trace/control.h                     | 20 ++++++++++++++++++--
>> scripts/tracetool/backend/ftrace.py |  2 +-
>> scripts/tracetool/backend/log.py    |  3 ++-
>> scripts/tracetool/backend/simple.py |  2 +-
>> scripts/tracetool/backend/syslog.py |  3 ++-
>> 5 files changed, 24 insertions(+), 6 deletions(-)
>> 
>> diff --git a/trace/control.h b/trace/control.h
>> index b931824d60..b996c34c08 100644
>> --- a/trace/control.h
>> +++ b/trace/control.h
>> @@ -93,16 +93,32 @@ static bool trace_event_is_vcpu(TraceEvent *ev);
>> static const char * trace_event_get_name(TraceEvent *ev);
>> 
>> /**
>> + * trace_event_get_state_qemu:
>> + * @id: Event identifier name.
>> + *
>> + * Get the tracing state of an event, both static and the QEMU dynamic 
>> state.
>> + * Note that some backends maintain their own dynamic state, use
>> + * trace_event_get_state() instead if you wish to include it.
>> + *
>> + * If the event has the disabled property, the check will have no 
>> performance
>> + * impact.
>> + */
>> +#define trace_event_get_state_qemu(id)                       \
>> +    ((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id))
>> +
>> +/**
>> * trace_event_get_state:
>> * @id: Event identifier name.
>> *
>> - * Get the tracing state of an event (both static and dynamic).
>> + * Get the tracing state of an event (both static and dynamic).  Both QEMU 
>> and
>> + * backend-specific dynamic state are included.
>> *
>> * If the event has the disabled property, the check will have no performance
>> * impact.
>> */
>> #define trace_event_get_state(id)                       \
>> -    ((id ##_ENABLED) && trace_event_get_state_dynamic_by_id(id))
>> +    ((id ##_ENABLED) && (trace_event_get_state_dynamic_by_id(id) || \
>> +                         id ##_BACKEND_DSTATE()))
>> 
>> /**
>> * trace_event_get_vcpu_state:
>> diff --git a/scripts/tracetool/backend/ftrace.py 
>> b/scripts/tracetool/backend/ftrace.py
>> index dd0eda4441..fba637b376 100644
>> --- a/scripts/tracetool/backend/ftrace.py
>> +++ b/scripts/tracetool/backend/ftrace.py
>> @@ -33,7 +33,7 @@ def generate_h(event, group):
>> '        char ftrace_buf[MAX_TRACE_STRLEN];',
>> '        int unused __attribute__ ((unused));',
>> '        int trlen;',
>> -        '        if (trace_event_get_state(%(event_id)s)) {',
>> +        '        if (trace_event_get_state_qemu(%(event_id)s)) {',
>> '            trlen = snprintf(ftrace_buf, MAX_TRACE_STRLEN,',
>> '                             "%(name)s " %(fmt)s "\\n" %(argnames)s);',
>> '            trlen = MIN(trlen, MAX_TRACE_STRLEN - 1);',
>> diff --git a/scripts/tracetool/backend/log.py 
>> b/scripts/tracetool/backend/log.py
>> index 54f0a69886..4562b9d12d 100644
>> --- a/scripts/tracetool/backend/log.py
>> +++ b/scripts/tracetool/backend/log.py
>> @@ -33,7 +33,8 @@ def generate_h(event, group):
>> # already checked on the generic format code
>> cond = "true"
>> else:
>> -        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
>> +        cond = "trace_event_get_state_qemu(%s)" % \
>> +               ("TRACE_" + event.name.upper())
>> 
>> out('    if (%(cond)s) {',
>> '        struct timeval _now;',
>> diff --git a/scripts/tracetool/backend/simple.py 
>> b/scripts/tracetool/backend/simple.py
>> index f983670ee1..a39bbdc5c6 100644
>> --- a/scripts/tracetool/backend/simple.py
>> +++ b/scripts/tracetool/backend/simple.py
>> @@ -73,7 +73,7 @@ def generate_c(event, group):
>> # already checked on the generic format code
>> cond = "true"
>> else:
>> -        cond = "trace_event_get_state(%s)" % event_id
>> +        cond = "trace_event_get_state_qemu(%s)" % event_id
>> 
>> out('',
>> '    if (!%(cond)s) {',
>> diff --git a/scripts/tracetool/backend/syslog.py 
>> b/scripts/tracetool/backend/syslog.py
>> index 1ce627f0fc..3ee07bf7fd 100644
>> --- a/scripts/tracetool/backend/syslog.py
>> +++ b/scripts/tracetool/backend/syslog.py
>> @@ -33,7 +33,8 @@ def generate_h(event, group):
>> # already checked on the generic format code
>> cond = "true"
>> else:
>> -        cond = "trace_event_get_state(%s)" % ("TRACE_" + event.name.upper())
>> +        cond = "trace_event_get_state_qemu(%s)" % \
>> +               ("TRACE_" + event.name.upper())
>> 
>> out('    if (%(cond)s) {',
>> '        syslog(LOG_INFO, "%(name)s " %(fmt)s %(argnames)s);',
>> -- 
>> 2.13.3
>> 
>> 

> Regards,
> Daniel
> -- 
> |: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
> |: https://libvirt.org         -o-            https://fstop138.berrange.com :|
> |: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|




reply via email to

[Prev in Thread] Current Thread [Next in Thread]