[RFC patch 02/41] LTTng - core data structures

From: Mathieu Desnoyers
Date: Thu Mar 05 2009 - 18:26:27 EST


Home of the traces data structures. Needs to be built into the kernel.

LTT heartbeat is a module specialized into firing periodical interrupts to
record events in traces (so cycle counter rollover can be detected) and to
update the 64 bits "synthetic TSC" (extended from the CPU 32 bits TSC on MIPS).
Also needs to be built into the kernel.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@xxxxxxxxxx>
---
MAINTAINERS | 7 +++
include/linux/ltt-core.h | 10 ++++
ltt/ltt-core.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 118 insertions(+)

Index: linux-2.6-lttng/MAINTAINERS
===================================================================
--- linux-2.6-lttng.orig/MAINTAINERS 2009-03-04 13:24:38.000000000 -0500
+++ linux-2.6-lttng/MAINTAINERS 2009-03-04 13:24:59.000000000 -0500
@@ -2766,6 +2766,13 @@ P: Eric Piel
M: eric.piel@xxxxxxxxxxxxxxxx
S: Maintained

+LINUX TRACE TOOLKIT NEXT GENERATION
+P: Mathieu Desnoyers
+M: mathieu.desnoyers@xxxxxxxxxx
+L: ltt-dev@xxxxxxxxx
+W: http://ltt.polymtl.ca
+S: Maintained
+
LM83 HARDWARE MONITOR DRIVER
P: Jean Delvare
M: khali@xxxxxxxxxxxx
Index: linux-2.6-lttng/ltt/ltt-core.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6-lttng/ltt/ltt-core.c 2009-03-04 13:36:17.000000000 -0500
@@ -0,0 +1,101 @@
+/*
+ * LTT core in-kernel infrastructure.
+ *
+ * Copyright 2006 - Mathieu Desnoyers mathieu.desnoyers@xxxxxxxxxx
+ *
+ * Distributed under the GPL license
+ */
+
+#include <linux/ltt-core.h>
+#include <linux/percpu.h>
+#include <linux/module.h>
+#include <linux/debugfs.h>
+#include <linux/kref.h>
+
+/* Traces structures */
+struct ltt_traces ltt_traces = {
+ .setup_head = LIST_HEAD_INIT(ltt_traces.setup_head),
+ .head = LIST_HEAD_INIT(ltt_traces.head),
+};
+EXPORT_SYMBOL(ltt_traces);
+
+/* Traces list writer locking */
+static DEFINE_MUTEX(ltt_traces_mutex);
+
+/* root dentry mutex */
+static DEFINE_MUTEX(ltt_root_mutex);
+/* dentry of ltt's root dir */
+static struct dentry *ltt_root_dentry;
+static struct kref ltt_root_kref = {
+ .refcount = ATOMIC_INIT(0),
+};
+
+static void ltt_root_release(struct kref *ref)
+{
+ debugfs_remove(ltt_root_dentry);
+ ltt_root_dentry = NULL;
+}
+
+void put_ltt_root(void)
+{
+ mutex_lock(&ltt_root_mutex);
+ if (ltt_root_dentry)
+ kref_put(&ltt_root_kref, ltt_root_release);
+ mutex_unlock(&ltt_root_mutex);
+}
+EXPORT_SYMBOL_GPL(put_ltt_root);
+
+struct dentry *get_ltt_root(void)
+{
+ mutex_lock(&ltt_root_mutex);
+ if (!ltt_root_dentry) {
+ ltt_root_dentry = debugfs_create_dir(LTT_ROOT, NULL);
+ if (!ltt_root_dentry) {
+ printk(KERN_ERR "LTT : create ltt root dir failed\n");
+ goto out;
+ }
+ kref_init(&ltt_root_kref);
+ goto out;
+ }
+ kref_get(&ltt_root_kref);
+out:
+ mutex_unlock(&ltt_root_mutex);
+ return ltt_root_dentry;
+}
+EXPORT_SYMBOL_GPL(get_ltt_root);
+
+void ltt_lock_traces(void)
+{
+ mutex_lock(&ltt_traces_mutex);
+}
+EXPORT_SYMBOL_GPL(ltt_lock_traces);
+
+void ltt_unlock_traces(void)
+{
+ mutex_unlock(&ltt_traces_mutex);
+}
+EXPORT_SYMBOL_GPL(ltt_unlock_traces);
+
+DEFINE_PER_CPU(unsigned int, ltt_nesting);
+EXPORT_PER_CPU_SYMBOL(ltt_nesting);
+
+int ltt_run_filter_default(void *trace, uint16_t eID)
+{
+ return 1;
+}
+
+/* This function pointer is protected by a trace activation check */
+ltt_run_filter_functor ltt_run_filter = ltt_run_filter_default;
+EXPORT_SYMBOL_GPL(ltt_run_filter);
+
+void ltt_filter_register(ltt_run_filter_functor func)
+{
+ ltt_run_filter = func;
+}
+EXPORT_SYMBOL_GPL(ltt_filter_register);
+
+void ltt_filter_unregister(void)
+{
+ ltt_run_filter = ltt_run_filter_default;
+}
+EXPORT_SYMBOL_GPL(ltt_filter_unregister);

--
Mathieu Desnoyers
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/