forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-11 072de836f53be56a70cecf70b43ae43b7ce17376
kernel/kernel/trace/trace_events.c
....@@ -12,6 +12,7 @@
1212 #define pr_fmt(fmt) fmt
1313
1414 #include <linux/workqueue.h>
15
+#include <linux/security.h>
1516 #include <linux/spinlock.h>
1617 #include <linux/kthread.h>
1718 #include <linux/tracefs.h>
....@@ -23,6 +24,7 @@
2324 #include <linux/delay.h>
2425
2526 #include <trace/events/sched.h>
27
+#include <trace/syscall.h>
2628
2729 #include <asm/setup.h>
2830
....@@ -36,6 +38,7 @@
3638 LIST_HEAD(ftrace_events);
3739 static LIST_HEAD(ftrace_generic_fields);
3840 static LIST_HEAD(ftrace_common_fields);
41
+static bool eventdir_initialized;
3942
4043 #define GFP_TRACE (GFP_KERNEL | __GFP_ZERO)
4144
....@@ -69,14 +72,6 @@
6972
7073 #define while_for_each_event_file() \
7174 }
72
-
73
-static struct list_head *
74
-trace_get_fields(struct trace_event_call *event_call)
75
-{
76
- if (!event_call->class->get_fields)
77
- return &event_call->class->fields;
78
- return event_call->class->get_fields(event_call);
79
-}
8075
8176 static struct ftrace_event_field *
8277 __find_event_field(struct list_head *head, char *name)
....@@ -173,6 +168,7 @@
173168
174169 __generic_field(int, CPU, FILTER_CPU);
175170 __generic_field(int, cpu, FILTER_CPU);
171
+ __generic_field(int, common_cpu, FILTER_CPU);
176172 __generic_field(char *, COMM, FILTER_COMM);
177173 __generic_field(char *, comm, FILTER_COMM);
178174
....@@ -238,13 +234,16 @@
238234 {
239235 struct trace_array *tr = trace_file->tr;
240236 struct trace_array_cpu *data;
237
+ struct trace_pid_list *no_pid_list;
241238 struct trace_pid_list *pid_list;
242239
243240 pid_list = rcu_dereference_raw(tr->filtered_pids);
244
- if (!pid_list)
241
+ no_pid_list = rcu_dereference_raw(tr->filtered_no_pids);
242
+
243
+ if (!pid_list && !no_pid_list)
245244 return false;
246245
247
- data = this_cpu_ptr(tr->trace_buffer.data);
246
+ data = this_cpu_ptr(tr->array_buffer.data);
248247
249248 return data->ignore_pid;
250249 }
....@@ -263,12 +262,12 @@
263262 local_save_flags(fbuffer->flags);
264263 fbuffer->pc = preempt_count();
265264 /*
266
- * If CONFIG_PREEMPT is enabled, then the tracepoint itself disables
265
+ * If CONFIG_PREEMPTION is enabled, then the tracepoint itself disables
267266 * preemption (adding one to the preempt_count). Since we are
268267 * interested in the preempt_count at the time the tracepoint was
269268 * hit, we need to subtract one to offset the increment.
270269 */
271
- if (IS_ENABLED(CONFIG_PREEMPT))
270
+ if (IS_ENABLED(CONFIG_PREEMPTION))
272271 fbuffer->pc--;
273272 fbuffer->trace_file = trace_file;
274273
....@@ -279,6 +278,7 @@
279278 if (!fbuffer->event)
280279 return NULL;
281280
281
+ fbuffer->regs = NULL;
282282 fbuffer->entry = ring_buffer_event_data(fbuffer->event);
283283 return fbuffer->entry;
284284 }
....@@ -515,6 +515,9 @@
515515
516516 pid_list = rcu_dereference_raw(tr->filtered_pids);
517517 trace_filter_add_remove_task(pid_list, NULL, task);
518
+
519
+ pid_list = rcu_dereference_raw(tr->filtered_no_pids);
520
+ trace_filter_add_remove_task(pid_list, NULL, task);
518521 }
519522
520523 static void
....@@ -526,6 +529,9 @@
526529 struct trace_array *tr = data;
527530
528531 pid_list = rcu_dereference_sched(tr->filtered_pids);
532
+ trace_filter_add_remove_task(pid_list, self, task);
533
+
534
+ pid_list = rcu_dereference_sched(tr->filtered_no_pids);
529535 trace_filter_add_remove_task(pid_list, self, task);
530536 }
531537
....@@ -549,13 +555,23 @@
549555 struct task_struct *prev, struct task_struct *next)
550556 {
551557 struct trace_array *tr = data;
558
+ struct trace_pid_list *no_pid_list;
552559 struct trace_pid_list *pid_list;
560
+ bool ret;
553561
554562 pid_list = rcu_dereference_sched(tr->filtered_pids);
563
+ no_pid_list = rcu_dereference_sched(tr->filtered_no_pids);
555564
556
- this_cpu_write(tr->trace_buffer.data->ignore_pid,
557
- trace_ignore_this_task(pid_list, prev) &&
558
- trace_ignore_this_task(pid_list, next));
565
+ /*
566
+ * Sched switch is funny, as we only want to ignore it
567
+ * in the notrace case if both prev and next should be ignored.
568
+ */
569
+ ret = trace_ignore_this_task(NULL, no_pid_list, prev) &&
570
+ trace_ignore_this_task(NULL, no_pid_list, next);
571
+
572
+ this_cpu_write(tr->array_buffer.data->ignore_pid, ret ||
573
+ (trace_ignore_this_task(pid_list, NULL, prev) &&
574
+ trace_ignore_this_task(pid_list, NULL, next)));
559575 }
560576
561577 static void
....@@ -563,58 +579,55 @@
563579 struct task_struct *prev, struct task_struct *next)
564580 {
565581 struct trace_array *tr = data;
582
+ struct trace_pid_list *no_pid_list;
566583 struct trace_pid_list *pid_list;
567584
568585 pid_list = rcu_dereference_sched(tr->filtered_pids);
586
+ no_pid_list = rcu_dereference_sched(tr->filtered_no_pids);
569587
570
- this_cpu_write(tr->trace_buffer.data->ignore_pid,
571
- trace_ignore_this_task(pid_list, next));
588
+ this_cpu_write(tr->array_buffer.data->ignore_pid,
589
+ trace_ignore_this_task(pid_list, no_pid_list, next));
572590 }
573591
574592 static void
575593 event_filter_pid_sched_wakeup_probe_pre(void *data, struct task_struct *task)
576594 {
577595 struct trace_array *tr = data;
596
+ struct trace_pid_list *no_pid_list;
578597 struct trace_pid_list *pid_list;
579598
580599 /* Nothing to do if we are already tracing */
581
- if (!this_cpu_read(tr->trace_buffer.data->ignore_pid))
600
+ if (!this_cpu_read(tr->array_buffer.data->ignore_pid))
582601 return;
583602
584603 pid_list = rcu_dereference_sched(tr->filtered_pids);
604
+ no_pid_list = rcu_dereference_sched(tr->filtered_no_pids);
585605
586
- this_cpu_write(tr->trace_buffer.data->ignore_pid,
587
- trace_ignore_this_task(pid_list, task));
606
+ this_cpu_write(tr->array_buffer.data->ignore_pid,
607
+ trace_ignore_this_task(pid_list, no_pid_list, task));
588608 }
589609
590610 static void
591611 event_filter_pid_sched_wakeup_probe_post(void *data, struct task_struct *task)
592612 {
593613 struct trace_array *tr = data;
614
+ struct trace_pid_list *no_pid_list;
594615 struct trace_pid_list *pid_list;
595616
596617 /* Nothing to do if we are not tracing */
597
- if (this_cpu_read(tr->trace_buffer.data->ignore_pid))
618
+ if (this_cpu_read(tr->array_buffer.data->ignore_pid))
598619 return;
599620
600621 pid_list = rcu_dereference_sched(tr->filtered_pids);
622
+ no_pid_list = rcu_dereference_sched(tr->filtered_no_pids);
601623
602624 /* Set tracing if current is enabled */
603
- this_cpu_write(tr->trace_buffer.data->ignore_pid,
604
- trace_ignore_this_task(pid_list, current));
625
+ this_cpu_write(tr->array_buffer.data->ignore_pid,
626
+ trace_ignore_this_task(pid_list, no_pid_list, current));
605627 }
606628
607
-static void __ftrace_clear_event_pids(struct trace_array *tr)
629
+static void unregister_pid_events(struct trace_array *tr)
608630 {
609
- struct trace_pid_list *pid_list;
610
- struct trace_event_file *file;
611
- int cpu;
612
-
613
- pid_list = rcu_dereference_protected(tr->filtered_pids,
614
- lockdep_is_held(&event_mutex));
615
- if (!pid_list)
616
- return;
617
-
618631 unregister_trace_sched_switch(event_filter_pid_sched_switch_probe_pre, tr);
619632 unregister_trace_sched_switch(event_filter_pid_sched_switch_probe_post, tr);
620633
....@@ -626,26 +639,55 @@
626639
627640 unregister_trace_sched_waking(event_filter_pid_sched_wakeup_probe_pre, tr);
628641 unregister_trace_sched_waking(event_filter_pid_sched_wakeup_probe_post, tr);
642
+}
629643
630
- list_for_each_entry(file, &tr->events, list) {
631
- clear_bit(EVENT_FILE_FL_PID_FILTER_BIT, &file->flags);
644
+static void __ftrace_clear_event_pids(struct trace_array *tr, int type)
645
+{
646
+ struct trace_pid_list *pid_list;
647
+ struct trace_pid_list *no_pid_list;
648
+ struct trace_event_file *file;
649
+ int cpu;
650
+
651
+ pid_list = rcu_dereference_protected(tr->filtered_pids,
652
+ lockdep_is_held(&event_mutex));
653
+ no_pid_list = rcu_dereference_protected(tr->filtered_no_pids,
654
+ lockdep_is_held(&event_mutex));
655
+
656
+ /* Make sure there's something to do */
657
+ if (!pid_type_enabled(type, pid_list, no_pid_list))
658
+ return;
659
+
660
+ if (!still_need_pid_events(type, pid_list, no_pid_list)) {
661
+ unregister_pid_events(tr);
662
+
663
+ list_for_each_entry(file, &tr->events, list) {
664
+ clear_bit(EVENT_FILE_FL_PID_FILTER_BIT, &file->flags);
665
+ }
666
+
667
+ for_each_possible_cpu(cpu)
668
+ per_cpu_ptr(tr->array_buffer.data, cpu)->ignore_pid = false;
632669 }
633670
634
- for_each_possible_cpu(cpu)
635
- per_cpu_ptr(tr->trace_buffer.data, cpu)->ignore_pid = false;
671
+ if (type & TRACE_PIDS)
672
+ rcu_assign_pointer(tr->filtered_pids, NULL);
636673
637
- rcu_assign_pointer(tr->filtered_pids, NULL);
674
+ if (type & TRACE_NO_PIDS)
675
+ rcu_assign_pointer(tr->filtered_no_pids, NULL);
638676
639677 /* Wait till all users are no longer using pid filtering */
640678 tracepoint_synchronize_unregister();
641679
642
- trace_free_pid_list(pid_list);
680
+ if ((type & TRACE_PIDS) && pid_list)
681
+ trace_free_pid_list(pid_list);
682
+
683
+ if ((type & TRACE_NO_PIDS) && no_pid_list)
684
+ trace_free_pid_list(no_pid_list);
643685 }
644686
645
-static void ftrace_clear_event_pids(struct trace_array *tr)
687
+static void ftrace_clear_event_pids(struct trace_array *tr, int type)
646688 {
647689 mutex_lock(&event_mutex);
648
- __ftrace_clear_event_pids(tr);
690
+ __ftrace_clear_event_pids(tr, type);
649691 mutex_unlock(&event_mutex);
650692 }
651693
....@@ -704,7 +746,7 @@
704746 return;
705747
706748 if (!--dir->nr_events) {
707
- tracefs_remove_recursive(dir->entry);
749
+ tracefs_remove(dir->entry);
708750 list_del(&dir->list);
709751 __put_system_dir(dir);
710752 }
....@@ -723,7 +765,7 @@
723765 }
724766 spin_unlock(&dir->d_lock);
725767
726
- tracefs_remove_recursive(dir);
768
+ tracefs_remove(dir);
727769 }
728770
729771 list_del(&file->list);
....@@ -795,7 +837,7 @@
795837 return ret;
796838 }
797839
798
-static int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set)
840
+int ftrace_set_clr_event(struct trace_array *tr, char *buf, int set)
799841 {
800842 char *event = NULL, *sub = NULL, *match;
801843 int ret;
....@@ -857,6 +899,32 @@
857899 return __ftrace_set_clr_event(tr, NULL, system, event, set);
858900 }
859901 EXPORT_SYMBOL_GPL(trace_set_clr_event);
902
+
903
+/**
904
+ * trace_array_set_clr_event - enable or disable an event for a trace array.
905
+ * @tr: concerned trace array.
906
+ * @system: system name to match (NULL for any system)
907
+ * @event: event name to match (NULL for all events, within system)
908
+ * @enable: true to enable, false to disable
909
+ *
910
+ * This is a way for other parts of the kernel to enable or disable
911
+ * event recording.
912
+ *
913
+ * Returns 0 on success, -EINVAL if the parameters do not match any
914
+ * registered events.
915
+ */
916
+int trace_array_set_clr_event(struct trace_array *tr, const char *system,
917
+ const char *event, bool enable)
918
+{
919
+ int set;
920
+
921
+ if (!tr)
922
+ return -ENOENT;
923
+
924
+ set = (enable == true) ? 1 : 0;
925
+ return __ftrace_set_clr_event(tr, NULL, system, event, set);
926
+}
927
+EXPORT_SYMBOL_GPL(trace_array_set_clr_event);
860928
861929 /* 128 should be much more than enough */
862930 #define EVENT_BUF_SIZE 127
....@@ -992,15 +1060,32 @@
9921060 }
9931061
9941062 static void *
995
-p_next(struct seq_file *m, void *v, loff_t *pos)
1063
+__next(struct seq_file *m, void *v, loff_t *pos, int type)
9961064 {
9971065 struct trace_array *tr = m->private;
998
- struct trace_pid_list *pid_list = rcu_dereference_sched(tr->filtered_pids);
1066
+ struct trace_pid_list *pid_list;
1067
+
1068
+ if (type == TRACE_PIDS)
1069
+ pid_list = rcu_dereference_sched(tr->filtered_pids);
1070
+ else
1071
+ pid_list = rcu_dereference_sched(tr->filtered_no_pids);
9991072
10001073 return trace_pid_next(pid_list, v, pos);
10011074 }
10021075
1003
-static void *p_start(struct seq_file *m, loff_t *pos)
1076
+static void *
1077
+p_next(struct seq_file *m, void *v, loff_t *pos)
1078
+{
1079
+ return __next(m, v, pos, TRACE_PIDS);
1080
+}
1081
+
1082
+static void *
1083
+np_next(struct seq_file *m, void *v, loff_t *pos)
1084
+{
1085
+ return __next(m, v, pos, TRACE_NO_PIDS);
1086
+}
1087
+
1088
+static void *__start(struct seq_file *m, loff_t *pos, int type)
10041089 __acquires(RCU)
10051090 {
10061091 struct trace_pid_list *pid_list;
....@@ -1015,12 +1100,27 @@
10151100 mutex_lock(&event_mutex);
10161101 rcu_read_lock_sched();
10171102
1018
- pid_list = rcu_dereference_sched(tr->filtered_pids);
1103
+ if (type == TRACE_PIDS)
1104
+ pid_list = rcu_dereference_sched(tr->filtered_pids);
1105
+ else
1106
+ pid_list = rcu_dereference_sched(tr->filtered_no_pids);
10191107
10201108 if (!pid_list)
10211109 return NULL;
10221110
10231111 return trace_pid_start(pid_list, pos);
1112
+}
1113
+
1114
+static void *p_start(struct seq_file *m, loff_t *pos)
1115
+ __acquires(RCU)
1116
+{
1117
+ return __start(m, pos, TRACE_PIDS);
1118
+}
1119
+
1120
+static void *np_start(struct seq_file *m, loff_t *pos)
1121
+ __acquires(RCU)
1122
+{
1123
+ return __start(m, pos, TRACE_NO_PIDS);
10241124 }
10251125
10261126 static void p_stop(struct seq_file *m, void *p)
....@@ -1254,7 +1354,7 @@
12541354 */
12551355 array_descriptor = strchr(field->type, '[');
12561356
1257
- if (!strncmp(field->type, "__data_loc", 10))
1357
+ if (str_has_prefix(field->type, "__data_loc"))
12581358 array_descriptor = NULL;
12591359
12601360 if (!array_descriptor)
....@@ -1303,6 +1403,8 @@
13031403 {
13041404 struct seq_file *m;
13051405 int ret;
1406
+
1407
+ /* Do we want to hide event format files on tracefs lockdown? */
13061408
13071409 ret = seq_open(file, &trace_format_seq_ops);
13081410 if (ret < 0)
....@@ -1450,28 +1552,17 @@
14501552 struct trace_array *tr = inode->i_private;
14511553 int ret;
14521554
1453
- if (tracing_is_disabled())
1454
- return -ENODEV;
1455
-
1456
- if (trace_array_get(tr) < 0)
1457
- return -ENODEV;
1458
-
14591555 /* Make a temporary dir that has no system but points to tr */
14601556 dir = kzalloc(sizeof(*dir), GFP_KERNEL);
1461
- if (!dir) {
1462
- trace_array_put(tr);
1557
+ if (!dir)
14631558 return -ENOMEM;
1464
- }
14651559
1466
- dir->tr = tr;
1467
-
1468
- ret = tracing_open_generic(inode, filp);
1560
+ ret = tracing_open_generic_tr(inode, filp);
14691561 if (ret < 0) {
1470
- trace_array_put(tr);
14711562 kfree(dir);
14721563 return ret;
14731564 }
1474
-
1565
+ dir->tr = tr;
14751566 filp->private_data = dir;
14761567
14771568 return 0;
....@@ -1577,6 +1668,7 @@
15771668 {
15781669 struct trace_array *tr = data;
15791670 struct trace_pid_list *pid_list;
1671
+ struct trace_pid_list *no_pid_list;
15801672
15811673 /*
15821674 * This function is called by on_each_cpu() while the
....@@ -1584,18 +1676,50 @@
15841676 */
15851677 pid_list = rcu_dereference_protected(tr->filtered_pids,
15861678 mutex_is_locked(&event_mutex));
1679
+ no_pid_list = rcu_dereference_protected(tr->filtered_no_pids,
1680
+ mutex_is_locked(&event_mutex));
15871681
1588
- this_cpu_write(tr->trace_buffer.data->ignore_pid,
1589
- trace_ignore_this_task(pid_list, current));
1682
+ this_cpu_write(tr->array_buffer.data->ignore_pid,
1683
+ trace_ignore_this_task(pid_list, no_pid_list, current));
1684
+}
1685
+
1686
+static void register_pid_events(struct trace_array *tr)
1687
+{
1688
+ /*
1689
+ * Register a probe that is called before all other probes
1690
+ * to set ignore_pid if next or prev do not match.
1691
+ * Register a probe this is called after all other probes
1692
+ * to only keep ignore_pid set if next pid matches.
1693
+ */
1694
+ register_trace_prio_sched_switch(event_filter_pid_sched_switch_probe_pre,
1695
+ tr, INT_MAX);
1696
+ register_trace_prio_sched_switch(event_filter_pid_sched_switch_probe_post,
1697
+ tr, 0);
1698
+
1699
+ register_trace_prio_sched_wakeup(event_filter_pid_sched_wakeup_probe_pre,
1700
+ tr, INT_MAX);
1701
+ register_trace_prio_sched_wakeup(event_filter_pid_sched_wakeup_probe_post,
1702
+ tr, 0);
1703
+
1704
+ register_trace_prio_sched_wakeup_new(event_filter_pid_sched_wakeup_probe_pre,
1705
+ tr, INT_MAX);
1706
+ register_trace_prio_sched_wakeup_new(event_filter_pid_sched_wakeup_probe_post,
1707
+ tr, 0);
1708
+
1709
+ register_trace_prio_sched_waking(event_filter_pid_sched_wakeup_probe_pre,
1710
+ tr, INT_MAX);
1711
+ register_trace_prio_sched_waking(event_filter_pid_sched_wakeup_probe_post,
1712
+ tr, 0);
15901713 }
15911714
15921715 static ssize_t
1593
-ftrace_event_pid_write(struct file *filp, const char __user *ubuf,
1594
- size_t cnt, loff_t *ppos)
1716
+event_pid_write(struct file *filp, const char __user *ubuf,
1717
+ size_t cnt, loff_t *ppos, int type)
15951718 {
15961719 struct seq_file *m = filp->private_data;
15971720 struct trace_array *tr = m->private;
15981721 struct trace_pid_list *filtered_pids = NULL;
1722
+ struct trace_pid_list *other_pids = NULL;
15991723 struct trace_pid_list *pid_list;
16001724 struct trace_event_file *file;
16011725 ssize_t ret;
....@@ -1609,14 +1733,26 @@
16091733
16101734 mutex_lock(&event_mutex);
16111735
1612
- filtered_pids = rcu_dereference_protected(tr->filtered_pids,
1613
- lockdep_is_held(&event_mutex));
1736
+ if (type == TRACE_PIDS) {
1737
+ filtered_pids = rcu_dereference_protected(tr->filtered_pids,
1738
+ lockdep_is_held(&event_mutex));
1739
+ other_pids = rcu_dereference_protected(tr->filtered_no_pids,
1740
+ lockdep_is_held(&event_mutex));
1741
+ } else {
1742
+ filtered_pids = rcu_dereference_protected(tr->filtered_no_pids,
1743
+ lockdep_is_held(&event_mutex));
1744
+ other_pids = rcu_dereference_protected(tr->filtered_pids,
1745
+ lockdep_is_held(&event_mutex));
1746
+ }
16141747
16151748 ret = trace_pid_write(filtered_pids, &pid_list, ubuf, cnt);
16161749 if (ret < 0)
16171750 goto out;
16181751
1619
- rcu_assign_pointer(tr->filtered_pids, pid_list);
1752
+ if (type == TRACE_PIDS)
1753
+ rcu_assign_pointer(tr->filtered_pids, pid_list);
1754
+ else
1755
+ rcu_assign_pointer(tr->filtered_no_pids, pid_list);
16201756
16211757 list_for_each_entry(file, &tr->events, list) {
16221758 set_bit(EVENT_FILE_FL_PID_FILTER_BIT, &file->flags);
....@@ -1625,32 +1761,8 @@
16251761 if (filtered_pids) {
16261762 tracepoint_synchronize_unregister();
16271763 trace_free_pid_list(filtered_pids);
1628
- } else if (pid_list) {
1629
- /*
1630
- * Register a probe that is called before all other probes
1631
- * to set ignore_pid if next or prev do not match.
1632
- * Register a probe this is called after all other probes
1633
- * to only keep ignore_pid set if next pid matches.
1634
- */
1635
- register_trace_prio_sched_switch(event_filter_pid_sched_switch_probe_pre,
1636
- tr, INT_MAX);
1637
- register_trace_prio_sched_switch(event_filter_pid_sched_switch_probe_post,
1638
- tr, 0);
1639
-
1640
- register_trace_prio_sched_wakeup(event_filter_pid_sched_wakeup_probe_pre,
1641
- tr, INT_MAX);
1642
- register_trace_prio_sched_wakeup(event_filter_pid_sched_wakeup_probe_post,
1643
- tr, 0);
1644
-
1645
- register_trace_prio_sched_wakeup_new(event_filter_pid_sched_wakeup_probe_pre,
1646
- tr, INT_MAX);
1647
- register_trace_prio_sched_wakeup_new(event_filter_pid_sched_wakeup_probe_post,
1648
- tr, 0);
1649
-
1650
- register_trace_prio_sched_waking(event_filter_pid_sched_wakeup_probe_pre,
1651
- tr, INT_MAX);
1652
- register_trace_prio_sched_waking(event_filter_pid_sched_wakeup_probe_post,
1653
- tr, 0);
1764
+ } else if (pid_list && !other_pids) {
1765
+ register_pid_events(tr);
16541766 }
16551767
16561768 /*
....@@ -1669,9 +1781,24 @@
16691781 return ret;
16701782 }
16711783
1784
+static ssize_t
1785
+ftrace_event_pid_write(struct file *filp, const char __user *ubuf,
1786
+ size_t cnt, loff_t *ppos)
1787
+{
1788
+ return event_pid_write(filp, ubuf, cnt, ppos, TRACE_PIDS);
1789
+}
1790
+
1791
+static ssize_t
1792
+ftrace_event_npid_write(struct file *filp, const char __user *ubuf,
1793
+ size_t cnt, loff_t *ppos)
1794
+{
1795
+ return event_pid_write(filp, ubuf, cnt, ppos, TRACE_NO_PIDS);
1796
+}
1797
+
16721798 static int ftrace_event_avail_open(struct inode *inode, struct file *file);
16731799 static int ftrace_event_set_open(struct inode *inode, struct file *file);
16741800 static int ftrace_event_set_pid_open(struct inode *inode, struct file *file);
1801
+static int ftrace_event_set_npid_open(struct inode *inode, struct file *file);
16751802 static int ftrace_event_release(struct inode *inode, struct file *file);
16761803
16771804 static const struct seq_operations show_event_seq_ops = {
....@@ -1695,6 +1822,13 @@
16951822 .stop = p_stop,
16961823 };
16971824
1825
+static const struct seq_operations show_set_no_pid_seq_ops = {
1826
+ .start = np_start,
1827
+ .next = np_next,
1828
+ .show = trace_pid_show,
1829
+ .stop = p_stop,
1830
+};
1831
+
16981832 static const struct file_operations ftrace_avail_fops = {
16991833 .open = ftrace_event_avail_open,
17001834 .read = seq_read,
....@@ -1714,6 +1848,14 @@
17141848 .open = ftrace_event_set_pid_open,
17151849 .read = seq_read,
17161850 .write = ftrace_event_pid_write,
1851
+ .llseek = seq_lseek,
1852
+ .release = ftrace_event_release,
1853
+};
1854
+
1855
+static const struct file_operations ftrace_set_event_notrace_pid_fops = {
1856
+ .open = ftrace_event_set_npid_open,
1857
+ .read = seq_read,
1858
+ .write = ftrace_event_npid_write,
17171859 .llseek = seq_lseek,
17181860 .release = ftrace_event_release,
17191861 };
....@@ -1781,6 +1923,10 @@
17811923 struct seq_file *m;
17821924 int ret;
17831925
1926
+ ret = security_locked_down(LOCKDOWN_TRACEFS);
1927
+ if (ret)
1928
+ return ret;
1929
+
17841930 ret = seq_open(file, seq_ops);
17851931 if (ret < 0)
17861932 return ret;
....@@ -1805,6 +1951,7 @@
18051951 {
18061952 const struct seq_operations *seq_ops = &show_event_seq_ops;
18071953
1954
+ /* Checks for tracefs lockdown */
18081955 return ftrace_event_open(inode, file, seq_ops);
18091956 }
18101957
....@@ -1815,8 +1962,9 @@
18151962 struct trace_array *tr = inode->i_private;
18161963 int ret;
18171964
1818
- if (trace_array_get(tr) < 0)
1819
- return -ENODEV;
1965
+ ret = tracing_check_open_get_tr(tr);
1966
+ if (ret)
1967
+ return ret;
18201968
18211969 if ((file->f_mode & FMODE_WRITE) &&
18221970 (file->f_flags & O_TRUNC))
....@@ -1835,12 +1983,34 @@
18351983 struct trace_array *tr = inode->i_private;
18361984 int ret;
18371985
1838
- if (trace_array_get(tr) < 0)
1839
- return -ENODEV;
1986
+ ret = tracing_check_open_get_tr(tr);
1987
+ if (ret)
1988
+ return ret;
18401989
18411990 if ((file->f_mode & FMODE_WRITE) &&
18421991 (file->f_flags & O_TRUNC))
1843
- ftrace_clear_event_pids(tr);
1992
+ ftrace_clear_event_pids(tr, TRACE_PIDS);
1993
+
1994
+ ret = ftrace_event_open(inode, file, seq_ops);
1995
+ if (ret < 0)
1996
+ trace_array_put(tr);
1997
+ return ret;
1998
+}
1999
+
2000
+static int
2001
+ftrace_event_set_npid_open(struct inode *inode, struct file *file)
2002
+{
2003
+ const struct seq_operations *seq_ops = &show_set_no_pid_seq_ops;
2004
+ struct trace_array *tr = inode->i_private;
2005
+ int ret;
2006
+
2007
+ ret = tracing_check_open_get_tr(tr);
2008
+ if (ret)
2009
+ return ret;
2010
+
2011
+ if ((file->f_mode & FMODE_WRITE) &&
2012
+ (file->f_flags & O_TRUNC))
2013
+ ftrace_clear_event_pids(tr, TRACE_NO_PIDS);
18442014
18452015 ret = ftrace_event_open(inode, file, seq_ops);
18462016 if (ret < 0)
....@@ -1957,11 +2127,47 @@
19572127 }
19582128
19592129 static int
2130
+event_define_fields(struct trace_event_call *call)
2131
+{
2132
+ struct list_head *head;
2133
+ int ret = 0;
2134
+
2135
+ /*
2136
+ * Other events may have the same class. Only update
2137
+ * the fields if they are not already defined.
2138
+ */
2139
+ head = trace_get_fields(call);
2140
+ if (list_empty(head)) {
2141
+ struct trace_event_fields *field = call->class->fields_array;
2142
+ unsigned int offset = sizeof(struct trace_entry);
2143
+
2144
+ for (; field->type; field++) {
2145
+ if (field->type == TRACE_FUNCTION_TYPE) {
2146
+ field->define_fields(call);
2147
+ break;
2148
+ }
2149
+
2150
+ offset = ALIGN(offset, field->align);
2151
+ ret = trace_define_field(call, field->type, field->name,
2152
+ offset, field->size,
2153
+ field->is_signed, field->filter_type);
2154
+ if (WARN_ON_ONCE(ret)) {
2155
+ pr_err("error code is %d\n", ret);
2156
+ break;
2157
+ }
2158
+
2159
+ offset += field->size;
2160
+ }
2161
+ }
2162
+
2163
+ return ret;
2164
+}
2165
+
2166
+static int
19602167 event_create_dir(struct dentry *parent, struct trace_event_file *file)
19612168 {
19622169 struct trace_event_call *call = file->event_call;
19632170 struct trace_array *tr = file->tr;
1964
- struct list_head *head;
19652171 struct dentry *d_events;
19662172 const char *name;
19672173 int ret;
....@@ -1995,18 +2201,10 @@
19952201 &ftrace_event_id_fops);
19962202 #endif
19972203
1998
- /*
1999
- * Other events may have the same class. Only update
2000
- * the fields if they are not already defined.
2001
- */
2002
- head = trace_get_fields(call);
2003
- if (list_empty(head)) {
2004
- ret = call->class->define_fields(call);
2005
- if (ret < 0) {
2006
- pr_warn("Could not initialize trace point events/%s\n",
2007
- name);
2008
- return -1;
2009
- }
2204
+ ret = event_define_fields(call);
2205
+ if (ret < 0) {
2206
+ pr_warn("Could not initialize trace point events/%s\n", name);
2207
+ return ret;
20102208 }
20112209
20122210 /*
....@@ -2025,8 +2223,18 @@
20252223 trace_create_file("hist", 0444, file->dir, file,
20262224 &event_hist_fops);
20272225 #endif
2226
+#ifdef CONFIG_HIST_TRIGGERS_DEBUG
2227
+ trace_create_file("hist_debug", 0444, file->dir, file,
2228
+ &event_hist_debug_fops);
2229
+#endif
20282230 trace_create_file("format", 0444, file->dir, call,
20292231 &ftrace_event_format_fops);
2232
+
2233
+#ifdef CONFIG_TRACE_EVENT_INJECT
2234
+ if (call->event.type && call->class->reg)
2235
+ trace_create_file("inject", 0200, file->dir, file,
2236
+ &event_inject_fops);
2237
+#endif
20302238
20312239 return 0;
20322240 }
....@@ -2255,6 +2463,7 @@
22552463 trace_create_new_event(struct trace_event_call *call,
22562464 struct trace_array *tr)
22572465 {
2466
+ struct trace_pid_list *no_pid_list;
22582467 struct trace_pid_list *pid_list;
22592468 struct trace_event_file *file;
22602469
....@@ -2264,8 +2473,10 @@
22642473
22652474 pid_list = rcu_dereference_protected(tr->filtered_pids,
22662475 lockdep_is_held(&event_mutex));
2476
+ no_pid_list = rcu_dereference_protected(tr->filtered_no_pids,
2477
+ lockdep_is_held(&event_mutex));
22672478
2268
- if (pid_list)
2479
+ if (pid_list || no_pid_list)
22692480 file->flags |= EVENT_FILE_FL_PID_FILTER;
22702481
22712482 file->event_call = call;
....@@ -2288,7 +2499,10 @@
22882499 if (!file)
22892500 return -ENOMEM;
22902501
2291
- return event_create_dir(tr->event_dir, file);
2502
+ if (eventdir_initialized)
2503
+ return event_create_dir(tr->event_dir, file);
2504
+ else
2505
+ return event_define_fields(call);
22922506 }
22932507
22942508 /*
....@@ -2296,7 +2510,7 @@
22962510 * for enabling events at boot. We want to enable events before
22972511 * the filesystem is initialized.
22982512 */
2299
-static __init int
2513
+static int
23002514 __trace_early_add_new_event(struct trace_event_call *call,
23012515 struct trace_array *tr)
23022516 {
....@@ -2306,13 +2520,14 @@
23062520 if (!file)
23072521 return -ENOMEM;
23082522
2309
- return 0;
2523
+ return event_define_fields(call);
23102524 }
23112525
23122526 struct ftrace_module_file_ops;
23132527 static void __add_event_to_tracers(struct trace_event_call *call);
23142528
2315
-int trace_add_event_call_nolock(struct trace_event_call *call)
2529
+/* Add an additional event_call dynamically */
2530
+int trace_add_event_call(struct trace_event_call *call)
23162531 {
23172532 int ret;
23182533 lockdep_assert_held(&event_mutex);
....@@ -2324,17 +2539,6 @@
23242539 __add_event_to_tracers(call);
23252540
23262541 mutex_unlock(&trace_types_lock);
2327
- return ret;
2328
-}
2329
-
2330
-/* Add an additional event_call dynamically */
2331
-int trace_add_event_call(struct trace_event_call *call)
2332
-{
2333
- int ret;
2334
-
2335
- mutex_lock(&event_mutex);
2336
- ret = trace_add_event_call_nolock(call);
2337
- mutex_unlock(&event_mutex);
23382542 return ret;
23392543 }
23402544
....@@ -2368,7 +2572,10 @@
23682572 * TRACE_REG_UNREGISTER.
23692573 */
23702574 if (file->flags & EVENT_FILE_FL_ENABLED)
2371
- return -EBUSY;
2575
+ goto busy;
2576
+
2577
+ if (file->flags & EVENT_FILE_FL_WAS_ENABLED)
2578
+ tr->clear_trace = true;
23722579 /*
23732580 * The do_for_each_event_file_safe() is
23742581 * a double loop. After finding the call for this
....@@ -2381,10 +2588,16 @@
23812588 __trace_remove_event_call(call);
23822589
23832590 return 0;
2591
+ busy:
2592
+ /* No need to clear the trace now */
2593
+ list_for_each_entry(tr, &ftrace_trace_arrays, list) {
2594
+ tr->clear_trace = false;
2595
+ }
2596
+ return -EBUSY;
23842597 }
23852598
2386
-/* no event_mutex version */
2387
-int trace_remove_event_call_nolock(struct trace_event_call *call)
2599
+/* Remove an event_call */
2600
+int trace_remove_event_call(struct trace_event_call *call)
23882601 {
23892602 int ret;
23902603
....@@ -2395,18 +2608,6 @@
23952608 ret = probe_remove_event_call(call);
23962609 up_write(&trace_event_sem);
23972610 mutex_unlock(&trace_types_lock);
2398
-
2399
- return ret;
2400
-}
2401
-
2402
-/* Remove an event_call */
2403
-int trace_remove_event_call(struct trace_event_call *call)
2404
-{
2405
- int ret;
2406
-
2407
- mutex_lock(&event_mutex);
2408
- ret = trace_remove_event_call_nolock(call);
2409
- mutex_unlock(&event_mutex);
24102611
24112612 return ret;
24122613 }
....@@ -2481,7 +2682,7 @@
24812682 mutex_unlock(&trace_types_lock);
24822683 mutex_unlock(&event_mutex);
24832684
2484
- return 0;
2685
+ return NOTIFY_OK;
24852686 }
24862687
24872688 static struct notifier_block trace_module_nb = {
....@@ -2541,6 +2742,91 @@
25412742
25422743 return file;
25432744 }
2745
+
2746
+/**
2747
+ * trace_get_event_file - Find and return a trace event file
2748
+ * @instance: The name of the trace instance containing the event
2749
+ * @system: The name of the system containing the event
2750
+ * @event: The name of the event
2751
+ *
2752
+ * Return a trace event file given the trace instance name, trace
2753
+ * system, and trace event name. If the instance name is NULL, it
2754
+ * refers to the top-level trace array.
2755
+ *
2756
+ * This function will look it up and return it if found, after calling
2757
+ * trace_array_get() to prevent the instance from going away, and
2758
+ * increment the event's module refcount to prevent it from being
2759
+ * removed.
2760
+ *
2761
+ * To release the file, call trace_put_event_file(), which will call
2762
+ * trace_array_put() and decrement the event's module refcount.
2763
+ *
2764
+ * Return: The trace event on success, ERR_PTR otherwise.
2765
+ */
2766
+struct trace_event_file *trace_get_event_file(const char *instance,
2767
+ const char *system,
2768
+ const char *event)
2769
+{
2770
+ struct trace_array *tr = top_trace_array();
2771
+ struct trace_event_file *file = NULL;
2772
+ int ret = -EINVAL;
2773
+
2774
+ if (instance) {
2775
+ tr = trace_array_find_get(instance);
2776
+ if (!tr)
2777
+ return ERR_PTR(-ENOENT);
2778
+ } else {
2779
+ ret = trace_array_get(tr);
2780
+ if (ret)
2781
+ return ERR_PTR(ret);
2782
+ }
2783
+
2784
+ mutex_lock(&event_mutex);
2785
+
2786
+ file = find_event_file(tr, system, event);
2787
+ if (!file) {
2788
+ trace_array_put(tr);
2789
+ ret = -EINVAL;
2790
+ goto out;
2791
+ }
2792
+
2793
+ /* Don't let event modules unload while in use */
2794
+ ret = try_module_get(file->event_call->mod);
2795
+ if (!ret) {
2796
+ trace_array_put(tr);
2797
+ ret = -EBUSY;
2798
+ goto out;
2799
+ }
2800
+
2801
+ ret = 0;
2802
+ out:
2803
+ mutex_unlock(&event_mutex);
2804
+
2805
+ if (ret)
2806
+ file = ERR_PTR(ret);
2807
+
2808
+ return file;
2809
+}
2810
+EXPORT_SYMBOL_GPL(trace_get_event_file);
2811
+
2812
+/**
2813
+ * trace_put_event_file - Release a file from trace_get_event_file()
2814
+ * @file: The trace event file
2815
+ *
2816
+ * If a file was retrieved using trace_get_event_file(), this should
2817
+ * be called when it's no longer needed. It will cancel the previous
2818
+ * trace_array_get() called by that function, and decrement the
2819
+ * event's module refcount.
2820
+ */
2821
+void trace_put_event_file(struct trace_event_file *file)
2822
+{
2823
+ mutex_lock(&event_mutex);
2824
+ module_put(file->event_call->mod);
2825
+ mutex_unlock(&event_mutex);
2826
+
2827
+ trace_array_put(file->tr);
2828
+}
2829
+EXPORT_SYMBOL_GPL(trace_put_event_file);
25442830
25452831 #ifdef CONFIG_DYNAMIC_FTRACE
25462832
....@@ -2866,14 +3152,13 @@
28663152 #endif /* CONFIG_DYNAMIC_FTRACE */
28673153
28683154 /*
2869
- * The top level array has already had its trace_event_file
2870
- * descriptors created in order to allow for early events to
2871
- * be recorded. This function is called after the tracefs has been
2872
- * initialized, and we now have to create the files associated
2873
- * to the events.
3155
+ * The top level array and trace arrays created by boot-time tracing
3156
+ * have already had its trace_event_file descriptors created in order
3157
+ * to allow for early events to be recorded.
3158
+ * This function is called after the tracefs has been initialized,
3159
+ * and we now have to create the files associated to the events.
28743160 */
2875
-static __init void
2876
-__trace_early_add_event_dirs(struct trace_array *tr)
3161
+static void __trace_early_add_event_dirs(struct trace_array *tr)
28773162 {
28783163 struct trace_event_file *file;
28793164 int ret;
....@@ -2888,13 +3173,12 @@
28883173 }
28893174
28903175 /*
2891
- * For early boot up, the top trace array requires to have
2892
- * a list of events that can be enabled. This must be done before
2893
- * the filesystem is set up in order to allow events to be traced
2894
- * early.
3176
+ * For early boot up, the top trace array and the trace arrays created
3177
+ * by boot-time tracing require to have a list of events that can be
3178
+ * enabled. This must be done before the filesystem is set up in order
3179
+ * to allow events to be traced early.
28953180 */
2896
-static __init void
2897
-__trace_early_add_events(struct trace_array *tr)
3181
+void __trace_early_add_events(struct trace_array *tr)
28983182 {
28993183 struct trace_event_call *call;
29003184 int ret;
....@@ -2938,7 +3222,7 @@
29383222 {
29393223 strlcpy(bootup_event_buf, str, COMMAND_LINE_SIZE);
29403224 ring_buffer_expanded = true;
2941
- tracing_selftest_disabled = true;
3225
+ disable_tracing_selftest("running event tracing");
29423226
29433227 return 1;
29443228 }
....@@ -2977,6 +3261,11 @@
29773261 tr, &ftrace_set_event_pid_fops);
29783262 if (!entry)
29793263 pr_warn("Could not create tracefs 'set_event_pid' entry\n");
3264
+
3265
+ entry = tracefs_create_file("set_event_notrace_pid", 0644, parent,
3266
+ tr, &ftrace_set_event_notrace_pid_fops);
3267
+ if (!entry)
3268
+ pr_warn("Could not create tracefs 'set_event_notrace_pid' entry\n");
29803269
29813270 /* ring buffer internal formats */
29823271 entry = trace_create_file("header_page", 0444, d_events,
....@@ -3020,7 +3309,11 @@
30203309 goto out;
30213310
30223311 down_write(&trace_event_sem);
3023
- __trace_add_event_dirs(tr);
3312
+ /* If tr already has the event list, it is initialized in early boot. */
3313
+ if (unlikely(!list_empty(&tr->events)))
3314
+ __trace_early_add_event_dirs(tr);
3315
+ else
3316
+ __trace_add_event_dirs(tr);
30243317 up_write(&trace_event_sem);
30253318
30263319 out:
....@@ -3061,7 +3354,7 @@
30613354 clear_event_triggers(tr);
30623355
30633356 /* Clear the pid list */
3064
- __ftrace_clear_event_pids(tr);
3357
+ __ftrace_clear_event_pids(tr, TRACE_PIDS | TRACE_NO_PIDS);
30653358
30663359 /* Disable any running events */
30673360 __ftrace_set_clr_event_nolock(tr, NULL, NULL, NULL, 0);
....@@ -3071,7 +3364,7 @@
30713364
30723365 down_write(&trace_event_sem);
30733366 __trace_remove_event_dirs(tr);
3074
- tracefs_remove_recursive(tr->event_dir);
3367
+ tracefs_remove(tr->event_dir);
30753368 up_write(&trace_event_sem);
30763369
30773370 tr->event_dir = NULL;
....@@ -3176,10 +3469,21 @@
31763469
31773470 early_initcall(event_trace_enable_again);
31783471
3472
+/* Init fields which doesn't related to the tracefs */
3473
+static __init int event_trace_init_fields(void)
3474
+{
3475
+ if (trace_define_generic_fields())
3476
+ pr_warn("tracing: Failed to allocated generic fields");
3477
+
3478
+ if (trace_define_common_fields())
3479
+ pr_warn("tracing: Failed to allocate common fields");
3480
+
3481
+ return 0;
3482
+}
3483
+
31793484 __init int event_trace_init(void)
31803485 {
31813486 struct trace_array *tr;
3182
- struct dentry *d_tracer;
31833487 struct dentry *entry;
31843488 int ret;
31853489
....@@ -3187,22 +3491,12 @@
31873491 if (!tr)
31883492 return -ENODEV;
31893493
3190
- d_tracer = tracing_init_dentry();
3191
- if (IS_ERR(d_tracer))
3192
- return 0;
3193
-
3194
- entry = tracefs_create_file("available_events", 0444, d_tracer,
3494
+ entry = tracefs_create_file("available_events", 0444, NULL,
31953495 tr, &ftrace_avail_fops);
31963496 if (!entry)
31973497 pr_warn("Could not create tracefs 'available_events' entry\n");
31983498
3199
- if (trace_define_generic_fields())
3200
- pr_warn("tracing: Failed to allocated generic fields");
3201
-
3202
- if (trace_define_common_fields())
3203
- pr_warn("tracing: Failed to allocate common fields");
3204
-
3205
- ret = early_event_add_tracer(d_tracer, tr);
3499
+ ret = early_event_add_tracer(NULL, tr);
32063500 if (ret)
32073501 return ret;
32083502
....@@ -3211,6 +3505,9 @@
32113505 if (ret)
32123506 pr_warn("Failed to register trace events module notifier\n");
32133507 #endif
3508
+
3509
+ eventdir_initialized = true;
3510
+
32143511 return 0;
32153512 }
32163513
....@@ -3219,9 +3516,10 @@
32193516 event_trace_memsetup();
32203517 init_ftrace_syscalls();
32213518 event_trace_enable();
3519
+ event_trace_init_fields();
32223520 }
32233521
3224
-#ifdef CONFIG_FTRACE_STARTUP_TEST
3522
+#ifdef CONFIG_EVENT_TRACE_STARTUP_TEST
32253523
32263524 static DEFINE_SPINLOCK(test_spinlock);
32273525 static DEFINE_SPINLOCK(test_spinlock_irq);
....@@ -3398,8 +3696,8 @@
33983696 function_test_events_call(unsigned long ip, unsigned long parent_ip,
33993697 struct ftrace_ops *op, struct pt_regs *pt_regs)
34003698 {
3699
+ struct trace_buffer *buffer;
34013700 struct ring_buffer_event *event;
3402
- struct ring_buffer *buffer;
34033701 struct ftrace_entry *entry;
34043702 unsigned long flags;
34053703 long disabled;