aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorMathieu Desnoyers <mathieu.desnoyers@polymtl.ca>2008-02-13 18:03:37 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-13 19:21:20 -0500
commitfb40bd78b0f91b274879cf5db8facd1e04b6052e (patch)
tree2347ccb5ad07f58ab5a4eb41174bb7b54d5f0c5b /arch
parent9170d2f6e1dc4d79650fbf492d1cd45291c66504 (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.c31
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
149static void spu_context_event(const struct marker *mdata, 149static 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
165static void spu_context_nospu_event(const struct marker *mdata, 162static 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
179struct spu_probe spu_probes[] = { 173struct 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);