From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757118AbZCEX01 (ORCPT ); Thu, 5 Mar 2009 18:26:27 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1757255AbZCEX0H (ORCPT ); Thu, 5 Mar 2009 18:26:07 -0500 Received: from smtp.polymtl.ca ([132.207.4.11]:33446 "EHLO smtp.polymtl.ca" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757425AbZCEX0E (ORCPT ); Thu, 5 Mar 2009 18:26:04 -0500 Message-Id: <20090305225511.794620538@polymtl.ca> References: <20090305224728.947235917@polymtl.ca> User-Agent: quilt/0.46-1 Date: Thu, 05 Mar 2009 17:47:30 -0500 From: Mathieu Desnoyers To: Linus Torvalds , Ingo Molnar , linux-kernel@vger.kernel.org, Andrew Morton , Steven Rostedt , ltt-dev@lists.casi.polymtl.ca, Peter Zijlstra , Frederic Weisbecker , Arjan van de Ven , Pekka Paalanen , Arnaldo Carvalho de Melo , "H. Peter Anvin" , Martin Bligh , "Frank Ch. Eigler" , Tom Zanussi , Masami Hiramatsu , KOSAKI Motohiro , Jason Baron , Christoph Hellwig , Jiaying Zhang , Eduard - Gabriel Munteanu , mrubin@google.com, md@google.com Cc: Mathieu Desnoyers Subject: [RFC patch 02/41] LTTng - core data structures Content-Disposition: inline; filename=lttng-core.patch X-Poly-FromMTA: (test.casi.polymtl.ca [132.207.72.60]) at Thu, 5 Mar 2009 23:14:08 +0000 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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@tremplin-utc.net S: Maintained +LINUX TRACE TOOLKIT NEXT GENERATION +P: Mathieu Desnoyers +M: mathieu.desnoyers@polymtl.ca +L: ltt-dev@lttng.org +W: http://ltt.polymtl.ca +S: Maintained + LM83 HARDWARE MONITOR DRIVER P: Jean Delvare M: khali@linux-fr.org 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@polymtl.ca + * + * Distributed under the GPL license + */ + +#include +#include +#include +#include +#include + +/* 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(<t_root_mutex); + if (ltt_root_dentry) + kref_put(<t_root_kref, ltt_root_release); + mutex_unlock(<t_root_mutex); +} +EXPORT_SYMBOL_GPL(put_ltt_root); + +struct dentry *get_ltt_root(void) +{ + mutex_lock(<t_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(<t_root_kref); + goto out; + } + kref_get(<t_root_kref); +out: + mutex_unlock(<t_root_mutex); + return ltt_root_dentry; +} +EXPORT_SYMBOL_GPL(get_ltt_root); + +void ltt_lock_traces(void) +{ + mutex_lock(<t_traces_mutex); +} +EXPORT_SYMBOL_GPL(ltt_lock_traces); + +void ltt_unlock_traces(void) +{ + mutex_unlock(<t_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