0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/security.h>
0009 #include <linux/module.h>
0010 #include <linux/ctype.h>
0011 #include <linux/mutex.h>
0012 #include <linux/slab.h>
0013 #include <linux/rculist.h>
0014
0015 #include "trace.h"
0016
0017 static LIST_HEAD(trigger_commands);
0018 static DEFINE_MUTEX(trigger_cmd_mutex);
0019
0020 void trigger_data_free(struct event_trigger_data *data)
0021 {
0022 if (data->cmd_ops->set_filter)
0023 data->cmd_ops->set_filter(NULL, data, NULL);
0024
0025
0026 tracepoint_synchronize_unregister();
0027
0028 kfree(data);
0029 }
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 enum event_trigger_type
0056 event_triggers_call(struct trace_event_file *file,
0057 struct trace_buffer *buffer, void *rec,
0058 struct ring_buffer_event *event)
0059 {
0060 struct event_trigger_data *data;
0061 enum event_trigger_type tt = ETT_NONE;
0062 struct event_filter *filter;
0063
0064 if (list_empty(&file->triggers))
0065 return tt;
0066
0067 list_for_each_entry_rcu(data, &file->triggers, list) {
0068 if (data->paused)
0069 continue;
0070 if (!rec) {
0071 data->ops->trigger(data, buffer, rec, event);
0072 continue;
0073 }
0074 filter = rcu_dereference_sched(data->filter);
0075 if (filter && !filter_match_preds(filter, rec))
0076 continue;
0077 if (event_command_post_trigger(data->cmd_ops)) {
0078 tt |= data->cmd_ops->trigger_type;
0079 continue;
0080 }
0081 data->ops->trigger(data, buffer, rec, event);
0082 }
0083 return tt;
0084 }
0085 EXPORT_SYMBOL_GPL(event_triggers_call);
0086
0087 bool __trace_trigger_soft_disabled(struct trace_event_file *file)
0088 {
0089 unsigned long eflags = file->flags;
0090
0091 if (eflags & EVENT_FILE_FL_TRIGGER_MODE)
0092 event_triggers_call(file, NULL, NULL, NULL);
0093 if (eflags & EVENT_FILE_FL_SOFT_DISABLED)
0094 return true;
0095 if (eflags & EVENT_FILE_FL_PID_FILTER)
0096 return trace_event_ignore_this_pid(file);
0097 return false;
0098 }
0099 EXPORT_SYMBOL_GPL(__trace_trigger_soft_disabled);
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113 void
0114 event_triggers_post_call(struct trace_event_file *file,
0115 enum event_trigger_type tt)
0116 {
0117 struct event_trigger_data *data;
0118
0119 list_for_each_entry_rcu(data, &file->triggers, list) {
0120 if (data->paused)
0121 continue;
0122 if (data->cmd_ops->trigger_type & tt)
0123 data->ops->trigger(data, NULL, NULL, NULL);
0124 }
0125 }
0126 EXPORT_SYMBOL_GPL(event_triggers_post_call);
0127
0128 #define SHOW_AVAILABLE_TRIGGERS (void *)(1UL)
0129
0130 static void *trigger_next(struct seq_file *m, void *t, loff_t *pos)
0131 {
0132 struct trace_event_file *event_file = event_file_data(m->private);
0133
0134 if (t == SHOW_AVAILABLE_TRIGGERS) {
0135 (*pos)++;
0136 return NULL;
0137 }
0138 return seq_list_next(t, &event_file->triggers, pos);
0139 }
0140
0141 static bool check_user_trigger(struct trace_event_file *file)
0142 {
0143 struct event_trigger_data *data;
0144
0145 list_for_each_entry_rcu(data, &file->triggers, list,
0146 lockdep_is_held(&event_mutex)) {
0147 if (data->flags & EVENT_TRIGGER_FL_PROBE)
0148 continue;
0149 return true;
0150 }
0151 return false;
0152 }
0153
0154 static void *trigger_start(struct seq_file *m, loff_t *pos)
0155 {
0156 struct trace_event_file *event_file;
0157
0158
0159 mutex_lock(&event_mutex);
0160 event_file = event_file_data(m->private);
0161 if (unlikely(!event_file))
0162 return ERR_PTR(-ENODEV);
0163
0164 if (list_empty(&event_file->triggers) || !check_user_trigger(event_file))
0165 return *pos == 0 ? SHOW_AVAILABLE_TRIGGERS : NULL;
0166
0167 return seq_list_start(&event_file->triggers, *pos);
0168 }
0169
0170 static void trigger_stop(struct seq_file *m, void *t)
0171 {
0172 mutex_unlock(&event_mutex);
0173 }
0174
0175 static int trigger_show(struct seq_file *m, void *v)
0176 {
0177 struct event_trigger_data *data;
0178 struct event_command *p;
0179
0180 if (v == SHOW_AVAILABLE_TRIGGERS) {
0181 seq_puts(m, "# Available triggers:\n");
0182 seq_putc(m, '#');
0183 mutex_lock(&trigger_cmd_mutex);
0184 list_for_each_entry_reverse(p, &trigger_commands, list)
0185 seq_printf(m, " %s", p->name);
0186 seq_putc(m, '\n');
0187 mutex_unlock(&trigger_cmd_mutex);
0188 return 0;
0189 }
0190
0191 data = list_entry(v, struct event_trigger_data, list);
0192 data->ops->print(m, data);
0193
0194 return 0;
0195 }
0196
0197 static const struct seq_operations event_triggers_seq_ops = {
0198 .start = trigger_start,
0199 .next = trigger_next,
0200 .stop = trigger_stop,
0201 .show = trigger_show,
0202 };
0203
0204 static int event_trigger_regex_open(struct inode *inode, struct file *file)
0205 {
0206 int ret;
0207
0208 ret = security_locked_down(LOCKDOWN_TRACEFS);
0209 if (ret)
0210 return ret;
0211
0212 mutex_lock(&event_mutex);
0213
0214 if (unlikely(!event_file_data(file))) {
0215 mutex_unlock(&event_mutex);
0216 return -ENODEV;
0217 }
0218
0219 if ((file->f_mode & FMODE_WRITE) &&
0220 (file->f_flags & O_TRUNC)) {
0221 struct trace_event_file *event_file;
0222 struct event_command *p;
0223
0224 event_file = event_file_data(file);
0225
0226 list_for_each_entry(p, &trigger_commands, list) {
0227 if (p->unreg_all)
0228 p->unreg_all(event_file);
0229 }
0230 }
0231
0232 if (file->f_mode & FMODE_READ) {
0233 ret = seq_open(file, &event_triggers_seq_ops);
0234 if (!ret) {
0235 struct seq_file *m = file->private_data;
0236 m->private = file;
0237 }
0238 }
0239
0240 mutex_unlock(&event_mutex);
0241
0242 return ret;
0243 }
0244
0245 int trigger_process_regex(struct trace_event_file *file, char *buff)
0246 {
0247 char *command, *next;
0248 struct event_command *p;
0249 int ret = -EINVAL;
0250
0251 next = buff = skip_spaces(buff);
0252 command = strsep(&next, ": \t");
0253 if (next) {
0254 next = skip_spaces(next);
0255 if (!*next)
0256 next = NULL;
0257 }
0258 command = (command[0] != '!') ? command : command + 1;
0259
0260 mutex_lock(&trigger_cmd_mutex);
0261 list_for_each_entry(p, &trigger_commands, list) {
0262 if (strcmp(p->name, command) == 0) {
0263 ret = p->parse(p, file, buff, command, next);
0264 goto out_unlock;
0265 }
0266 }
0267 out_unlock:
0268 mutex_unlock(&trigger_cmd_mutex);
0269
0270 return ret;
0271 }
0272
0273 static ssize_t event_trigger_regex_write(struct file *file,
0274 const char __user *ubuf,
0275 size_t cnt, loff_t *ppos)
0276 {
0277 struct trace_event_file *event_file;
0278 ssize_t ret;
0279 char *buf;
0280
0281 if (!cnt)
0282 return 0;
0283
0284 if (cnt >= PAGE_SIZE)
0285 return -EINVAL;
0286
0287 buf = memdup_user_nul(ubuf, cnt);
0288 if (IS_ERR(buf))
0289 return PTR_ERR(buf);
0290
0291 strim(buf);
0292
0293 mutex_lock(&event_mutex);
0294 event_file = event_file_data(file);
0295 if (unlikely(!event_file)) {
0296 mutex_unlock(&event_mutex);
0297 kfree(buf);
0298 return -ENODEV;
0299 }
0300 ret = trigger_process_regex(event_file, buf);
0301 mutex_unlock(&event_mutex);
0302
0303 kfree(buf);
0304 if (ret < 0)
0305 goto out;
0306
0307 *ppos += cnt;
0308 ret = cnt;
0309 out:
0310 return ret;
0311 }
0312
0313 static int event_trigger_regex_release(struct inode *inode, struct file *file)
0314 {
0315 mutex_lock(&event_mutex);
0316
0317 if (file->f_mode & FMODE_READ)
0318 seq_release(inode, file);
0319
0320 mutex_unlock(&event_mutex);
0321
0322 return 0;
0323 }
0324
0325 static ssize_t
0326 event_trigger_write(struct file *filp, const char __user *ubuf,
0327 size_t cnt, loff_t *ppos)
0328 {
0329 return event_trigger_regex_write(filp, ubuf, cnt, ppos);
0330 }
0331
0332 static int
0333 event_trigger_open(struct inode *inode, struct file *filp)
0334 {
0335
0336 return event_trigger_regex_open(inode, filp);
0337 }
0338
0339 static int
0340 event_trigger_release(struct inode *inode, struct file *file)
0341 {
0342 return event_trigger_regex_release(inode, file);
0343 }
0344
0345 const struct file_operations event_trigger_fops = {
0346 .open = event_trigger_open,
0347 .read = seq_read,
0348 .write = event_trigger_write,
0349 .llseek = tracing_lseek,
0350 .release = event_trigger_release,
0351 };
0352
0353
0354
0355
0356
0357 __init int register_event_command(struct event_command *cmd)
0358 {
0359 struct event_command *p;
0360 int ret = 0;
0361
0362 mutex_lock(&trigger_cmd_mutex);
0363 list_for_each_entry(p, &trigger_commands, list) {
0364 if (strcmp(cmd->name, p->name) == 0) {
0365 ret = -EBUSY;
0366 goto out_unlock;
0367 }
0368 }
0369 list_add(&cmd->list, &trigger_commands);
0370 out_unlock:
0371 mutex_unlock(&trigger_cmd_mutex);
0372
0373 return ret;
0374 }
0375
0376
0377
0378
0379
0380 __init int unregister_event_command(struct event_command *cmd)
0381 {
0382 struct event_command *p, *n;
0383 int ret = -ENODEV;
0384
0385 mutex_lock(&trigger_cmd_mutex);
0386 list_for_each_entry_safe(p, n, &trigger_commands, list) {
0387 if (strcmp(cmd->name, p->name) == 0) {
0388 ret = 0;
0389 list_del_init(&p->list);
0390 goto out_unlock;
0391 }
0392 }
0393 out_unlock:
0394 mutex_unlock(&trigger_cmd_mutex);
0395
0396 return ret;
0397 }
0398
0399
0400
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413 static int
0414 event_trigger_print(const char *name, struct seq_file *m,
0415 void *data, char *filter_str)
0416 {
0417 long count = (long)data;
0418
0419 seq_puts(m, name);
0420
0421 if (count == -1)
0422 seq_puts(m, ":unlimited");
0423 else
0424 seq_printf(m, ":count=%ld", count);
0425
0426 if (filter_str)
0427 seq_printf(m, " if %s\n", filter_str);
0428 else
0429 seq_putc(m, '\n');
0430
0431 return 0;
0432 }
0433
0434
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445 int event_trigger_init(struct event_trigger_data *data)
0446 {
0447 data->ref++;
0448 return 0;
0449 }
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460 static void
0461 event_trigger_free(struct event_trigger_data *data)
0462 {
0463 if (WARN_ON_ONCE(data->ref <= 0))
0464 return;
0465
0466 data->ref--;
0467 if (!data->ref)
0468 trigger_data_free(data);
0469 }
0470
0471 int trace_event_trigger_enable_disable(struct trace_event_file *file,
0472 int trigger_enable)
0473 {
0474 int ret = 0;
0475
0476 if (trigger_enable) {
0477 if (atomic_inc_return(&file->tm_ref) > 1)
0478 return ret;
0479 set_bit(EVENT_FILE_FL_TRIGGER_MODE_BIT, &file->flags);
0480 ret = trace_event_enable_disable(file, 1, 1);
0481 } else {
0482 if (atomic_dec_return(&file->tm_ref) > 0)
0483 return ret;
0484 clear_bit(EVENT_FILE_FL_TRIGGER_MODE_BIT, &file->flags);
0485 ret = trace_event_enable_disable(file, 0, 1);
0486 }
0487
0488 return ret;
0489 }
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504 void
0505 clear_event_triggers(struct trace_array *tr)
0506 {
0507 struct trace_event_file *file;
0508
0509 list_for_each_entry(file, &tr->events, list) {
0510 struct event_trigger_data *data, *n;
0511 list_for_each_entry_safe(data, n, &file->triggers, list) {
0512 trace_event_trigger_enable_disable(file, 0);
0513 list_del_rcu(&data->list);
0514 if (data->ops->free)
0515 data->ops->free(data);
0516 }
0517 }
0518 }
0519
0520
0521
0522
0523
0524
0525
0526
0527
0528
0529
0530 void update_cond_flag(struct trace_event_file *file)
0531 {
0532 struct event_trigger_data *data;
0533 bool set_cond = false;
0534
0535 lockdep_assert_held(&event_mutex);
0536
0537 list_for_each_entry(data, &file->triggers, list) {
0538 if (data->filter || event_command_post_trigger(data->cmd_ops) ||
0539 event_command_needs_rec(data->cmd_ops)) {
0540 set_cond = true;
0541 break;
0542 }
0543 }
0544
0545 if (set_cond)
0546 set_bit(EVENT_FILE_FL_TRIGGER_COND_BIT, &file->flags);
0547 else
0548 clear_bit(EVENT_FILE_FL_TRIGGER_COND_BIT, &file->flags);
0549 }
0550
0551
0552
0553
0554
0555
0556
0557
0558
0559
0560
0561
0562
0563
0564 static int register_trigger(char *glob,
0565 struct event_trigger_data *data,
0566 struct trace_event_file *file)
0567 {
0568 struct event_trigger_data *test;
0569 int ret = 0;
0570
0571 lockdep_assert_held(&event_mutex);
0572
0573 list_for_each_entry(test, &file->triggers, list) {
0574 if (test->cmd_ops->trigger_type == data->cmd_ops->trigger_type) {
0575 ret = -EEXIST;
0576 goto out;
0577 }
0578 }
0579
0580 if (data->ops->init) {
0581 ret = data->ops->init(data);
0582 if (ret < 0)
0583 goto out;
0584 }
0585
0586 list_add_rcu(&data->list, &file->triggers);
0587
0588 update_cond_flag(file);
0589 ret = trace_event_trigger_enable_disable(file, 1);
0590 if (ret < 0) {
0591 list_del_rcu(&data->list);
0592 update_cond_flag(file);
0593 }
0594 out:
0595 return ret;
0596 }
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607
0608
0609 static void unregister_trigger(char *glob,
0610 struct event_trigger_data *test,
0611 struct trace_event_file *file)
0612 {
0613 struct event_trigger_data *data = NULL, *iter;
0614
0615 lockdep_assert_held(&event_mutex);
0616
0617 list_for_each_entry(iter, &file->triggers, list) {
0618 if (iter->cmd_ops->trigger_type == test->cmd_ops->trigger_type) {
0619 data = iter;
0620 list_del_rcu(&data->list);
0621 trace_event_trigger_enable_disable(file, 0);
0622 update_cond_flag(file);
0623 break;
0624 }
0625 }
0626
0627 if (data && data->ops->free)
0628 data->ops->free(data);
0629 }
0630
0631
0632
0633
0634
0635
0636
0637
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675
0676
0677
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718 bool event_trigger_check_remove(const char *glob)
0719 {
0720 return (glob && glob[0] == '!') ? true : false;
0721 }
0722
0723
0724
0725
0726
0727
0728
0729
0730
0731
0732
0733
0734
0735 bool event_trigger_empty_param(const char *param)
0736 {
0737 return !param;
0738 }
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749
0750
0751
0752
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766 int event_trigger_separate_filter(char *param_and_filter, char **param,
0767 char **filter, bool param_required)
0768 {
0769 int ret = 0;
0770
0771 *param = *filter = NULL;
0772
0773 if (!param_and_filter) {
0774 if (param_required)
0775 ret = -EINVAL;
0776 goto out;
0777 }
0778
0779
0780
0781
0782
0783
0784
0785 if (!param_required && param_and_filter && !isdigit(param_and_filter[0])) {
0786 *filter = param_and_filter;
0787 goto out;
0788 }
0789
0790
0791
0792
0793
0794
0795 *param = strsep(¶m_and_filter, " \t");
0796
0797
0798
0799
0800 if (param_and_filter) {
0801 *filter = skip_spaces(param_and_filter);
0802 if (!**filter)
0803 *filter = NULL;
0804 }
0805 out:
0806 return ret;
0807 }
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818
0819
0820
0821
0822
0823
0824
0825 struct event_trigger_data *event_trigger_alloc(struct event_command *cmd_ops,
0826 char *cmd,
0827 char *param,
0828 void *private_data)
0829 {
0830 struct event_trigger_data *trigger_data;
0831 struct event_trigger_ops *trigger_ops;
0832
0833 trigger_ops = cmd_ops->get_trigger_ops(cmd, param);
0834
0835 trigger_data = kzalloc(sizeof(*trigger_data), GFP_KERNEL);
0836 if (!trigger_data)
0837 return NULL;
0838
0839 trigger_data->count = -1;
0840 trigger_data->ops = trigger_ops;
0841 trigger_data->cmd_ops = cmd_ops;
0842 trigger_data->private_data = private_data;
0843
0844 INIT_LIST_HEAD(&trigger_data->list);
0845 INIT_LIST_HEAD(&trigger_data->named_list);
0846 RCU_INIT_POINTER(trigger_data->filter, NULL);
0847
0848 return trigger_data;
0849 }
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861 int event_trigger_parse_num(char *param,
0862 struct event_trigger_data *trigger_data)
0863 {
0864 char *number;
0865 int ret = 0;
0866
0867 if (param) {
0868 number = strsep(¶m, ":");
0869
0870 if (!strlen(number))
0871 return -EINVAL;
0872
0873
0874
0875
0876
0877 ret = kstrtoul(number, 0, &trigger_data->count);
0878 }
0879
0880 return ret;
0881 }
0882
0883
0884
0885
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895 int event_trigger_set_filter(struct event_command *cmd_ops,
0896 struct trace_event_file *file,
0897 char *param,
0898 struct event_trigger_data *trigger_data)
0899 {
0900 if (param && cmd_ops->set_filter)
0901 return cmd_ops->set_filter(param, trigger_data, file);
0902
0903 return 0;
0904 }
0905
0906
0907
0908
0909
0910
0911
0912
0913 void event_trigger_reset_filter(struct event_command *cmd_ops,
0914 struct event_trigger_data *trigger_data)
0915 {
0916 if (cmd_ops->set_filter)
0917 cmd_ops->set_filter(NULL, trigger_data, NULL);
0918 }
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929
0930
0931
0932 int event_trigger_register(struct event_command *cmd_ops,
0933 struct trace_event_file *file,
0934 char *glob,
0935 struct event_trigger_data *trigger_data)
0936 {
0937 return cmd_ops->reg(glob, trigger_data, file);
0938 }
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950 void event_trigger_unregister(struct event_command *cmd_ops,
0951 struct trace_event_file *file,
0952 char *glob,
0953 struct event_trigger_data *trigger_data)
0954 {
0955 cmd_ops->unreg(glob, trigger_data, file);
0956 }
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978 static int
0979 event_trigger_parse(struct event_command *cmd_ops,
0980 struct trace_event_file *file,
0981 char *glob, char *cmd, char *param_and_filter)
0982 {
0983 struct event_trigger_data *trigger_data;
0984 char *param, *filter;
0985 bool remove;
0986 int ret;
0987
0988 remove = event_trigger_check_remove(glob);
0989
0990 ret = event_trigger_separate_filter(param_and_filter, ¶m, &filter, false);
0991 if (ret)
0992 return ret;
0993
0994 ret = -ENOMEM;
0995 trigger_data = event_trigger_alloc(cmd_ops, cmd, param, file);
0996 if (!trigger_data)
0997 goto out;
0998
0999 if (remove) {
1000 event_trigger_unregister(cmd_ops, file, glob+1, trigger_data);
1001 kfree(trigger_data);
1002 ret = 0;
1003 goto out;
1004 }
1005
1006 ret = event_trigger_parse_num(param, trigger_data);
1007 if (ret)
1008 goto out_free;
1009
1010 ret = event_trigger_set_filter(cmd_ops, file, filter, trigger_data);
1011 if (ret < 0)
1012 goto out_free;
1013
1014
1015 event_trigger_init(trigger_data);
1016
1017 ret = event_trigger_register(cmd_ops, file, glob, trigger_data);
1018 if (ret)
1019 goto out_free;
1020
1021
1022 event_trigger_free(trigger_data);
1023 out:
1024 return ret;
1025
1026 out_free:
1027 event_trigger_reset_filter(cmd_ops, trigger_data);
1028 kfree(trigger_data);
1029 goto out;
1030 }
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048 int set_trigger_filter(char *filter_str,
1049 struct event_trigger_data *trigger_data,
1050 struct trace_event_file *file)
1051 {
1052 struct event_trigger_data *data = trigger_data;
1053 struct event_filter *filter = NULL, *tmp;
1054 int ret = -EINVAL;
1055 char *s;
1056
1057 if (!filter_str)
1058 goto assign;
1059
1060 s = strsep(&filter_str, " \t");
1061
1062 if (!strlen(s) || strcmp(s, "if") != 0)
1063 goto out;
1064
1065 if (!filter_str)
1066 goto out;
1067
1068
1069 ret = create_event_filter(file->tr, file->event_call,
1070 filter_str, false, &filter);
1071
1072
1073
1074
1075 assign:
1076 tmp = rcu_access_pointer(data->filter);
1077
1078 rcu_assign_pointer(data->filter, filter);
1079
1080 if (tmp) {
1081
1082 tracepoint_synchronize_unregister();
1083 free_event_filter(tmp);
1084 }
1085
1086 kfree(data->filter_str);
1087 data->filter_str = NULL;
1088
1089 if (filter_str) {
1090 data->filter_str = kstrdup(filter_str, GFP_KERNEL);
1091 if (!data->filter_str) {
1092 free_event_filter(rcu_access_pointer(data->filter));
1093 data->filter = NULL;
1094 ret = -ENOMEM;
1095 }
1096 }
1097 out:
1098 return ret;
1099 }
1100
1101 static LIST_HEAD(named_triggers);
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117 struct event_trigger_data *find_named_trigger(const char *name)
1118 {
1119 struct event_trigger_data *data;
1120
1121 if (!name)
1122 return NULL;
1123
1124 list_for_each_entry(data, &named_triggers, named_list) {
1125 if (data->named_data)
1126 continue;
1127 if (strcmp(data->name, name) == 0)
1128 return data;
1129 }
1130
1131 return NULL;
1132 }
1133
1134
1135
1136
1137
1138
1139
1140 bool is_named_trigger(struct event_trigger_data *test)
1141 {
1142 struct event_trigger_data *data;
1143
1144 list_for_each_entry(data, &named_triggers, named_list) {
1145 if (test == data)
1146 return true;
1147 }
1148
1149 return false;
1150 }
1151
1152
1153
1154
1155
1156
1157
1158
1159 int save_named_trigger(const char *name, struct event_trigger_data *data)
1160 {
1161 data->name = kstrdup(name, GFP_KERNEL);
1162 if (!data->name)
1163 return -ENOMEM;
1164
1165 list_add(&data->named_list, &named_triggers);
1166
1167 return 0;
1168 }
1169
1170
1171
1172
1173
1174 void del_named_trigger(struct event_trigger_data *data)
1175 {
1176 kfree(data->name);
1177 data->name = NULL;
1178
1179 list_del(&data->named_list);
1180 }
1181
1182 static void __pause_named_trigger(struct event_trigger_data *data, bool pause)
1183 {
1184 struct event_trigger_data *test;
1185
1186 list_for_each_entry(test, &named_triggers, named_list) {
1187 if (strcmp(test->name, data->name) == 0) {
1188 if (pause) {
1189 test->paused_tmp = test->paused;
1190 test->paused = true;
1191 } else {
1192 test->paused = test->paused_tmp;
1193 }
1194 }
1195 }
1196 }
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207 void pause_named_trigger(struct event_trigger_data *data)
1208 {
1209 __pause_named_trigger(data, true);
1210 }
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221 void unpause_named_trigger(struct event_trigger_data *data)
1222 {
1223 __pause_named_trigger(data, false);
1224 }
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238 void set_named_trigger_data(struct event_trigger_data *data,
1239 struct event_trigger_data *named_data)
1240 {
1241 data->named_data = named_data;
1242 }
1243
1244 struct event_trigger_data *
1245 get_named_trigger_data(struct event_trigger_data *data)
1246 {
1247 return data->named_data;
1248 }
1249
1250 static void
1251 traceon_trigger(struct event_trigger_data *data,
1252 struct trace_buffer *buffer, void *rec,
1253 struct ring_buffer_event *event)
1254 {
1255 struct trace_event_file *file = data->private_data;
1256
1257 if (file) {
1258 if (tracer_tracing_is_on(file->tr))
1259 return;
1260
1261 tracer_tracing_on(file->tr);
1262 return;
1263 }
1264
1265 if (tracing_is_on())
1266 return;
1267
1268 tracing_on();
1269 }
1270
1271 static void
1272 traceon_count_trigger(struct event_trigger_data *data,
1273 struct trace_buffer *buffer, void *rec,
1274 struct ring_buffer_event *event)
1275 {
1276 struct trace_event_file *file = data->private_data;
1277
1278 if (file) {
1279 if (tracer_tracing_is_on(file->tr))
1280 return;
1281 } else {
1282 if (tracing_is_on())
1283 return;
1284 }
1285
1286 if (!data->count)
1287 return;
1288
1289 if (data->count != -1)
1290 (data->count)--;
1291
1292 if (file)
1293 tracer_tracing_on(file->tr);
1294 else
1295 tracing_on();
1296 }
1297
1298 static void
1299 traceoff_trigger(struct event_trigger_data *data,
1300 struct trace_buffer *buffer, void *rec,
1301 struct ring_buffer_event *event)
1302 {
1303 struct trace_event_file *file = data->private_data;
1304
1305 if (file) {
1306 if (!tracer_tracing_is_on(file->tr))
1307 return;
1308
1309 tracer_tracing_off(file->tr);
1310 return;
1311 }
1312
1313 if (!tracing_is_on())
1314 return;
1315
1316 tracing_off();
1317 }
1318
1319 static void
1320 traceoff_count_trigger(struct event_trigger_data *data,
1321 struct trace_buffer *buffer, void *rec,
1322 struct ring_buffer_event *event)
1323 {
1324 struct trace_event_file *file = data->private_data;
1325
1326 if (file) {
1327 if (!tracer_tracing_is_on(file->tr))
1328 return;
1329 } else {
1330 if (!tracing_is_on())
1331 return;
1332 }
1333
1334 if (!data->count)
1335 return;
1336
1337 if (data->count != -1)
1338 (data->count)--;
1339
1340 if (file)
1341 tracer_tracing_off(file->tr);
1342 else
1343 tracing_off();
1344 }
1345
1346 static int
1347 traceon_trigger_print(struct seq_file *m, struct event_trigger_data *data)
1348 {
1349 return event_trigger_print("traceon", m, (void *)data->count,
1350 data->filter_str);
1351 }
1352
1353 static int
1354 traceoff_trigger_print(struct seq_file *m, struct event_trigger_data *data)
1355 {
1356 return event_trigger_print("traceoff", m, (void *)data->count,
1357 data->filter_str);
1358 }
1359
1360 static struct event_trigger_ops traceon_trigger_ops = {
1361 .trigger = traceon_trigger,
1362 .print = traceon_trigger_print,
1363 .init = event_trigger_init,
1364 .free = event_trigger_free,
1365 };
1366
1367 static struct event_trigger_ops traceon_count_trigger_ops = {
1368 .trigger = traceon_count_trigger,
1369 .print = traceon_trigger_print,
1370 .init = event_trigger_init,
1371 .free = event_trigger_free,
1372 };
1373
1374 static struct event_trigger_ops traceoff_trigger_ops = {
1375 .trigger = traceoff_trigger,
1376 .print = traceoff_trigger_print,
1377 .init = event_trigger_init,
1378 .free = event_trigger_free,
1379 };
1380
1381 static struct event_trigger_ops traceoff_count_trigger_ops = {
1382 .trigger = traceoff_count_trigger,
1383 .print = traceoff_trigger_print,
1384 .init = event_trigger_init,
1385 .free = event_trigger_free,
1386 };
1387
1388 static struct event_trigger_ops *
1389 onoff_get_trigger_ops(char *cmd, char *param)
1390 {
1391 struct event_trigger_ops *ops;
1392
1393
1394 if (strcmp(cmd, "traceon") == 0)
1395 ops = param ? &traceon_count_trigger_ops :
1396 &traceon_trigger_ops;
1397 else
1398 ops = param ? &traceoff_count_trigger_ops :
1399 &traceoff_trigger_ops;
1400
1401 return ops;
1402 }
1403
1404 static struct event_command trigger_traceon_cmd = {
1405 .name = "traceon",
1406 .trigger_type = ETT_TRACE_ONOFF,
1407 .parse = event_trigger_parse,
1408 .reg = register_trigger,
1409 .unreg = unregister_trigger,
1410 .get_trigger_ops = onoff_get_trigger_ops,
1411 .set_filter = set_trigger_filter,
1412 };
1413
1414 static struct event_command trigger_traceoff_cmd = {
1415 .name = "traceoff",
1416 .trigger_type = ETT_TRACE_ONOFF,
1417 .flags = EVENT_CMD_FL_POST_TRIGGER,
1418 .parse = event_trigger_parse,
1419 .reg = register_trigger,
1420 .unreg = unregister_trigger,
1421 .get_trigger_ops = onoff_get_trigger_ops,
1422 .set_filter = set_trigger_filter,
1423 };
1424
1425 #ifdef CONFIG_TRACER_SNAPSHOT
1426 static void
1427 snapshot_trigger(struct event_trigger_data *data,
1428 struct trace_buffer *buffer, void *rec,
1429 struct ring_buffer_event *event)
1430 {
1431 struct trace_event_file *file = data->private_data;
1432
1433 if (file)
1434 tracing_snapshot_instance(file->tr);
1435 else
1436 tracing_snapshot();
1437 }
1438
1439 static void
1440 snapshot_count_trigger(struct event_trigger_data *data,
1441 struct trace_buffer *buffer, void *rec,
1442 struct ring_buffer_event *event)
1443 {
1444 if (!data->count)
1445 return;
1446
1447 if (data->count != -1)
1448 (data->count)--;
1449
1450 snapshot_trigger(data, buffer, rec, event);
1451 }
1452
1453 static int
1454 register_snapshot_trigger(char *glob,
1455 struct event_trigger_data *data,
1456 struct trace_event_file *file)
1457 {
1458 if (tracing_alloc_snapshot_instance(file->tr) != 0)
1459 return 0;
1460
1461 return register_trigger(glob, data, file);
1462 }
1463
1464 static int
1465 snapshot_trigger_print(struct seq_file *m, struct event_trigger_data *data)
1466 {
1467 return event_trigger_print("snapshot", m, (void *)data->count,
1468 data->filter_str);
1469 }
1470
1471 static struct event_trigger_ops snapshot_trigger_ops = {
1472 .trigger = snapshot_trigger,
1473 .print = snapshot_trigger_print,
1474 .init = event_trigger_init,
1475 .free = event_trigger_free,
1476 };
1477
1478 static struct event_trigger_ops snapshot_count_trigger_ops = {
1479 .trigger = snapshot_count_trigger,
1480 .print = snapshot_trigger_print,
1481 .init = event_trigger_init,
1482 .free = event_trigger_free,
1483 };
1484
1485 static struct event_trigger_ops *
1486 snapshot_get_trigger_ops(char *cmd, char *param)
1487 {
1488 return param ? &snapshot_count_trigger_ops : &snapshot_trigger_ops;
1489 }
1490
1491 static struct event_command trigger_snapshot_cmd = {
1492 .name = "snapshot",
1493 .trigger_type = ETT_SNAPSHOT,
1494 .parse = event_trigger_parse,
1495 .reg = register_snapshot_trigger,
1496 .unreg = unregister_trigger,
1497 .get_trigger_ops = snapshot_get_trigger_ops,
1498 .set_filter = set_trigger_filter,
1499 };
1500
1501 static __init int register_trigger_snapshot_cmd(void)
1502 {
1503 int ret;
1504
1505 ret = register_event_command(&trigger_snapshot_cmd);
1506 WARN_ON(ret < 0);
1507
1508 return ret;
1509 }
1510 #else
1511 static __init int register_trigger_snapshot_cmd(void) { return 0; }
1512 #endif
1513
1514 #ifdef CONFIG_STACKTRACE
1515 #ifdef CONFIG_UNWINDER_ORC
1516
1517
1518
1519
1520 # define STACK_SKIP 2
1521 #else
1522
1523
1524
1525
1526
1527
1528
1529 #define STACK_SKIP 4
1530 #endif
1531
1532 static void
1533 stacktrace_trigger(struct event_trigger_data *data,
1534 struct trace_buffer *buffer, void *rec,
1535 struct ring_buffer_event *event)
1536 {
1537 struct trace_event_file *file = data->private_data;
1538
1539 if (file)
1540 __trace_stack(file->tr, tracing_gen_ctx(), STACK_SKIP);
1541 else
1542 trace_dump_stack(STACK_SKIP);
1543 }
1544
1545 static void
1546 stacktrace_count_trigger(struct event_trigger_data *data,
1547 struct trace_buffer *buffer, void *rec,
1548 struct ring_buffer_event *event)
1549 {
1550 if (!data->count)
1551 return;
1552
1553 if (data->count != -1)
1554 (data->count)--;
1555
1556 stacktrace_trigger(data, buffer, rec, event);
1557 }
1558
1559 static int
1560 stacktrace_trigger_print(struct seq_file *m, struct event_trigger_data *data)
1561 {
1562 return event_trigger_print("stacktrace", m, (void *)data->count,
1563 data->filter_str);
1564 }
1565
1566 static struct event_trigger_ops stacktrace_trigger_ops = {
1567 .trigger = stacktrace_trigger,
1568 .print = stacktrace_trigger_print,
1569 .init = event_trigger_init,
1570 .free = event_trigger_free,
1571 };
1572
1573 static struct event_trigger_ops stacktrace_count_trigger_ops = {
1574 .trigger = stacktrace_count_trigger,
1575 .print = stacktrace_trigger_print,
1576 .init = event_trigger_init,
1577 .free = event_trigger_free,
1578 };
1579
1580 static struct event_trigger_ops *
1581 stacktrace_get_trigger_ops(char *cmd, char *param)
1582 {
1583 return param ? &stacktrace_count_trigger_ops : &stacktrace_trigger_ops;
1584 }
1585
1586 static struct event_command trigger_stacktrace_cmd = {
1587 .name = "stacktrace",
1588 .trigger_type = ETT_STACKTRACE,
1589 .flags = EVENT_CMD_FL_POST_TRIGGER,
1590 .parse = event_trigger_parse,
1591 .reg = register_trigger,
1592 .unreg = unregister_trigger,
1593 .get_trigger_ops = stacktrace_get_trigger_ops,
1594 .set_filter = set_trigger_filter,
1595 };
1596
1597 static __init int register_trigger_stacktrace_cmd(void)
1598 {
1599 int ret;
1600
1601 ret = register_event_command(&trigger_stacktrace_cmd);
1602 WARN_ON(ret < 0);
1603
1604 return ret;
1605 }
1606 #else
1607 static __init int register_trigger_stacktrace_cmd(void) { return 0; }
1608 #endif
1609
1610 static __init void unregister_trigger_traceon_traceoff_cmds(void)
1611 {
1612 unregister_event_command(&trigger_traceon_cmd);
1613 unregister_event_command(&trigger_traceoff_cmd);
1614 }
1615
1616 static void
1617 event_enable_trigger(struct event_trigger_data *data,
1618 struct trace_buffer *buffer, void *rec,
1619 struct ring_buffer_event *event)
1620 {
1621 struct enable_trigger_data *enable_data = data->private_data;
1622
1623 if (enable_data->enable)
1624 clear_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &enable_data->file->flags);
1625 else
1626 set_bit(EVENT_FILE_FL_SOFT_DISABLED_BIT, &enable_data->file->flags);
1627 }
1628
1629 static void
1630 event_enable_count_trigger(struct event_trigger_data *data,
1631 struct trace_buffer *buffer, void *rec,
1632 struct ring_buffer_event *event)
1633 {
1634 struct enable_trigger_data *enable_data = data->private_data;
1635
1636 if (!data->count)
1637 return;
1638
1639
1640 if (enable_data->enable == !(enable_data->file->flags & EVENT_FILE_FL_SOFT_DISABLED))
1641 return;
1642
1643 if (data->count != -1)
1644 (data->count)--;
1645
1646 event_enable_trigger(data, buffer, rec, event);
1647 }
1648
1649 int event_enable_trigger_print(struct seq_file *m,
1650 struct event_trigger_data *data)
1651 {
1652 struct enable_trigger_data *enable_data = data->private_data;
1653
1654 seq_printf(m, "%s:%s:%s",
1655 enable_data->hist ?
1656 (enable_data->enable ? ENABLE_HIST_STR : DISABLE_HIST_STR) :
1657 (enable_data->enable ? ENABLE_EVENT_STR : DISABLE_EVENT_STR),
1658 enable_data->file->event_call->class->system,
1659 trace_event_name(enable_data->file->event_call));
1660
1661 if (data->count == -1)
1662 seq_puts(m, ":unlimited");
1663 else
1664 seq_printf(m, ":count=%ld", data->count);
1665
1666 if (data->filter_str)
1667 seq_printf(m, " if %s\n", data->filter_str);
1668 else
1669 seq_putc(m, '\n');
1670
1671 return 0;
1672 }
1673
1674 void event_enable_trigger_free(struct event_trigger_data *data)
1675 {
1676 struct enable_trigger_data *enable_data = data->private_data;
1677
1678 if (WARN_ON_ONCE(data->ref <= 0))
1679 return;
1680
1681 data->ref--;
1682 if (!data->ref) {
1683
1684 trace_event_enable_disable(enable_data->file, 0, 1);
1685 trace_event_put_ref(enable_data->file->event_call);
1686 trigger_data_free(data);
1687 kfree(enable_data);
1688 }
1689 }
1690
1691 static struct event_trigger_ops event_enable_trigger_ops = {
1692 .trigger = event_enable_trigger,
1693 .print = event_enable_trigger_print,
1694 .init = event_trigger_init,
1695 .free = event_enable_trigger_free,
1696 };
1697
1698 static struct event_trigger_ops event_enable_count_trigger_ops = {
1699 .trigger = event_enable_count_trigger,
1700 .print = event_enable_trigger_print,
1701 .init = event_trigger_init,
1702 .free = event_enable_trigger_free,
1703 };
1704
1705 static struct event_trigger_ops event_disable_trigger_ops = {
1706 .trigger = event_enable_trigger,
1707 .print = event_enable_trigger_print,
1708 .init = event_trigger_init,
1709 .free = event_enable_trigger_free,
1710 };
1711
1712 static struct event_trigger_ops event_disable_count_trigger_ops = {
1713 .trigger = event_enable_count_trigger,
1714 .print = event_enable_trigger_print,
1715 .init = event_trigger_init,
1716 .free = event_enable_trigger_free,
1717 };
1718
1719 int event_enable_trigger_parse(struct event_command *cmd_ops,
1720 struct trace_event_file *file,
1721 char *glob, char *cmd, char *param_and_filter)
1722 {
1723 struct trace_event_file *event_enable_file;
1724 struct enable_trigger_data *enable_data;
1725 struct event_trigger_data *trigger_data;
1726 struct trace_array *tr = file->tr;
1727 char *param, *filter;
1728 bool enable, remove;
1729 const char *system;
1730 const char *event;
1731 bool hist = false;
1732 int ret;
1733
1734 remove = event_trigger_check_remove(glob);
1735
1736 if (event_trigger_empty_param(param_and_filter))
1737 return -EINVAL;
1738
1739 ret = event_trigger_separate_filter(param_and_filter, ¶m, &filter, true);
1740 if (ret)
1741 return ret;
1742
1743 system = strsep(¶m, ":");
1744 if (!param)
1745 return -EINVAL;
1746
1747 event = strsep(¶m, ":");
1748
1749 ret = -EINVAL;
1750 event_enable_file = find_event_file(tr, system, event);
1751 if (!event_enable_file)
1752 goto out;
1753
1754 #ifdef CONFIG_HIST_TRIGGERS
1755 hist = ((strcmp(cmd, ENABLE_HIST_STR) == 0) ||
1756 (strcmp(cmd, DISABLE_HIST_STR) == 0));
1757
1758 enable = ((strcmp(cmd, ENABLE_EVENT_STR) == 0) ||
1759 (strcmp(cmd, ENABLE_HIST_STR) == 0));
1760 #else
1761 enable = strcmp(cmd, ENABLE_EVENT_STR) == 0;
1762 #endif
1763 ret = -ENOMEM;
1764
1765 enable_data = kzalloc(sizeof(*enable_data), GFP_KERNEL);
1766 if (!enable_data)
1767 goto out;
1768
1769 enable_data->hist = hist;
1770 enable_data->enable = enable;
1771 enable_data->file = event_enable_file;
1772
1773 trigger_data = event_trigger_alloc(cmd_ops, cmd, param, enable_data);
1774 if (!trigger_data) {
1775 kfree(enable_data);
1776 goto out;
1777 }
1778
1779 if (remove) {
1780 event_trigger_unregister(cmd_ops, file, glob+1, trigger_data);
1781 kfree(trigger_data);
1782 kfree(enable_data);
1783 ret = 0;
1784 goto out;
1785 }
1786
1787
1788 event_trigger_init(trigger_data);
1789
1790 ret = event_trigger_parse_num(param, trigger_data);
1791 if (ret)
1792 goto out_free;
1793
1794 ret = event_trigger_set_filter(cmd_ops, file, filter, trigger_data);
1795 if (ret < 0)
1796 goto out_free;
1797
1798
1799 ret = trace_event_try_get_ref(event_enable_file->event_call);
1800 if (!ret) {
1801 ret = -EBUSY;
1802 goto out_free;
1803 }
1804
1805 ret = trace_event_enable_disable(event_enable_file, 1, 1);
1806 if (ret < 0)
1807 goto out_put;
1808
1809 ret = event_trigger_register(cmd_ops, file, glob, trigger_data);
1810 if (ret)
1811 goto out_disable;
1812
1813 event_trigger_free(trigger_data);
1814 out:
1815 return ret;
1816 out_disable:
1817 trace_event_enable_disable(event_enable_file, 0, 1);
1818 out_put:
1819 trace_event_put_ref(event_enable_file->event_call);
1820 out_free:
1821 event_trigger_reset_filter(cmd_ops, trigger_data);
1822 event_trigger_free(trigger_data);
1823 kfree(enable_data);
1824
1825 goto out;
1826 }
1827
1828 int event_enable_register_trigger(char *glob,
1829 struct event_trigger_data *data,
1830 struct trace_event_file *file)
1831 {
1832 struct enable_trigger_data *enable_data = data->private_data;
1833 struct enable_trigger_data *test_enable_data;
1834 struct event_trigger_data *test;
1835 int ret = 0;
1836
1837 lockdep_assert_held(&event_mutex);
1838
1839 list_for_each_entry(test, &file->triggers, list) {
1840 test_enable_data = test->private_data;
1841 if (test_enable_data &&
1842 (test->cmd_ops->trigger_type ==
1843 data->cmd_ops->trigger_type) &&
1844 (test_enable_data->file == enable_data->file)) {
1845 ret = -EEXIST;
1846 goto out;
1847 }
1848 }
1849
1850 if (data->ops->init) {
1851 ret = data->ops->init(data);
1852 if (ret < 0)
1853 goto out;
1854 }
1855
1856 list_add_rcu(&data->list, &file->triggers);
1857
1858 update_cond_flag(file);
1859 ret = trace_event_trigger_enable_disable(file, 1);
1860 if (ret < 0) {
1861 list_del_rcu(&data->list);
1862 update_cond_flag(file);
1863 }
1864 out:
1865 return ret;
1866 }
1867
1868 void event_enable_unregister_trigger(char *glob,
1869 struct event_trigger_data *test,
1870 struct trace_event_file *file)
1871 {
1872 struct enable_trigger_data *test_enable_data = test->private_data;
1873 struct event_trigger_data *data = NULL, *iter;
1874 struct enable_trigger_data *enable_data;
1875
1876 lockdep_assert_held(&event_mutex);
1877
1878 list_for_each_entry(iter, &file->triggers, list) {
1879 enable_data = iter->private_data;
1880 if (enable_data &&
1881 (iter->cmd_ops->trigger_type ==
1882 test->cmd_ops->trigger_type) &&
1883 (enable_data->file == test_enable_data->file)) {
1884 data = iter;
1885 list_del_rcu(&data->list);
1886 trace_event_trigger_enable_disable(file, 0);
1887 update_cond_flag(file);
1888 break;
1889 }
1890 }
1891
1892 if (data && data->ops->free)
1893 data->ops->free(data);
1894 }
1895
1896 static struct event_trigger_ops *
1897 event_enable_get_trigger_ops(char *cmd, char *param)
1898 {
1899 struct event_trigger_ops *ops;
1900 bool enable;
1901
1902 #ifdef CONFIG_HIST_TRIGGERS
1903 enable = ((strcmp(cmd, ENABLE_EVENT_STR) == 0) ||
1904 (strcmp(cmd, ENABLE_HIST_STR) == 0));
1905 #else
1906 enable = strcmp(cmd, ENABLE_EVENT_STR) == 0;
1907 #endif
1908 if (enable)
1909 ops = param ? &event_enable_count_trigger_ops :
1910 &event_enable_trigger_ops;
1911 else
1912 ops = param ? &event_disable_count_trigger_ops :
1913 &event_disable_trigger_ops;
1914
1915 return ops;
1916 }
1917
1918 static struct event_command trigger_enable_cmd = {
1919 .name = ENABLE_EVENT_STR,
1920 .trigger_type = ETT_EVENT_ENABLE,
1921 .parse = event_enable_trigger_parse,
1922 .reg = event_enable_register_trigger,
1923 .unreg = event_enable_unregister_trigger,
1924 .get_trigger_ops = event_enable_get_trigger_ops,
1925 .set_filter = set_trigger_filter,
1926 };
1927
1928 static struct event_command trigger_disable_cmd = {
1929 .name = DISABLE_EVENT_STR,
1930 .trigger_type = ETT_EVENT_ENABLE,
1931 .parse = event_enable_trigger_parse,
1932 .reg = event_enable_register_trigger,
1933 .unreg = event_enable_unregister_trigger,
1934 .get_trigger_ops = event_enable_get_trigger_ops,
1935 .set_filter = set_trigger_filter,
1936 };
1937
1938 static __init void unregister_trigger_enable_disable_cmds(void)
1939 {
1940 unregister_event_command(&trigger_enable_cmd);
1941 unregister_event_command(&trigger_disable_cmd);
1942 }
1943
1944 static __init int register_trigger_enable_disable_cmds(void)
1945 {
1946 int ret;
1947
1948 ret = register_event_command(&trigger_enable_cmd);
1949 if (WARN_ON(ret < 0))
1950 return ret;
1951 ret = register_event_command(&trigger_disable_cmd);
1952 if (WARN_ON(ret < 0))
1953 unregister_trigger_enable_disable_cmds();
1954
1955 return ret;
1956 }
1957
1958 static __init int register_trigger_traceon_traceoff_cmds(void)
1959 {
1960 int ret;
1961
1962 ret = register_event_command(&trigger_traceon_cmd);
1963 if (WARN_ON(ret < 0))
1964 return ret;
1965 ret = register_event_command(&trigger_traceoff_cmd);
1966 if (WARN_ON(ret < 0))
1967 unregister_trigger_traceon_traceoff_cmds();
1968
1969 return ret;
1970 }
1971
1972 __init int register_trigger_cmds(void)
1973 {
1974 register_trigger_traceon_traceoff_cmds();
1975 register_trigger_snapshot_cmd();
1976 register_trigger_stacktrace_cmd();
1977 register_trigger_enable_disable_cmds();
1978 register_trigger_hist_enable_disable_cmds();
1979 register_trigger_hist_cmd();
1980
1981 return 0;
1982 }