[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v5 14/20] trace: dynamically allocate trace_dstate i
From: |
Daniel P. Berrange |
Subject: |
[Qemu-devel] [PATCH v5 14/20] trace: dynamically allocate trace_dstate in CPUState |
Date: |
Wed, 28 Sep 2016 14:08:17 +0100 |
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.
Signed-off-by: Daniel P. Berrange <address@hidden>
---
include/qom/cpu.h | 9 ++++++---
qom/cpu.c | 8 ++++++--
trace/control.c | 5 +++++
trace/control.h | 7 +++++++
4 files changed, 24 insertions(+), 5 deletions(-)
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index ce0c406..bbffde7 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);
@@ -350,8 +349,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 f783b5a..09180f0 100644
--- a/qom/cpu.c
+++ b/qom/cpu.c
@@ -29,6 +29,7 @@
#include "qemu/error-report.h"
#include "sysemu/sysemu.h"
#include "hw/qdev-properties.h"
+#include "trace/control.h"
bool cpu_exists(int64_t id)
{
@@ -350,12 +351,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 7be654d..9704f4d 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -310,3 +310,8 @@ void trace_init_vcpu_events(void)
}
}
}
+
+uint32_t trace_get_vcpu_event_count(void)
+{
+ return TRACE_VCPU_EVENT_COUNT;
+}
diff --git a/trace/control.h b/trace/control.h
index f241c7f..7a068ec 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -236,6 +236,13 @@ char *trace_opt_parse(const char *optarg);
void trace_init_vcpu_events(void);
+/**
+ * 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"
#endif /* TRACE__CONTROL_H */
--
2.7.4
- [Qemu-devel] [PATCH v5 01/20] trace: move colo trace events to net/ sub-directory, (continued)
- [Qemu-devel] [PATCH v5 01/20] trace: move colo trace events to net/ sub-directory, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 05/20] trace: remove some now unused functions, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 03/20] trace: add trace event iterator APIs, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 08/20] trace: break circular dependency in event-internal.h, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 06/20] trace: remove global 'uint16 dstate[]' array, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 12/20] trace: don't abort qemu if ftrace can't be initialized, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 07/20] trace: remove duplicate control.h includes in generated-tracers.h, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 09/20] trace: give each trace event a named TraceEvent struct, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 11/20] trace: emit name <-> ID mapping in simpletrace header, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 14/20] trace: dynamically allocate trace_dstate in CPUState,
Daniel P. Berrange <=
- [Qemu-devel] [PATCH v5 10/20] trace: remove the TraceEventID and TraceEventVCPUID enums, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 13/20] trace: provide mechanism for registering trace events, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 15/20] trace: dynamically allocate event IDs at runtime, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 16/20] trace: get rid of generated-events.h/generated-events.c, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 18/20] trace: push reading of events up a level to tracetool main, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 17/20] trace: rename _read_events to read_events, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 19/20] trace: pass trace-events to tracetool as a positional param, Daniel P. Berrange, 2016/09/28
- [Qemu-devel] [PATCH v5 20/20] trace: introduce a formal group name for trace events, Daniel P. Berrange, 2016/09/28