[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 13/20] trace: dynamically allocate trace_dstate in
From: |
Stefan Hajnoczi |
Subject: |
[Qemu-devel] [PULL v2 13/20] trace: dynamically allocate trace_dstate in CPUState |
Date: |
Wed, 12 Oct 2016 10:47:31 +0200 |
From: "Daniel P. Berrange" <address@hidden>
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 <address@hidden>
Reviewed-by: LluĂs Vilanova <address@hidden>
Signed-off-by: Daniel P. Berrange <address@hidden>
Message-id: address@hidden
Signed-off-by: Stefan Hajnoczi <address@hidden>
---
include/qom/cpu.h | 9 ++++++---
qom/cpu.c | 7 +++++--
trace/control.c | 5 +++++
trace/control.h | 7 +++++++
4 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index 22b54d6..6d481a1 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -27,7 +27,6 @@
#include "qemu/bitmap.h"
#include "qemu/queue.h"
#include "qemu/thread.h"
-#include "trace/generated-events.h"
typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size,
void *opaque);
@@ -345,8 +344,12 @@ struct CPUState {
struct KVMState *kvm_state;
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. */
int cpu_index; /* used by alpha TCG */
diff --git a/qom/cpu.c b/qom/cpu.c
index e765bc0..c40f774 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -360,12 +360,15 @@ static void cpu_common_initfn(Object *obj)
qemu_mutex_init(&cpu->work_mutex);
QTAILQ_INIT(&cpu->breakpoints);
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)
{
- 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)
diff --git a/trace/control.c b/trace/control.c
index a231327..5f10e2d 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -290,3 +290,8 @@ char *trace_opt_parse(const char *optarg)
return trace_file;
}
+
+uint32_t trace_get_vcpu_event_count(void)
+{
+ return TRACE_VCPU_EVENT_COUNT;
+}
diff --git a/trace/control.h b/trace/control.h
index 3f30a0c..69635bf 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -232,6 +232,13 @@ extern QemuOptsList qemu_trace_opts;
*/
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"
--
2.7.4
- [Qemu-devel] [PULL v2 02/20] trace: add trace event iterator APIs, (continued)
- [Qemu-devel] [PULL v2 02/20] trace: add trace event iterator APIs, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 03/20] trace: convert code to use event iterators, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 05/20] trace: remove global 'uint16 dstate[]' array, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 06/20] trace: remove duplicate control.h includes in generated-tracers.h, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 07/20] trace: break circular dependency in event-internal.h, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 08/20] trace: give each trace event a named TraceEvent struct, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 09/20] trace: remove the TraceEventID and TraceEventVCPUID enums, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 10/20] trace: emit name <-> ID mapping in simpletrace header, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 11/20] trace: don't abort qemu if ftrace can't be initialized, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 12/20] trace: provide mechanism for registering trace events, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 13/20] trace: dynamically allocate trace_dstate in CPUState,
Stefan Hajnoczi <=
- [Qemu-devel] [PULL v2 14/20] trace: dynamically allocate event IDs at runtime, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 15/20] trace: get rid of generated-events.h/generated-events.c, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 16/20] trace: rename _read_events to read_events, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 17/20] trace: push reading of events up a level to tracetool main, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 18/20] trace: pass trace-events to tracetool as a positional param, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 20/20] trace: Add missing execution mode of guest events, Stefan Hajnoczi, 2016/10/12
- [Qemu-devel] [PULL v2 19/20] trace: introduce a formal group name for trace events, Stefan Hajnoczi, 2016/10/12
- Re: [Qemu-devel] [PULL v2 00/20] Tracing patches, Peter Maydell, 2016/10/12