Messages in this thread | | | Date | Thu, 24 Jul 2008 11:08:18 -0400 (EDT) | From | Steven Rostedt <> | Subject | Re: [patch 02/17] Kernel Tracepoints |
| |
[Added Paul McKenney to CC]
On Tue, 15 Jul 2008, Mathieu Desnoyers wrote: > +++ linux-2.6-lttng/include/linux/tracepoint.h 2008-07-15 17:35:19.000000000 -0400 > @@ -0,0 +1,127 @@ > +#ifndef _LINUX_TRACEPOINT_H > +#define _LINUX_TRACEPOINT_H > + > +/* > + * Kernel Tracepoint API. > + * > + * See Documentation/tracepoint.txt. > + * > + * (C) Copyright 2008 Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> > + * > + * Heavily inspired from the Linux Kernel Markers. > + * > + * This file is released under the GPLv2. > + * See the file COPYING for more details. > + */ > + > +#include <linux/types.h> > +#include <linux/rcupdate.h> > + > +struct module; > +struct tracepoint; > + > +struct tracepoint { > + const char *name; /* Tracepoint name */ > + int state; /* State. */ > + void **funcs; > +} __attribute__((aligned(8))); > + > + > +#define TPPROTO(args...) args > +#define TPARGS(args...) args > + > +#ifdef CONFIG_TRACEPOINTS > + > +/* > + * it_func[0] is never NULL because there is at least one element in the array > + * when the array itself is non NULL. > + */ > +#define __DO_TRACE(tp, proto, args) \ > + do { \ > + void **it_func; \ > + \ > + rcu_read_lock_sched(); \ > + it_func = rcu_dereference((tp)->funcs); \ > + if (it_func) { \ > + do { \ > + ((void(*)(proto))(*it_func))(args); \ > + } while (*(++it_func)); \
OK, I still don't understand the concept of the rcu_dereference, but why is it needed for the first assignment of it_func but not the ++? Is it only needed with the (tp)->funcs?
-- Steve
> + } \ > + rcu_read_unlock_sched(); \ > + } while (0)
| |