diff options
author | Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca> | 2008-02-13 18:03:37 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2008-02-13 19:21:20 -0500 |
commit | fb40bd78b0f91b274879cf5db8facd1e04b6052e (patch) | |
tree | 2347ccb5ad07f58ab5a4eb41174bb7b54d5f0c5b /arch | |
parent | 9170d2f6e1dc4d79650fbf492d1cd45291c66504 (diff) |
Linux Kernel Markers: support multiple probes
RCU style multiple probes support for the Linux Kernel Markers. Common case
(one probe) is still fast and does not require dynamic allocation or a
supplementary pointer dereference on the fast path.
- Move preempt disable from the marker site to the callback.
Since we now have an internal callback, move the preempt disable/enable to the
callback instead of the marker site.
Since the callback change is done asynchronously (passing from a handler that
supports arguments to a handler that does not setup the arguments is no
arguments are passed), we can safely update it even if it is outside the
preempt disable section.
- Move probe arm to probe connection. Now, a connected probe is automatically
armed.
Remove MARK_MAX_FORMAT_LEN, unused.
This patch modifies the Linux Kernel Markers API : it removes the probe
"arm/disarm" and changes the probe function prototype : it now expects a
va_list * instead of a "...".
If we want to have more than one probe connected to a marker at a given
time (LTTng, or blktrace, ssytemtap) then we need this patch. Without it,
connecting a second probe handler to a marker will fail.
It allow us, for instance, to do interesting combinations :
Do standard tracing with LTTng and, eventually, to compute statistics
with SystemTAP, or to have a special trigger on an event that would call
a systemtap script which would stop flight recorder tracing.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>
Cc: Christoph Hellwig <hch@infradead.org>
Cc: Mike Mason <mmlnx@us.ibm.com>
Cc: Dipankar Sarma <dipankar@in.ibm.com>
Cc: David Smith <dsmith@redhat.com>
Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
Cc: "Frank Ch. Eigler" <fche@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/platforms/cell/spufs/sputrace.c | 31 |
1 files changed, 11 insertions, 20 deletions
diff --git a/arch/powerpc/platforms/cell/spufs/sputrace.c b/arch/powerpc/platforms/cell/spufs/sputrace.c index 2b1953f6f12e..01974f7776e1 100644 --- a/arch/powerpc/platforms/cell/spufs/sputrace.c +++ b/arch/powerpc/platforms/cell/spufs/sputrace.c | |||
@@ -146,34 +146,28 @@ static void sputrace_log_item(const char *name, struct spu_context *ctx, | |||
146 | wake_up(&sputrace_wait); | 146 | wake_up(&sputrace_wait); |
147 | } | 147 | } |
148 | 148 | ||
149 | static void spu_context_event(const struct marker *mdata, | 149 | static void spu_context_event(void *probe_private, void *call_data, |
150 | void *private, const char *format, ...) | 150 | const char *format, va_list *args) |
151 | { | 151 | { |
152 | struct spu_probe *p = mdata->private; | 152 | struct spu_probe *p = probe_private; |
153 | va_list ap; | ||
154 | struct spu_context *ctx; | 153 | struct spu_context *ctx; |
155 | struct spu *spu; | 154 | struct spu *spu; |
156 | 155 | ||
157 | va_start(ap, format); | 156 | ctx = va_arg(*args, struct spu_context *); |
158 | ctx = va_arg(ap, struct spu_context *); | 157 | spu = va_arg(*args, struct spu *); |
159 | spu = va_arg(ap, struct spu *); | ||
160 | 158 | ||
161 | sputrace_log_item(p->name, ctx, spu); | 159 | sputrace_log_item(p->name, ctx, spu); |
162 | va_end(ap); | ||
163 | } | 160 | } |
164 | 161 | ||
165 | static void spu_context_nospu_event(const struct marker *mdata, | 162 | static void spu_context_nospu_event(void *probe_private, void *call_data, |
166 | void *private, const char *format, ...) | 163 | const char *format, va_list *args) |
167 | { | 164 | { |
168 | struct spu_probe *p = mdata->private; | 165 | struct spu_probe *p = probe_private; |
169 | va_list ap; | ||
170 | struct spu_context *ctx; | 166 | struct spu_context *ctx; |
171 | 167 | ||
172 | va_start(ap, format); | 168 | ctx = va_arg(*args, struct spu_context *); |
173 | ctx = va_arg(ap, struct spu_context *); | ||
174 | 169 | ||
175 | sputrace_log_item(p->name, ctx, NULL); | 170 | sputrace_log_item(p->name, ctx, NULL); |
176 | va_end(ap); | ||
177 | } | 171 | } |
178 | 172 | ||
179 | struct spu_probe spu_probes[] = { | 173 | struct spu_probe spu_probes[] = { |
@@ -219,10 +213,6 @@ static int __init sputrace_init(void) | |||
219 | if (error) | 213 | if (error) |
220 | printk(KERN_INFO "Unable to register probe %s\n", | 214 | printk(KERN_INFO "Unable to register probe %s\n", |
221 | p->name); | 215 | p->name); |
222 | |||
223 | error = marker_arm(p->name); | ||
224 | if (error) | ||
225 | printk(KERN_INFO "Unable to arm probe %s\n", p->name); | ||
226 | } | 216 | } |
227 | 217 | ||
228 | return 0; | 218 | return 0; |
@@ -238,7 +228,8 @@ static void __exit sputrace_exit(void) | |||
238 | int i; | 228 | int i; |
239 | 229 | ||
240 | for (i = 0; i < ARRAY_SIZE(spu_probes); i++) | 230 | for (i = 0; i < ARRAY_SIZE(spu_probes); i++) |
241 | marker_probe_unregister(spu_probes[i].name); | 231 | marker_probe_unregister(spu_probes[i].name, |
232 | spu_probes[i].probe_func, &spu_probes[i]); | ||
242 | 233 | ||
243 | remove_proc_entry("sputrace", NULL); | 234 | remove_proc_entry("sputrace", NULL); |
244 | kfree(sputrace_log); | 235 | kfree(sputrace_log); |