blob: 12ac8a5d4d951f0320cefc2c5e174507d4c949ad [file] [log] [blame]
Tom Zanussi85f2b082013-10-24 08:59:24 -05001/*
2 * trace_events_trigger - trace event triggers
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 *
18 * Copyright (C) 2013 Tom Zanussi <tom.zanussi@linux.intel.com>
19 */
20
21#include <linux/module.h>
22#include <linux/ctype.h>
23#include <linux/mutex.h>
24#include <linux/slab.h>
25
26#include "trace.h"
27
28static LIST_HEAD(trigger_commands);
29static DEFINE_MUTEX(trigger_cmd_mutex);
30
Tom Zanussi2a2df322013-10-24 08:59:25 -050031static void
32trigger_data_free(struct event_trigger_data *data)
33{
Tom Zanussibac5fb92013-10-24 08:59:29 -050034 if (data->cmd_ops->set_filter)
35 data->cmd_ops->set_filter(NULL, data, NULL);
36
Tom Zanussi2a2df322013-10-24 08:59:25 -050037 synchronize_sched(); /* make sure current triggers exit before free */
38 kfree(data);
39}
40
Tom Zanussi85f2b082013-10-24 08:59:24 -050041/**
42 * event_triggers_call - Call triggers associated with a trace event
43 * @file: The ftrace_event_file associated with the event
Tom Zanussibac5fb92013-10-24 08:59:29 -050044 * @rec: The trace entry for the event, NULL for unconditional invocation
Tom Zanussi85f2b082013-10-24 08:59:24 -050045 *
46 * For each trigger associated with an event, invoke the trigger
Tom Zanussibac5fb92013-10-24 08:59:29 -050047 * function registered with the associated trigger command. If rec is
48 * non-NULL, it means that the trigger requires further processing and
49 * shouldn't be unconditionally invoked. If rec is non-NULL and the
50 * trigger has a filter associated with it, rec will checked against
51 * the filter and if the record matches the trigger will be invoked.
52 * If the trigger is a 'post_trigger', meaning it shouldn't be invoked
53 * in any case until the current event is written, the trigger
54 * function isn't invoked but the bit associated with the deferred
55 * trigger is set in the return value.
56 *
57 * Returns an enum event_trigger_type value containing a set bit for
58 * any trigger that should be deferred, ETT_NONE if nothing to defer.
Tom Zanussi85f2b082013-10-24 08:59:24 -050059 *
60 * Called from tracepoint handlers (with rcu_read_lock_sched() held).
61 *
62 * Return: an enum event_trigger_type value containing a set bit for
63 * any trigger that should be deferred, ETT_NONE if nothing to defer.
64 */
Tom Zanussibac5fb92013-10-24 08:59:29 -050065enum event_trigger_type
66event_triggers_call(struct ftrace_event_file *file, void *rec)
67{
68 struct event_trigger_data *data;
69 enum event_trigger_type tt = ETT_NONE;
70
71 if (list_empty(&file->triggers))
72 return tt;
73
74 list_for_each_entry_rcu(data, &file->triggers, list) {
75 if (!rec) {
76 data->ops->func(data);
77 continue;
78 }
79 if (data->filter && !filter_match_preds(data->filter, rec))
80 continue;
81 if (data->cmd_ops->post_trigger) {
82 tt |= data->cmd_ops->trigger_type;
83 continue;
84 }
85 data->ops->func(data);
86 }
87 return tt;
88}
89EXPORT_SYMBOL_GPL(event_triggers_call);
90
91/**
92 * event_triggers_post_call - Call 'post_triggers' for a trace event
93 * @file: The ftrace_event_file associated with the event
94 * @tt: enum event_trigger_type containing a set bit for each trigger to invoke
95 *
96 * For each trigger associated with an event, invoke the trigger
97 * function registered with the associated trigger command, if the
98 * corresponding bit is set in the tt enum passed into this function.
99 * See @event_triggers_call for details on how those bits are set.
100 *
101 * Called from tracepoint handlers (with rcu_read_lock_sched() held).
102 */
103void
104event_triggers_post_call(struct ftrace_event_file *file,
105 enum event_trigger_type tt)
Tom Zanussi85f2b082013-10-24 08:59:24 -0500106{
107 struct event_trigger_data *data;
108
Tom Zanussibac5fb92013-10-24 08:59:29 -0500109 list_for_each_entry_rcu(data, &file->triggers, list) {
110 if (data->cmd_ops->trigger_type & tt)
111 data->ops->func(data);
112 }
Tom Zanussi85f2b082013-10-24 08:59:24 -0500113}
Tom Zanussibac5fb92013-10-24 08:59:29 -0500114EXPORT_SYMBOL_GPL(event_triggers_post_call);
Tom Zanussi85f2b082013-10-24 08:59:24 -0500115
116static void *trigger_next(struct seq_file *m, void *t, loff_t *pos)
117{
118 struct ftrace_event_file *event_file = event_file_data(m->private);
119
120 return seq_list_next(t, &event_file->triggers, pos);
121}
122
123static void *trigger_start(struct seq_file *m, loff_t *pos)
124{
125 struct ftrace_event_file *event_file;
126
127 /* ->stop() is called even if ->start() fails */
128 mutex_lock(&event_mutex);
129 event_file = event_file_data(m->private);
130 if (unlikely(!event_file))
131 return ERR_PTR(-ENODEV);
132
133 return seq_list_start(&event_file->triggers, *pos);
134}
135
136static void trigger_stop(struct seq_file *m, void *t)
137{
138 mutex_unlock(&event_mutex);
139}
140
141static int trigger_show(struct seq_file *m, void *v)
142{
143 struct event_trigger_data *data;
144
145 data = list_entry(v, struct event_trigger_data, list);
146 data->ops->print(m, data->ops, data);
147
148 return 0;
149}
150
151static const struct seq_operations event_triggers_seq_ops = {
152 .start = trigger_start,
153 .next = trigger_next,
154 .stop = trigger_stop,
155 .show = trigger_show,
156};
157
158static int event_trigger_regex_open(struct inode *inode, struct file *file)
159{
160 int ret = 0;
161
162 mutex_lock(&event_mutex);
163
164 if (unlikely(!event_file_data(file))) {
165 mutex_unlock(&event_mutex);
166 return -ENODEV;
167 }
168
169 if (file->f_mode & FMODE_READ) {
170 ret = seq_open(file, &event_triggers_seq_ops);
171 if (!ret) {
172 struct seq_file *m = file->private_data;
173 m->private = file;
174 }
175 }
176
177 mutex_unlock(&event_mutex);
178
179 return ret;
180}
181
182static int trigger_process_regex(struct ftrace_event_file *file, char *buff)
183{
184 char *command, *next = buff;
185 struct event_command *p;
186 int ret = -EINVAL;
187
188 command = strsep(&next, ": \t");
189 command = (command[0] != '!') ? command : command + 1;
190
191 mutex_lock(&trigger_cmd_mutex);
192 list_for_each_entry(p, &trigger_commands, list) {
193 if (strcmp(p->name, command) == 0) {
194 ret = p->func(p, file, buff, command, next);
195 goto out_unlock;
196 }
197 }
198 out_unlock:
199 mutex_unlock(&trigger_cmd_mutex);
200
201 return ret;
202}
203
204static ssize_t event_trigger_regex_write(struct file *file,
205 const char __user *ubuf,
206 size_t cnt, loff_t *ppos)
207{
208 struct ftrace_event_file *event_file;
209 ssize_t ret;
210 char *buf;
211
212 if (!cnt)
213 return 0;
214
215 if (cnt >= PAGE_SIZE)
216 return -EINVAL;
217
218 buf = (char *)__get_free_page(GFP_TEMPORARY);
219 if (!buf)
220 return -ENOMEM;
221
222 if (copy_from_user(buf, ubuf, cnt)) {
223 free_page((unsigned long)buf);
224 return -EFAULT;
225 }
226 buf[cnt] = '\0';
227 strim(buf);
228
229 mutex_lock(&event_mutex);
230 event_file = event_file_data(file);
231 if (unlikely(!event_file)) {
232 mutex_unlock(&event_mutex);
233 free_page((unsigned long)buf);
234 return -ENODEV;
235 }
236 ret = trigger_process_regex(event_file, buf);
237 mutex_unlock(&event_mutex);
238
239 free_page((unsigned long)buf);
240 if (ret < 0)
241 goto out;
242
243 *ppos += cnt;
244 ret = cnt;
245 out:
246 return ret;
247}
248
249static int event_trigger_regex_release(struct inode *inode, struct file *file)
250{
251 mutex_lock(&event_mutex);
252
253 if (file->f_mode & FMODE_READ)
254 seq_release(inode, file);
255
256 mutex_unlock(&event_mutex);
257
258 return 0;
259}
260
261static ssize_t
262event_trigger_write(struct file *filp, const char __user *ubuf,
263 size_t cnt, loff_t *ppos)
264{
265 return event_trigger_regex_write(filp, ubuf, cnt, ppos);
266}
267
268static int
269event_trigger_open(struct inode *inode, struct file *filp)
270{
271 return event_trigger_regex_open(inode, filp);
272}
273
274static int
275event_trigger_release(struct inode *inode, struct file *file)
276{
277 return event_trigger_regex_release(inode, file);
278}
279
280const struct file_operations event_trigger_fops = {
281 .open = event_trigger_open,
282 .read = seq_read,
283 .write = event_trigger_write,
Steven Rostedt (Red Hat)098c8792013-12-21 17:39:40 -0500284 .llseek = tracing_lseek,
Tom Zanussi85f2b082013-10-24 08:59:24 -0500285 .release = event_trigger_release,
286};
287
Tom Zanussi2a2df322013-10-24 08:59:25 -0500288/*
289 * Currently we only register event commands from __init, so mark this
290 * __init too.
291 */
292static __init int register_event_command(struct event_command *cmd)
293{
294 struct event_command *p;
295 int ret = 0;
296
297 mutex_lock(&trigger_cmd_mutex);
298 list_for_each_entry(p, &trigger_commands, list) {
299 if (strcmp(cmd->name, p->name) == 0) {
300 ret = -EBUSY;
301 goto out_unlock;
302 }
303 }
304 list_add(&cmd->list, &trigger_commands);
305 out_unlock:
306 mutex_unlock(&trigger_cmd_mutex);
307
308 return ret;
309}
310
311/*
312 * Currently we only unregister event commands from __init, so mark
313 * this __init too.
314 */
315static __init int unregister_event_command(struct event_command *cmd)
316{
317 struct event_command *p, *n;
318 int ret = -ENODEV;
319
320 mutex_lock(&trigger_cmd_mutex);
321 list_for_each_entry_safe(p, n, &trigger_commands, list) {
322 if (strcmp(cmd->name, p->name) == 0) {
323 ret = 0;
324 list_del_init(&p->list);
325 goto out_unlock;
326 }
327 }
328 out_unlock:
329 mutex_unlock(&trigger_cmd_mutex);
330
331 return ret;
332}
333
334/**
335 * event_trigger_print - Generic event_trigger_ops @print implementation
336 * @name: The name of the event trigger
337 * @m: The seq_file being printed to
338 * @data: Trigger-specific data
339 * @filter_str: filter_str to print, if present
340 *
341 * Common implementation for event triggers to print themselves.
342 *
343 * Usually wrapped by a function that simply sets the @name of the
344 * trigger command and then invokes this.
345 *
346 * Return: 0 on success, errno otherwise
347 */
348static int
349event_trigger_print(const char *name, struct seq_file *m,
350 void *data, char *filter_str)
351{
352 long count = (long)data;
353
354 seq_printf(m, "%s", name);
355
356 if (count == -1)
357 seq_puts(m, ":unlimited");
358 else
359 seq_printf(m, ":count=%ld", count);
360
361 if (filter_str)
362 seq_printf(m, " if %s\n", filter_str);
363 else
364 seq_puts(m, "\n");
365
366 return 0;
367}
368
369/**
370 * event_trigger_init - Generic event_trigger_ops @init implementation
371 * @ops: The trigger ops associated with the trigger
372 * @data: Trigger-specific data
373 *
374 * Common implementation of event trigger initialization.
375 *
376 * Usually used directly as the @init method in event trigger
377 * implementations.
378 *
379 * Return: 0 on success, errno otherwise
380 */
381static int
382event_trigger_init(struct event_trigger_ops *ops,
383 struct event_trigger_data *data)
384{
385 data->ref++;
386 return 0;
387}
388
389/**
390 * event_trigger_free - Generic event_trigger_ops @free implementation
391 * @ops: The trigger ops associated with the trigger
392 * @data: Trigger-specific data
393 *
394 * Common implementation of event trigger de-initialization.
395 *
396 * Usually used directly as the @free method in event trigger
397 * implementations.
398 */
399static void
400event_trigger_free(struct event_trigger_ops *ops,
401 struct event_trigger_data *data)
402{
403 if (WARN_ON_ONCE(data->ref <= 0))
404 return;
405
406 data->ref--;
407 if (!data->ref)
408 trigger_data_free(data);
409}
410
Tom Zanussi85f2b082013-10-24 08:59:24 -0500411static int trace_event_trigger_enable_disable(struct ftrace_event_file *file,
412 int trigger_enable)
413{
414 int ret = 0;
415
416 if (trigger_enable) {
417 if (atomic_inc_return(&file->tm_ref) > 1)
418 return ret;
419 set_bit(FTRACE_EVENT_FL_TRIGGER_MODE_BIT, &file->flags);
420 ret = trace_event_enable_disable(file, 1, 1);
421 } else {
422 if (atomic_dec_return(&file->tm_ref) > 0)
423 return ret;
424 clear_bit(FTRACE_EVENT_FL_TRIGGER_MODE_BIT, &file->flags);
425 ret = trace_event_enable_disable(file, 0, 1);
426 }
427
428 return ret;
429}
430
431/**
432 * clear_event_triggers - Clear all triggers associated with a trace array
433 * @tr: The trace array to clear
434 *
435 * For each trigger, the triggering event has its tm_ref decremented
436 * via trace_event_trigger_enable_disable(), and any associated event
437 * (in the case of enable/disable_event triggers) will have its sm_ref
438 * decremented via free()->trace_event_enable_disable(). That
439 * combination effectively reverses the soft-mode/trigger state added
440 * by trigger registration.
441 *
442 * Must be called with event_mutex held.
443 */
444void
445clear_event_triggers(struct trace_array *tr)
446{
447 struct ftrace_event_file *file;
448
449 list_for_each_entry(file, &tr->events, list) {
450 struct event_trigger_data *data;
451 list_for_each_entry_rcu(data, &file->triggers, list) {
452 trace_event_trigger_enable_disable(file, 0);
453 if (data->ops->free)
454 data->ops->free(data->ops, data);
455 }
456 }
457}
458
Tom Zanussi2a2df322013-10-24 08:59:25 -0500459/**
Tom Zanussibac5fb92013-10-24 08:59:29 -0500460 * update_cond_flag - Set or reset the TRIGGER_COND bit
461 * @file: The ftrace_event_file associated with the event
462 *
463 * If an event has triggers and any of those triggers has a filter or
464 * a post_trigger, trigger invocation needs to be deferred until after
465 * the current event has logged its data, and the event should have
466 * its TRIGGER_COND bit set, otherwise the TRIGGER_COND bit should be
467 * cleared.
468 */
469static void update_cond_flag(struct ftrace_event_file *file)
470{
471 struct event_trigger_data *data;
472 bool set_cond = false;
473
474 list_for_each_entry_rcu(data, &file->triggers, list) {
475 if (data->filter || data->cmd_ops->post_trigger) {
476 set_cond = true;
477 break;
478 }
479 }
480
481 if (set_cond)
482 set_bit(FTRACE_EVENT_FL_TRIGGER_COND_BIT, &file->flags);
483 else
484 clear_bit(FTRACE_EVENT_FL_TRIGGER_COND_BIT, &file->flags);
485}
486
487/**
Tom Zanussi2a2df322013-10-24 08:59:25 -0500488 * register_trigger - Generic event_command @reg implementation
489 * @glob: The raw string used to register the trigger
490 * @ops: The trigger ops associated with the trigger
491 * @data: Trigger-specific data to associate with the trigger
492 * @file: The ftrace_event_file associated with the event
493 *
494 * Common implementation for event trigger registration.
495 *
496 * Usually used directly as the @reg method in event command
497 * implementations.
498 *
499 * Return: 0 on success, errno otherwise
500 */
501static int register_trigger(char *glob, struct event_trigger_ops *ops,
502 struct event_trigger_data *data,
503 struct ftrace_event_file *file)
504{
505 struct event_trigger_data *test;
506 int ret = 0;
507
508 list_for_each_entry_rcu(test, &file->triggers, list) {
509 if (test->cmd_ops->trigger_type == data->cmd_ops->trigger_type) {
510 ret = -EEXIST;
511 goto out;
512 }
513 }
514
515 if (data->ops->init) {
516 ret = data->ops->init(data->ops, data);
517 if (ret < 0)
518 goto out;
519 }
520
521 list_add_rcu(&data->list, &file->triggers);
522 ret++;
523
524 if (trace_event_trigger_enable_disable(file, 1) < 0) {
525 list_del_rcu(&data->list);
526 ret--;
527 }
Tom Zanussibac5fb92013-10-24 08:59:29 -0500528 update_cond_flag(file);
Tom Zanussi2a2df322013-10-24 08:59:25 -0500529out:
530 return ret;
531}
532
533/**
534 * unregister_trigger - Generic event_command @unreg implementation
535 * @glob: The raw string used to register the trigger
536 * @ops: The trigger ops associated with the trigger
537 * @test: Trigger-specific data used to find the trigger to remove
538 * @file: The ftrace_event_file associated with the event
539 *
540 * Common implementation for event trigger unregistration.
541 *
542 * Usually used directly as the @unreg method in event command
543 * implementations.
544 */
545static void unregister_trigger(char *glob, struct event_trigger_ops *ops,
546 struct event_trigger_data *test,
547 struct ftrace_event_file *file)
548{
549 struct event_trigger_data *data;
550 bool unregistered = false;
551
552 list_for_each_entry_rcu(data, &file->triggers, list) {
553 if (data->cmd_ops->trigger_type == test->cmd_ops->trigger_type) {
554 unregistered = true;
555 list_del_rcu(&data->list);
Tom Zanussibac5fb92013-10-24 08:59:29 -0500556 update_cond_flag(file);
Tom Zanussi2a2df322013-10-24 08:59:25 -0500557 trace_event_trigger_enable_disable(file, 0);
558 break;
559 }
560 }
561
562 if (unregistered && data->ops->free)
563 data->ops->free(data->ops, data);
564}
565
566/**
567 * event_trigger_callback - Generic event_command @func implementation
568 * @cmd_ops: The command ops, used for trigger registration
569 * @file: The ftrace_event_file associated with the event
570 * @glob: The raw string used to register the trigger
571 * @cmd: The cmd portion of the string used to register the trigger
572 * @param: The params portion of the string used to register the trigger
573 *
574 * Common implementation for event command parsing and trigger
575 * instantiation.
576 *
577 * Usually used directly as the @func method in event command
578 * implementations.
579 *
580 * Return: 0 on success, errno otherwise
581 */
582static int
583event_trigger_callback(struct event_command *cmd_ops,
584 struct ftrace_event_file *file,
585 char *glob, char *cmd, char *param)
586{
587 struct event_trigger_data *trigger_data;
588 struct event_trigger_ops *trigger_ops;
589 char *trigger = NULL;
590 char *number;
591 int ret;
592
593 /* separate the trigger from the filter (t:n [if filter]) */
594 if (param && isdigit(param[0]))
595 trigger = strsep(&param, " \t");
596
597 trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger);
598
599 ret = -ENOMEM;
600 trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL);
601 if (!trigger_data)
602 goto out;
603
604 trigger_data->count = -1;
605 trigger_data->ops = trigger_ops;
606 trigger_data->cmd_ops = cmd_ops;
607 INIT_LIST_HEAD(&trigger_data->list);
608
609 if (glob[0] == '!') {
610 cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
611 kfree(trigger_data);
612 ret = 0;
613 goto out;
614 }
615
616 if (trigger) {
617 number = strsep(&trigger, ":");
618
619 ret = -EINVAL;
620 if (!strlen(number))
621 goto out_free;
622
623 /*
624 * We use the callback data field (which is a pointer)
625 * as our counter.
626 */
627 ret = kstrtoul(number, 0, &trigger_data->count);
628 if (ret)
629 goto out_free;
630 }
631
632 if (!param) /* if param is non-empty, it's supposed to be a filter */
633 goto out_reg;
634
635 if (!cmd_ops->set_filter)
636 goto out_reg;
637
638 ret = cmd_ops->set_filter(param, trigger_data, file);
639 if (ret < 0)
640 goto out_free;
641
642 out_reg:
643 ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file);
644 /*
645 * The above returns on success the # of functions enabled,
646 * but if it didn't find any functions it returns zero.
647 * Consider no functions a failure too.
648 */
649 if (!ret) {
650 ret = -ENOENT;
651 goto out_free;
652 } else if (ret < 0)
653 goto out_free;
654 ret = 0;
655 out:
656 return ret;
657
658 out_free:
Tom Zanussibac5fb92013-10-24 08:59:29 -0500659 if (cmd_ops->set_filter)
660 cmd_ops->set_filter(NULL, trigger_data, NULL);
Tom Zanussi2a2df322013-10-24 08:59:25 -0500661 kfree(trigger_data);
662 goto out;
663}
664
Tom Zanussibac5fb92013-10-24 08:59:29 -0500665/**
666 * set_trigger_filter - Generic event_command @set_filter implementation
667 * @filter_str: The filter string for the trigger, NULL to remove filter
668 * @trigger_data: Trigger-specific data
669 * @file: The ftrace_event_file associated with the event
670 *
671 * Common implementation for event command filter parsing and filter
672 * instantiation.
673 *
674 * Usually used directly as the @set_filter method in event command
675 * implementations.
676 *
677 * Also used to remove a filter (if filter_str = NULL).
678 *
679 * Return: 0 on success, errno otherwise
680 */
681static int set_trigger_filter(char *filter_str,
682 struct event_trigger_data *trigger_data,
683 struct ftrace_event_file *file)
684{
685 struct event_trigger_data *data = trigger_data;
686 struct event_filter *filter = NULL, *tmp;
687 int ret = -EINVAL;
688 char *s;
689
690 if (!filter_str) /* clear the current filter */
691 goto assign;
692
693 s = strsep(&filter_str, " \t");
694
695 if (!strlen(s) || strcmp(s, "if") != 0)
696 goto out;
697
698 if (!filter_str)
699 goto out;
700
701 /* The filter is for the 'trigger' event, not the triggered event */
702 ret = create_event_filter(file->event_call, filter_str, false, &filter);
703 if (ret)
704 goto out;
705 assign:
706 tmp = data->filter;
707
708 rcu_assign_pointer(data->filter, filter);
709
710 if (tmp) {
711 /* Make sure the call is done with the filter */
712 synchronize_sched();
713 free_event_filter(tmp);
714 }
715
716 kfree(data->filter_str);
717 data->filter_str = NULL;
718
719 if (filter_str) {
720 data->filter_str = kstrdup(filter_str, GFP_KERNEL);
721 if (!data->filter_str) {
722 free_event_filter(data->filter);
723 data->filter = NULL;
724 ret = -ENOMEM;
725 }
726 }
727 out:
728 return ret;
729}
730
Tom Zanussi2a2df322013-10-24 08:59:25 -0500731static void
732traceon_trigger(struct event_trigger_data *data)
733{
734 if (tracing_is_on())
735 return;
736
737 tracing_on();
738}
739
740static void
741traceon_count_trigger(struct event_trigger_data *data)
742{
743 if (!data->count)
744 return;
745
746 if (data->count != -1)
747 (data->count)--;
748
749 traceon_trigger(data);
750}
751
752static void
753traceoff_trigger(struct event_trigger_data *data)
754{
755 if (!tracing_is_on())
756 return;
757
758 tracing_off();
759}
760
761static void
762traceoff_count_trigger(struct event_trigger_data *data)
763{
764 if (!data->count)
765 return;
766
767 if (data->count != -1)
768 (data->count)--;
769
770 traceoff_trigger(data);
771}
772
773static int
774traceon_trigger_print(struct seq_file *m, struct event_trigger_ops *ops,
775 struct event_trigger_data *data)
776{
777 return event_trigger_print("traceon", m, (void *)data->count,
778 data->filter_str);
779}
780
781static int
782traceoff_trigger_print(struct seq_file *m, struct event_trigger_ops *ops,
783 struct event_trigger_data *data)
784{
785 return event_trigger_print("traceoff", m, (void *)data->count,
786 data->filter_str);
787}
788
789static struct event_trigger_ops traceon_trigger_ops = {
790 .func = traceon_trigger,
791 .print = traceon_trigger_print,
792 .init = event_trigger_init,
793 .free = event_trigger_free,
794};
795
796static struct event_trigger_ops traceon_count_trigger_ops = {
797 .func = traceon_count_trigger,
798 .print = traceon_trigger_print,
799 .init = event_trigger_init,
800 .free = event_trigger_free,
801};
802
803static struct event_trigger_ops traceoff_trigger_ops = {
804 .func = traceoff_trigger,
805 .print = traceoff_trigger_print,
806 .init = event_trigger_init,
807 .free = event_trigger_free,
808};
809
810static struct event_trigger_ops traceoff_count_trigger_ops = {
811 .func = traceoff_count_trigger,
812 .print = traceoff_trigger_print,
813 .init = event_trigger_init,
814 .free = event_trigger_free,
815};
816
817static struct event_trigger_ops *
818onoff_get_trigger_ops(char *cmd, char *param)
819{
820 struct event_trigger_ops *ops;
821
822 /* we register both traceon and traceoff to this callback */
823 if (strcmp(cmd, "traceon") == 0)
824 ops = param ? &traceon_count_trigger_ops :
825 &traceon_trigger_ops;
826 else
827 ops = param ? &traceoff_count_trigger_ops :
828 &traceoff_trigger_ops;
829
830 return ops;
831}
832
833static struct event_command trigger_traceon_cmd = {
834 .name = "traceon",
835 .trigger_type = ETT_TRACE_ONOFF,
836 .func = event_trigger_callback,
837 .reg = register_trigger,
838 .unreg = unregister_trigger,
839 .get_trigger_ops = onoff_get_trigger_ops,
Tom Zanussibac5fb92013-10-24 08:59:29 -0500840 .set_filter = set_trigger_filter,
Tom Zanussi2a2df322013-10-24 08:59:25 -0500841};
842
843static struct event_command trigger_traceoff_cmd = {
844 .name = "traceoff",
845 .trigger_type = ETT_TRACE_ONOFF,
846 .func = event_trigger_callback,
847 .reg = register_trigger,
848 .unreg = unregister_trigger,
849 .get_trigger_ops = onoff_get_trigger_ops,
Tom Zanussibac5fb92013-10-24 08:59:29 -0500850 .set_filter = set_trigger_filter,
Tom Zanussi2a2df322013-10-24 08:59:25 -0500851};
852
Tom Zanussi93e31ff2013-10-24 08:59:26 -0500853#ifdef CONFIG_TRACER_SNAPSHOT
854static void
855snapshot_trigger(struct event_trigger_data *data)
856{
857 tracing_snapshot();
858}
859
860static void
861snapshot_count_trigger(struct event_trigger_data *data)
862{
863 if (!data->count)
864 return;
865
866 if (data->count != -1)
867 (data->count)--;
868
869 snapshot_trigger(data);
870}
871
872static int
873register_snapshot_trigger(char *glob, struct event_trigger_ops *ops,
874 struct event_trigger_data *data,
875 struct ftrace_event_file *file)
876{
877 int ret = register_trigger(glob, ops, data, file);
878
879 if (ret > 0 && tracing_alloc_snapshot() != 0) {
880 unregister_trigger(glob, ops, data, file);
881 ret = 0;
882 }
883
884 return ret;
885}
886
887static int
888snapshot_trigger_print(struct seq_file *m, struct event_trigger_ops *ops,
889 struct event_trigger_data *data)
890{
891 return event_trigger_print("snapshot", m, (void *)data->count,
892 data->filter_str);
893}
894
895static struct event_trigger_ops snapshot_trigger_ops = {
896 .func = snapshot_trigger,
897 .print = snapshot_trigger_print,
898 .init = event_trigger_init,
899 .free = event_trigger_free,
900};
901
902static struct event_trigger_ops snapshot_count_trigger_ops = {
903 .func = snapshot_count_trigger,
904 .print = snapshot_trigger_print,
905 .init = event_trigger_init,
906 .free = event_trigger_free,
907};
908
909static struct event_trigger_ops *
910snapshot_get_trigger_ops(char *cmd, char *param)
911{
912 return param ? &snapshot_count_trigger_ops : &snapshot_trigger_ops;
913}
914
915static struct event_command trigger_snapshot_cmd = {
916 .name = "snapshot",
917 .trigger_type = ETT_SNAPSHOT,
918 .func = event_trigger_callback,
919 .reg = register_snapshot_trigger,
920 .unreg = unregister_trigger,
921 .get_trigger_ops = snapshot_get_trigger_ops,
Tom Zanussibac5fb92013-10-24 08:59:29 -0500922 .set_filter = set_trigger_filter,
Tom Zanussi93e31ff2013-10-24 08:59:26 -0500923};
924
925static __init int register_trigger_snapshot_cmd(void)
926{
927 int ret;
928
929 ret = register_event_command(&trigger_snapshot_cmd);
930 WARN_ON(ret < 0);
931
932 return ret;
933}
934#else
935static __init int register_trigger_snapshot_cmd(void) { return 0; }
936#endif /* CONFIG_TRACER_SNAPSHOT */
937
Tom Zanussif21ecbb2013-10-24 08:59:27 -0500938#ifdef CONFIG_STACKTRACE
939/*
940 * Skip 3:
941 * stacktrace_trigger()
942 * event_triggers_post_call()
943 * ftrace_raw_event_xxx()
944 */
945#define STACK_SKIP 3
946
947static void
948stacktrace_trigger(struct event_trigger_data *data)
949{
950 trace_dump_stack(STACK_SKIP);
951}
952
953static void
954stacktrace_count_trigger(struct event_trigger_data *data)
955{
956 if (!data->count)
957 return;
958
959 if (data->count != -1)
960 (data->count)--;
961
962 stacktrace_trigger(data);
963}
964
965static int
966stacktrace_trigger_print(struct seq_file *m, struct event_trigger_ops *ops,
967 struct event_trigger_data *data)
968{
969 return event_trigger_print("stacktrace", m, (void *)data->count,
970 data->filter_str);
971}
972
973static struct event_trigger_ops stacktrace_trigger_ops = {
974 .func = stacktrace_trigger,
975 .print = stacktrace_trigger_print,
976 .init = event_trigger_init,
977 .free = event_trigger_free,
978};
979
980static struct event_trigger_ops stacktrace_count_trigger_ops = {
981 .func = stacktrace_count_trigger,
982 .print = stacktrace_trigger_print,
983 .init = event_trigger_init,
984 .free = event_trigger_free,
985};
986
987static struct event_trigger_ops *
988stacktrace_get_trigger_ops(char *cmd, char *param)
989{
990 return param ? &stacktrace_count_trigger_ops : &stacktrace_trigger_ops;
991}
992
993static struct event_command trigger_stacktrace_cmd = {
994 .name = "stacktrace",
995 .trigger_type = ETT_STACKTRACE,
996 .post_trigger = true,
997 .func = event_trigger_callback,
998 .reg = register_trigger,
999 .unreg = unregister_trigger,
1000 .get_trigger_ops = stacktrace_get_trigger_ops,
Tom Zanussibac5fb92013-10-24 08:59:29 -05001001 .set_filter = set_trigger_filter,
Tom Zanussif21ecbb2013-10-24 08:59:27 -05001002};
1003
1004static __init int register_trigger_stacktrace_cmd(void)
1005{
1006 int ret;
1007
1008 ret = register_event_command(&trigger_stacktrace_cmd);
1009 WARN_ON(ret < 0);
1010
1011 return ret;
1012}
1013#else
1014static __init int register_trigger_stacktrace_cmd(void) { return 0; }
1015#endif /* CONFIG_STACKTRACE */
1016
Tom Zanussi2a2df322013-10-24 08:59:25 -05001017static __init void unregister_trigger_traceon_traceoff_cmds(void)
1018{
1019 unregister_event_command(&trigger_traceon_cmd);
1020 unregister_event_command(&trigger_traceoff_cmd);
1021}
1022
Tom Zanussi7862ad12013-10-24 08:59:28 -05001023/* Avoid typos */
1024#define ENABLE_EVENT_STR "enable_event"
1025#define DISABLE_EVENT_STR "disable_event"
1026
1027struct enable_trigger_data {
1028 struct ftrace_event_file *file;
1029 bool enable;
1030};
1031
1032static void
1033event_enable_trigger(struct event_trigger_data *data)
1034{
1035 struct enable_trigger_data *enable_data = data->private_data;
1036
1037 if (enable_data->enable)
1038 clear_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, &enable_data->file->flags);
1039 else
1040 set_bit(FTRACE_EVENT_FL_SOFT_DISABLED_BIT, &enable_data->file->flags);
1041}
1042
1043static void
1044event_enable_count_trigger(struct event_trigger_data *data)
1045{
1046 struct enable_trigger_data *enable_data = data->private_data;
1047
1048 if (!data->count)
1049 return;
1050
1051 /* Skip if the event is in a state we want to switch to */
1052 if (enable_data->enable == !(enable_data->file->flags & FTRACE_EVENT_FL_SOFT_DISABLED))
1053 return;
1054
1055 if (data->count != -1)
1056 (data->count)--;
1057
1058 event_enable_trigger(data);
1059}
1060
1061static int
1062event_enable_trigger_print(struct seq_file *m, struct event_trigger_ops *ops,
1063 struct event_trigger_data *data)
1064{
1065 struct enable_trigger_data *enable_data = data->private_data;
1066
1067 seq_printf(m, "%s:%s:%s",
1068 enable_data->enable ? ENABLE_EVENT_STR : DISABLE_EVENT_STR,
1069 enable_data->file->event_call->class->system,
1070 enable_data->file->event_call->name);
1071
1072 if (data->count == -1)
1073 seq_puts(m, ":unlimited");
1074 else
1075 seq_printf(m, ":count=%ld", data->count);
1076
1077 if (data->filter_str)
1078 seq_printf(m, " if %s\n", data->filter_str);
1079 else
1080 seq_puts(m, "\n");
1081
1082 return 0;
1083}
1084
1085static void
1086event_enable_trigger_free(struct event_trigger_ops *ops,
1087 struct event_trigger_data *data)
1088{
1089 struct enable_trigger_data *enable_data = data->private_data;
1090
1091 if (WARN_ON_ONCE(data->ref <= 0))
1092 return;
1093
1094 data->ref--;
1095 if (!data->ref) {
1096 /* Remove the SOFT_MODE flag */
1097 trace_event_enable_disable(enable_data->file, 0, 1);
1098 module_put(enable_data->file->event_call->mod);
1099 trigger_data_free(data);
1100 kfree(enable_data);
1101 }
1102}
1103
1104static struct event_trigger_ops event_enable_trigger_ops = {
1105 .func = event_enable_trigger,
1106 .print = event_enable_trigger_print,
1107 .init = event_trigger_init,
1108 .free = event_enable_trigger_free,
1109};
1110
1111static struct event_trigger_ops event_enable_count_trigger_ops = {
1112 .func = event_enable_count_trigger,
1113 .print = event_enable_trigger_print,
1114 .init = event_trigger_init,
1115 .free = event_enable_trigger_free,
1116};
1117
1118static struct event_trigger_ops event_disable_trigger_ops = {
1119 .func = event_enable_trigger,
1120 .print = event_enable_trigger_print,
1121 .init = event_trigger_init,
1122 .free = event_enable_trigger_free,
1123};
1124
1125static struct event_trigger_ops event_disable_count_trigger_ops = {
1126 .func = event_enable_count_trigger,
1127 .print = event_enable_trigger_print,
1128 .init = event_trigger_init,
1129 .free = event_enable_trigger_free,
1130};
1131
1132static int
1133event_enable_trigger_func(struct event_command *cmd_ops,
1134 struct ftrace_event_file *file,
1135 char *glob, char *cmd, char *param)
1136{
1137 struct ftrace_event_file *event_enable_file;
1138 struct enable_trigger_data *enable_data;
1139 struct event_trigger_data *trigger_data;
1140 struct event_trigger_ops *trigger_ops;
1141 struct trace_array *tr = file->tr;
1142 const char *system;
1143 const char *event;
1144 char *trigger;
1145 char *number;
1146 bool enable;
1147 int ret;
1148
1149 if (!param)
1150 return -EINVAL;
1151
1152 /* separate the trigger from the filter (s:e:n [if filter]) */
1153 trigger = strsep(&param, " \t");
1154 if (!trigger)
1155 return -EINVAL;
1156
1157 system = strsep(&trigger, ":");
1158 if (!trigger)
1159 return -EINVAL;
1160
1161 event = strsep(&trigger, ":");
1162
1163 ret = -EINVAL;
1164 event_enable_file = find_event_file(tr, system, event);
1165 if (!event_enable_file)
1166 goto out;
1167
1168 enable = strcmp(cmd, ENABLE_EVENT_STR) == 0;
1169
1170 trigger_ops = cmd_ops->get_trigger_ops(cmd, trigger);
1171
1172 ret = -ENOMEM;
1173 trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL);
1174 if (!trigger_data)
1175 goto out;
1176
1177 enable_data = kzalloc(sizeof(*enable_data), GFP_KERNEL);
1178 if (!enable_data) {
1179 kfree(trigger_data);
1180 goto out;
1181 }
1182
1183 trigger_data->count = -1;
1184 trigger_data->ops = trigger_ops;
1185 trigger_data->cmd_ops = cmd_ops;
1186 INIT_LIST_HEAD(&trigger_data->list);
1187 RCU_INIT_POINTER(trigger_data->filter, NULL);
1188
1189 enable_data->enable = enable;
1190 enable_data->file = event_enable_file;
1191 trigger_data->private_data = enable_data;
1192
1193 if (glob[0] == '!') {
1194 cmd_ops->unreg(glob+1, trigger_ops, trigger_data, file);
1195 kfree(trigger_data);
1196 kfree(enable_data);
1197 ret = 0;
1198 goto out;
1199 }
1200
1201 if (trigger) {
1202 number = strsep(&trigger, ":");
1203
1204 ret = -EINVAL;
1205 if (!strlen(number))
1206 goto out_free;
1207
1208 /*
1209 * We use the callback data field (which is a pointer)
1210 * as our counter.
1211 */
1212 ret = kstrtoul(number, 0, &trigger_data->count);
1213 if (ret)
1214 goto out_free;
1215 }
1216
1217 if (!param) /* if param is non-empty, it's supposed to be a filter */
1218 goto out_reg;
1219
1220 if (!cmd_ops->set_filter)
1221 goto out_reg;
1222
1223 ret = cmd_ops->set_filter(param, trigger_data, file);
1224 if (ret < 0)
1225 goto out_free;
1226
1227 out_reg:
1228 /* Don't let event modules unload while probe registered */
1229 ret = try_module_get(event_enable_file->event_call->mod);
1230 if (!ret) {
1231 ret = -EBUSY;
1232 goto out_free;
1233 }
1234
1235 ret = trace_event_enable_disable(event_enable_file, 1, 1);
1236 if (ret < 0)
1237 goto out_put;
1238 ret = cmd_ops->reg(glob, trigger_ops, trigger_data, file);
1239 /*
1240 * The above returns on success the # of functions enabled,
1241 * but if it didn't find any functions it returns zero.
1242 * Consider no functions a failure too.
1243 */
1244 if (!ret) {
1245 ret = -ENOENT;
1246 goto out_disable;
1247 } else if (ret < 0)
1248 goto out_disable;
1249 /* Just return zero, not the number of enabled functions */
1250 ret = 0;
1251 out:
1252 return ret;
1253
1254 out_disable:
1255 trace_event_enable_disable(event_enable_file, 0, 1);
1256 out_put:
1257 module_put(event_enable_file->event_call->mod);
1258 out_free:
Tom Zanussibac5fb92013-10-24 08:59:29 -05001259 if (cmd_ops->set_filter)
1260 cmd_ops->set_filter(NULL, trigger_data, NULL);
Tom Zanussi7862ad12013-10-24 08:59:28 -05001261 kfree(trigger_data);
1262 kfree(enable_data);
1263 goto out;
1264}
1265
1266static int event_enable_register_trigger(char *glob,
1267 struct event_trigger_ops *ops,
1268 struct event_trigger_data *data,
1269 struct ftrace_event_file *file)
1270{
1271 struct enable_trigger_data *enable_data = data->private_data;
1272 struct enable_trigger_data *test_enable_data;
1273 struct event_trigger_data *test;
1274 int ret = 0;
1275
1276 list_for_each_entry_rcu(test, &file->triggers, list) {
1277 test_enable_data = test->private_data;
1278 if (test_enable_data &&
1279 (test_enable_data->file == enable_data->file)) {
1280 ret = -EEXIST;
1281 goto out;
1282 }
1283 }
1284
1285 if (data->ops->init) {
1286 ret = data->ops->init(data->ops, data);
1287 if (ret < 0)
1288 goto out;
1289 }
1290
1291 list_add_rcu(&data->list, &file->triggers);
1292 ret++;
1293
1294 if (trace_event_trigger_enable_disable(file, 1) < 0) {
1295 list_del_rcu(&data->list);
1296 ret--;
1297 }
Tom Zanussibac5fb92013-10-24 08:59:29 -05001298 update_cond_flag(file);
Tom Zanussi7862ad12013-10-24 08:59:28 -05001299out:
1300 return ret;
1301}
1302
1303static void event_enable_unregister_trigger(char *glob,
1304 struct event_trigger_ops *ops,
1305 struct event_trigger_data *test,
1306 struct ftrace_event_file *file)
1307{
1308 struct enable_trigger_data *test_enable_data = test->private_data;
1309 struct enable_trigger_data *enable_data;
1310 struct event_trigger_data *data;
1311 bool unregistered = false;
1312
1313 list_for_each_entry_rcu(data, &file->triggers, list) {
1314 enable_data = data->private_data;
1315 if (enable_data &&
1316 (enable_data->file == test_enable_data->file)) {
1317 unregistered = true;
1318 list_del_rcu(&data->list);
Tom Zanussibac5fb92013-10-24 08:59:29 -05001319 update_cond_flag(file);
Tom Zanussi7862ad12013-10-24 08:59:28 -05001320 trace_event_trigger_enable_disable(file, 0);
1321 break;
1322 }
1323 }
1324
1325 if (unregistered && data->ops->free)
1326 data->ops->free(data->ops, data);
1327}
1328
1329static struct event_trigger_ops *
1330event_enable_get_trigger_ops(char *cmd, char *param)
1331{
1332 struct event_trigger_ops *ops;
1333 bool enable;
1334
1335 enable = strcmp(cmd, ENABLE_EVENT_STR) == 0;
1336
1337 if (enable)
1338 ops = param ? &event_enable_count_trigger_ops :
1339 &event_enable_trigger_ops;
1340 else
1341 ops = param ? &event_disable_count_trigger_ops :
1342 &event_disable_trigger_ops;
1343
1344 return ops;
1345}
1346
1347static struct event_command trigger_enable_cmd = {
1348 .name = ENABLE_EVENT_STR,
1349 .trigger_type = ETT_EVENT_ENABLE,
1350 .func = event_enable_trigger_func,
1351 .reg = event_enable_register_trigger,
1352 .unreg = event_enable_unregister_trigger,
1353 .get_trigger_ops = event_enable_get_trigger_ops,
Tom Zanussibac5fb92013-10-24 08:59:29 -05001354 .set_filter = set_trigger_filter,
Tom Zanussi7862ad12013-10-24 08:59:28 -05001355};
1356
1357static struct event_command trigger_disable_cmd = {
1358 .name = DISABLE_EVENT_STR,
1359 .trigger_type = ETT_EVENT_ENABLE,
1360 .func = event_enable_trigger_func,
1361 .reg = event_enable_register_trigger,
1362 .unreg = event_enable_unregister_trigger,
1363 .get_trigger_ops = event_enable_get_trigger_ops,
Tom Zanussibac5fb92013-10-24 08:59:29 -05001364 .set_filter = set_trigger_filter,
Tom Zanussi7862ad12013-10-24 08:59:28 -05001365};
1366
1367static __init void unregister_trigger_enable_disable_cmds(void)
1368{
1369 unregister_event_command(&trigger_enable_cmd);
1370 unregister_event_command(&trigger_disable_cmd);
1371}
1372
1373static __init int register_trigger_enable_disable_cmds(void)
1374{
1375 int ret;
1376
1377 ret = register_event_command(&trigger_enable_cmd);
1378 if (WARN_ON(ret < 0))
1379 return ret;
1380 ret = register_event_command(&trigger_disable_cmd);
1381 if (WARN_ON(ret < 0))
1382 unregister_trigger_enable_disable_cmds();
1383
1384 return ret;
1385}
1386
Tom Zanussi2a2df322013-10-24 08:59:25 -05001387static __init int register_trigger_traceon_traceoff_cmds(void)
1388{
1389 int ret;
1390
1391 ret = register_event_command(&trigger_traceon_cmd);
1392 if (WARN_ON(ret < 0))
1393 return ret;
1394 ret = register_event_command(&trigger_traceoff_cmd);
1395 if (WARN_ON(ret < 0))
1396 unregister_trigger_traceon_traceoff_cmds();
1397
1398 return ret;
1399}
1400
Tom Zanussi85f2b082013-10-24 08:59:24 -05001401__init int register_trigger_cmds(void)
1402{
Tom Zanussi2a2df322013-10-24 08:59:25 -05001403 register_trigger_traceon_traceoff_cmds();
Tom Zanussi93e31ff2013-10-24 08:59:26 -05001404 register_trigger_snapshot_cmd();
Tom Zanussif21ecbb2013-10-24 08:59:27 -05001405 register_trigger_stacktrace_cmd();
Tom Zanussi7862ad12013-10-24 08:59:28 -05001406 register_trigger_enable_disable_cmds();
Tom Zanussi2a2df322013-10-24 08:59:25 -05001407
Tom Zanussi85f2b082013-10-24 08:59:24 -05001408 return 0;
1409}