trace: dynamically allocate trace_dstate in CPUState

The CPUState struct has a bitmap tracking which VCPU
events are currently active. This is indexed based on
the event ID values, and sized according the maximum
TraceEventVCPUID enum value.

When we start dynamically assigning IDs at runtime,
we can't statically declare a bitmap without making
an assumption about the max event count. This problem
can be solved by dynamically allocating the per-CPU
dstate bitmap.

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Lluís Vilanova <vilanova@ac.upc.edu>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Message-id: 1475588159-30598-15-git-send-email-berrange@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
Daniel P. Berrange 2016-10-04 14:35:53 +01:00 committed by Stefan Hajnoczi
parent fe4db84d49
commit b7d48952c3
4 changed files with 23 additions and 5 deletions

View File

@ -27,7 +27,6 @@
#include "qemu/bitmap.h" #include "qemu/bitmap.h"
#include "qemu/queue.h" #include "qemu/queue.h"
#include "qemu/thread.h" #include "qemu/thread.h"
#include "trace/generated-events.h"
typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size, typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size,
void *opaque); void *opaque);
@ -345,8 +344,12 @@ struct CPUState {
struct KVMState *kvm_state; struct KVMState *kvm_state;
struct kvm_run *kvm_run; struct kvm_run *kvm_run;
/* Used for events with 'vcpu' and *without* the 'disabled' properties */ /*
DECLARE_BITMAP(trace_dstate, TRACE_VCPU_EVENT_COUNT); * Used for events with 'vcpu' and *without* the 'disabled' properties.
* Dynamically allocated based on bitmap requried to hold up to
* trace_get_vcpu_event_count() entries.
*/
unsigned long *trace_dstate;
/* TODO Move common fields from CPUArchState here. */ /* TODO Move common fields from CPUArchState here. */
int cpu_index; /* used by alpha TCG */ int cpu_index; /* used by alpha TCG */

View File

@ -360,12 +360,15 @@ static void cpu_common_initfn(Object *obj)
qemu_mutex_init(&cpu->work_mutex); qemu_mutex_init(&cpu->work_mutex);
QTAILQ_INIT(&cpu->breakpoints); QTAILQ_INIT(&cpu->breakpoints);
QTAILQ_INIT(&cpu->watchpoints); QTAILQ_INIT(&cpu->watchpoints);
bitmap_zero(cpu->trace_dstate, TRACE_VCPU_EVENT_COUNT);
cpu->trace_dstate = bitmap_new(trace_get_vcpu_event_count());
} }
static void cpu_common_finalize(Object *obj) static void cpu_common_finalize(Object *obj)
{ {
cpu_exec_exit(CPU(obj)); CPUState *cpu = CPU(obj);
cpu_exec_exit(cpu);
g_free(cpu->trace_dstate);
} }
static int64_t cpu_common_get_arch_id(CPUState *cpu) static int64_t cpu_common_get_arch_id(CPUState *cpu)

View File

@ -290,3 +290,8 @@ char *trace_opt_parse(const char *optarg)
return trace_file; return trace_file;
} }
uint32_t trace_get_vcpu_event_count(void)
{
return TRACE_VCPU_EVENT_COUNT;
}

View File

@ -232,6 +232,13 @@ extern QemuOptsList qemu_trace_opts;
*/ */
char *trace_opt_parse(const char *optarg); char *trace_opt_parse(const char *optarg);
/**
* trace_get_vcpu_event_count:
*
* Return the number of known vcpu-specific events
*/
uint32_t trace_get_vcpu_event_count(void);
#include "trace/control-internal.h" #include "trace/control-internal.h"