All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
To: Randy Dunlap <randy.dunlap@oracle.com>
Cc: "David J. Wilder" <dwilder@us.ibm.com>,
	linux-kernel@vger.kernel.org,
	Christoph Hellwig <hch@infradead.org>,
	ananth@in.ibm.com
Subject: Re: [RFC Patch] Trace - Samples
Date: Tue, 25 Sep 2007 19:27:35 -0400	[thread overview]
Message-ID: <20070925232735.GA22967@Krystal> (raw)
In-Reply-To: <20070925141619.22db8bce.randy.dunlap@oracle.com>

* Randy Dunlap (randy.dunlap@oracle.com) wrote:
> On Tue, 25 Sep 2007 13:35:47 -0700 David J. Wilder wrote:
> 
> > This patch Moves the trace example into the new samples/ infrastructure
> > 
> > Requires: [patch 3/5] Add samples subdir  (http://lkml.org/lkml/2007/9/25/157)
> > and create samples/Makefile or apply: 
> > [patch 4/5] Linux Kernel Markers - Samples (http://lkml.org/lkml/2007/9/25/166) 
> > 
> > Signed-off-by: David Wilder <dwilder@us.ibm.com>
> 
> Looks good.  Thanks.
> 
> Acked-by: Randy Dunlap <randy.dunlap@oracle.com>
> 
> Andrew, Mathieu is making changes to patch 3/5 referenced above.
> When that is done, do you need a resend of all of these samples/
> patches or do you have them straight?
> 
> Basically we have:
> a.  add samples/ infrastructure  (new coming from Mathieu)
> b.  add markers to samples/  (Mathieu)
Mine is correct as is. (with the new samples infrastructure)

Mathieu

> c.  add trace/ to samples/  (this patch from David)
> d.  add kprobes/ to samples  (move some from Documentation)
> 
> 
> > ---
> >  samples/Kbuild             |    2 -
> >  samples/Kconfig            |    5 ++
> >  samples/Makefile           |    3 +
> >  samples/trace/Makefile     |    4 +
> >  samples/trace/fork_trace.c |  132 ++++++++++++++++++++++++++++++++++++++++++++
> >  5 files changed, 144 insertions(+), 2 deletions(-)
> > 
> > diff --git a/samples/Kbuild b/samples/Kbuild
> > deleted file mode 100644
> > index 8af00e9..0000000
> > --- a/samples/Kbuild
> > +++ /dev/null
> > @@ -1,2 +0,0 @@
> > -# Makefile for Linux samples code
> > -
> > diff --git a/samples/Kconfig b/samples/Kconfig
> > index b46b4cf..e5c6963 100644
> > --- a/samples/Kconfig
> > +++ b/samples/Kconfig
> > @@ -7,5 +7,10 @@ menuconfig SAMPLES
> >  
> >  if SAMPLES
> >  
> > +config SAMPLE_TRACE
> > +	tristate "Build trace example -- loadable modules only"
> > +	depends on TRACE && m
> > +	help
> > +	  This builds a trace example module.
> >  
> >  endif # SAMPLES
> > diff --git a/samples/Makefile b/samples/Makefile
> > new file mode 100644
> > index 0000000..07a32e6
> > --- /dev/null
> > +++ b/samples/Makefile
> > @@ -0,0 +1,3 @@
> > +# Makefile for Linux samples code
> > +
> > +obj-$(CONFIG_SAMPLES) += trace/
> > diff --git a/samples/trace/Makefile b/samples/trace/Makefile
> > new file mode 100644
> > index 0000000..a2da8af
> > --- /dev/null
> > +++ b/samples/trace/Makefile
> > @@ -0,0 +1,4 @@
> > +# builds the trace example kernel modules;
> > +# then to use (as root):  insmod <fork_trace.ko>
> > +
> > +obj-$(CONFIG_SAMPLE_TRACE) := fork_trace.o
> > diff --git a/samples/trace/fork_trace.c b/samples/trace/fork_trace.c
> > new file mode 100644
> > index 0000000..71c04c7
> > --- /dev/null
> > +++ b/samples/trace/fork_trace.c
> > @@ -0,0 +1,132 @@
> > +/*
> > + * An example of using trace in a kprobes module
> > + *
> > + * Copyright (C) 2007 IBM Inc.
> > + *
> > + * David Wilder <dwilder@us.ibm.com>
> > + *
> > + * This program is free software; you can redistribute it and/or modify
> > + * it under the terms of the GNU General Public License version 2 as
> > + * published by the Free Software Foundation.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
> > + *
> > + * -------
> > + * This module creates a trace channel and places a kprobe
> > + * on the function do_fork(). The value of current->pid is written to
> > + * the trace channel each time the kprobe is hit..
> > + *
> > + * How to run the example:
> > + * $ mount -t debugfs /debug
> > + * $ insmod fork_trace.ko
> > + *
> > + * To view the data produced by the module:
> > + * $ cat /debug/trace_example/do_fork/trace0
> > + *
> > + */
> > +
> > +#include <linux/kernel.h>
> > +#include <linux/module.h>
> > +#include <linux/kprobes.h>
> > +#include <linux/trace.h>
> > +
> > +#define USE_GLOBAL_BUFFERS 1
> > +#define USE_FLIGHT 1
> > +
> > +#define PROBE_POINT "do_fork"
> > +
> > +static struct kprobe kp;
> > +static struct trace_info *kprobes_trace;
> > +
> > +#ifdef USE_GLOBAL_BUFFERS
> > +static DEFINE_SPINLOCK(trace_lock);
> > +#endif
> > +
> > +/*
> > + * Send formatted trace data to trace channel.
> > + * @note Preemption must be disabled to use this.
> > + */
> > +static void trace_printf(struct trace_info *trace, const char *format, ...)
> > +{
> > +	va_list ap, aq;
> > +	char *record;
> > +	unsigned long flags;
> > +	int len;
> > +
> > +	if (!trace)
> > +		return;
> > +
> > +#ifdef USE_GLOBAL_BUFFERS
> > +	spin_lock_irqsave(&trace_lock, flags);
> > +#endif
> > +	if (trace_running(trace)) {
> > +		va_start(ap, format);
> > +		va_copy(aq, ap);
> > +		len = vsnprintf(NULL, 0, format, aq);
> > +		va_end(aq);
> > +		record = relay_reserve(trace->rchan, ++len);
> > +		if (record)
> > +			vsnprintf(record, len, format, ap);
> > +		va_end(ap);
> > +	}
> > +#ifdef USE_GLOBAL_BUFFERS
> > +	spin_unlock_irqrestore(&trace_lock, flags);
> > +#endif
> > +}
> > +
> > +static int handler_pre(struct kprobe *p, struct pt_regs *regs)
> > +{
> > +	rcu_read_lock();
> > +	trace_printf(kprobes_trace, "%d\n", current->pid);
> > +	rcu_read_unlock();
> > +	return 0;
> > +}
> > +
> > +int init_module(void)
> > +{
> > +	int ret;
> > +	u32 flags = 0;
> > +
> > +#ifdef USE_GLOBAL_BUFFERS
> > +	flags |= TRACE_GLOBAL_CHANNEL;
> > +#endif
> > +
> > +#ifdef USE_FLIGHT
> > +	flags |= TRACE_FLIGHT_CHANNEL;
> > +#endif
> > +
> > +	/* setup the trace */
> > +	kprobes_trace = trace_setup("trace_example", PROBE_POINT,
> > +				     1024, 8, flags);
> > +	if (IS_ERR(kprobes_trace))
> > +		return PTR_ERR(kprobes_trace);
> > +
> > +	trace_start(kprobes_trace);
> > +
> > +	/* setup the kprobe */
> > +	kp.pre_handler = handler_pre;
> > +	kp.post_handler = NULL;
> > +	kp.fault_handler = NULL;
> > +	kp.symbol_name = PROBE_POINT;
> > +	ret = register_kprobe(&kp);
> > +	if (ret) {
> > +		printk(KERN_ERR "fork_trace: register_kprobe failed\n");
> > +		return ret;
> > +	}
> > +	return 0;
> > +}
> > +
> > +void cleanup_module(void)
> > +{
> > +	unregister_kprobe(&kp);
> > +	trace_stop(kprobes_trace);
> > +	trace_cleanup(kprobes_trace);
> > +}
> > +MODULE_LICENSE("GPL");
> > 
> > 
> > -
> > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > Please read the FAQ at  http://www.tux.org/lkml/
> > 
> 
> 
> ---
> ~Randy
> Phaedrus says that Quality is about caring.

-- 
Mathieu Desnoyers
Computer Engineering Ph.D. Student, Ecole Polytechnique de Montreal
OpenPGP key fingerprint: 8CD5 52C3 8E3C 4140 715F  BA06 3F25 A8FE 3BAE 9A68

  reply	other threads:[~2007-09-25 23:27 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-25 20:35 [RFC Patch] Trace - Samples David J. Wilder
2007-09-25 21:16 ` Randy Dunlap
2007-09-25 23:27   ` Mathieu Desnoyers [this message]
2007-09-25 23:30     ` Randy Dunlap
2007-09-26 15:14       ` David Wilder

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070925232735.GA22967@Krystal \
    --to=mathieu.desnoyers@polymtl.ca \
    --cc=ananth@in.ibm.com \
    --cc=dwilder@us.ibm.com \
    --cc=hch@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=randy.dunlap@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.