[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 4/6] trace: Add per-vCPU tracing states for even
From: |
Stefan Hajnoczi |
Subject: |
Re: [Qemu-devel] [PATCH 4/6] trace: Add per-vCPU tracing states for events with the 'vcpu' property |
Date: |
Thu, 9 Jun 2016 13:07:56 +0100 |
User-agent: |
Mutt/1.6.1 (2016-04-27) |
On Thu, Feb 25, 2016 at 04:03:06PM +0100, Lluís Vilanova wrote:
@@ -332,6 +334,16 @@ struct CPUState {
> struct KVMState *kvm_state;
> struct kvm_run *kvm_run;
>
> +#define TRACE_VCPU_DSTATE_TYPE uint32_t
> + TRACE_VCPU_DSTATE_TYPE trace_dstate;
Please use typedef instead of #define.
> + /*
> + * Ensure 'trace_dstate' can encode event states as a bitmask. This
> limits
> + * the number of events with the 'vcpu' property and *without* the
> + * 'disabled' property.
> + */
> + bool too_many_vcpu_events[
> + TRACE_VCPU_EVENT_COUNT > sizeof(TRACE_VCPU_DSTATE_TYPE)*8 ? -1 : 0];
Why limit ourselves to a scalar when "qemu/bitops.h" and "qemu/bitmap.h"
provide functions for arbitrary length bitmaps?
See DECLARE_BITMAP(), set_bit(), clear_bit(), test_bit().
> @@ -61,7 +69,7 @@ static inline bool trace_event_get_state_static(TraceEvent
> *ev)
> 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];
> + return unlikely(trace_events_enabled_count) && (trace_events_dstate[id]
> > 0);
typeof(trace_events_dstate[0]) is size_t, so trace_events_dstate[id] > 0
is equivalent to trace_events_dstate[id] (due to unsigned). Why change
this line?
> +void trace_event_set_state_dynamic(TraceEvent *ev, bool state)
> +{
> + CPUState *cpu;
> + assert(ev != NULL);
> + assert(trace_event_get_state_static(ev));
> + if (trace_event_get_cpu_id(ev) != trace_event_cpu_count()) {
> + CPU_FOREACH(cpu) {
> + trace_event_set_cpu_state_dynamic(cpu, ev, state);
> + }
> + } else {
> + TraceEventID id = trace_event_get_id(ev);
> + trace_events_enabled_count += state - trace_events_dstate[id];
> + trace_events_dstate[id] = state;
> + }
> +}
I find it a little confusing to use different semantics for
trace_events_dstate[] elements depending on trace_event_get_cpu_id(ev)
!= trace_event_cpu_count(). In other words, it either acts as a vcpu
enabled counter or as an enable/disable flag.
That said, it's nice to preserve the non-cpu_id case since it was
written by Paolo as a performance optimization. Changing it could
introduce a regression so I think your approach is okay.
> +
> +void trace_event_set_cpu_state_dynamic(CPUState *cpu,
> + TraceEvent *ev, bool state)
> +{
> + TraceEventID id;
> + TraceEventVCPUID cpu_id;
> + TRACE_VCPU_DSTATE_TYPE bit;
> + bool state_pre;
> + assert(cpu != NULL);
> + assert(ev != NULL);
> + assert(trace_event_get_state_static(ev));
> + assert(trace_event_get_cpu_id(ev) != trace_event_cpu_count());
> + id = trace_event_get_id(ev);
> + cpu_id = trace_event_get_cpu_id(ev);
> + bit = ((TRACE_VCPU_DSTATE_TYPE)1) << cpu_id;
> + state_pre = cpu->trace_dstate & bit;
> + if ((state_pre == 0) != (state == 0)) {
Simpler expression:
if (state_pre != state)
> @@ -21,7 +21,10 @@
> #include "qemu/error-report.h"
>
> int trace_events_enabled_count;
> -bool trace_events_dstate[TRACE_EVENT_COUNT];
> +/* With the 'vcpu' property, counts how many vCPUs have it enabled. */
> +size_t trace_events_dstate[TRACE_EVENT_COUNT];
The number of cpus has type int (see CPUState *qemu_get_cpu(int index)).
Why did you choose size_t?
signature.asc
Description: PGP signature
- Re: [Qemu-devel] [PATCH 4/6] trace: Add per-vCPU tracing states for events with the 'vcpu' property,
Stefan Hajnoczi <=