[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC] tracing: consistent usage of "disable" in "trace-
From: |
Daniel P. Berrange |
Subject: |
Re: [Qemu-devel] [RFC] tracing: consistent usage of "disable" in "trace-events" |
Date: |
Mon, 8 Nov 2010 16:02:13 +0000 |
User-agent: |
Mutt/1.4.1i |
On Mon, Nov 08, 2010 at 04:55:10PM +0100, Lluís wrote:
> Daniel P Berrange writes:
>
> > On Mon, Nov 08, 2010 at 03:42:15PM +0100, Lluís wrote:
> >> On the current implementation, the "disable" keyword in "trace-events"
> >> has different semantics, depending on the backend:
> >>
> >> * nop : ignored (not a problem)
> >> * simple : enables tracing, but sets dynamic state to disable
> >> * ust : disables tracing (uses nop backend)
> >> * dtrace : same as simple
> >>
> >> Would it be possible to just use nop whenever the event is disabled in
> >> trace-events? If you agree I can cook the patch, as it's pretty simple.
>
> > I don't particularly see the point of the 'disable' keyword existing at
> > all, unless there are performance implications for a particular trace
> > backend. For the DTrace backend I strip & ignore the disable keyword
> > because probes that are compiled in, reduce to a inline conditional
> > check that has no serious overhead when no trace client is active.
>
> I think the same is applicable to the UST backend.
>
> But it is not true when tracing guest events (e.g., memory
> accesses). Not because of the backend, but because of the frequency of
> appearance of such events.
>
> In this case, the auto-generated code is on the lines of (I haven't yet
> posted the patch series producing this):
>
> [called during TCG code generation -- e.g., translate.c]
>
> #define TRACE_CURR_CPU_STATE_SET (cpu_single_env->trace_state_set)
> #define trace_guest_vmem_cpu_event 0 // number of per-CPU trace event
>
> static inline void trace_gen_guest_vmem (TCGv_i64 addr, uint32_t size,
> uint32_t write)
> {
> if (TRACE_CURR_CPU_STATE_SET & (1 << trace_guest_vmem_cpu_event)) {
> gen_helper_proxy_guest_vmem(addr, tcg_const_i32(size),
> tcg_const_i32(write));
> }
> }
>
> [extra helper functions -- declared at helper.h]
>
> void helper_proxy_guest_vmem (uint64_t addr, uint32_t size, uint32_t write)
> {
> trace_guest_vmem(addr, size, write);
> }
>
> (*) A state set is a bitset with the events that have been declared with
> the "gen" keyword in "trace-events".
>
> This code has indeed a performance cost, so I opted to follow the
> approach taken by the UST backend ("disable" produces a trace event with
> "nop"). When I opted for this, only simple and ust where in 'tracetool'.
>
> In any case, there might appear other events that could have performance
> implications, although I understand the ease of usage of having all
> trace events available by default.
Ok, I agree that if we have tracepoints in the kind of places in TCG
you describe, then this could have measurable performance impact.
> That's why I would rather declare all trace-events without the "disable"
> keyword, and leave it only on those events that are known to have a high
> frequency, as no backend should have so poor performance as to force
> events to "disappear".
This sounds like a reasonable plan to me.
Regards,
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|