diff options
| -rw-r--r-- | include/linux/tracepoint.h | 6 | ||||
| -rw-r--r-- | kernel/trace/trace_events.c | 10 | ||||
| -rw-r--r-- | kernel/tracepoint.c | 7 |
3 files changed, 22 insertions, 1 deletions
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h index accc497f8d72..7159a0a933df 100644 --- a/include/linux/tracepoint.h +++ b/include/linux/tracepoint.h | |||
| @@ -60,6 +60,12 @@ struct tp_module { | |||
| 60 | unsigned int num_tracepoints; | 60 | unsigned int num_tracepoints; |
| 61 | struct tracepoint * const *tracepoints_ptrs; | 61 | struct tracepoint * const *tracepoints_ptrs; |
| 62 | }; | 62 | }; |
| 63 | bool trace_module_has_bad_taint(struct module *mod); | ||
| 64 | #else | ||
| 65 | static inline bool trace_module_has_bad_taint(struct module *mod) | ||
| 66 | { | ||
| 67 | return false; | ||
| 68 | } | ||
| 63 | #endif /* CONFIG_MODULES */ | 69 | #endif /* CONFIG_MODULES */ |
| 64 | 70 | ||
| 65 | struct tracepoint_iter { | 71 | struct tracepoint_iter { |
diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c index e71ffd4eccb5..f3989ceb5cd5 100644 --- a/kernel/trace/trace_events.c +++ b/kernel/trace/trace_events.c | |||
| @@ -1777,6 +1777,16 @@ static void trace_module_add_events(struct module *mod) | |||
| 1777 | { | 1777 | { |
| 1778 | struct ftrace_event_call **call, **start, **end; | 1778 | struct ftrace_event_call **call, **start, **end; |
| 1779 | 1779 | ||
| 1780 | if (!mod->num_trace_events) | ||
| 1781 | return; | ||
| 1782 | |||
| 1783 | /* Don't add infrastructure for mods without tracepoints */ | ||
| 1784 | if (trace_module_has_bad_taint(mod)) { | ||
| 1785 | pr_err("%s: module has bad taint, not creating trace events\n", | ||
| 1786 | mod->name); | ||
| 1787 | return; | ||
| 1788 | } | ||
| 1789 | |||
| 1780 | start = mod->trace_events; | 1790 | start = mod->trace_events; |
| 1781 | end = mod->trace_events + mod->num_trace_events; | 1791 | end = mod->trace_events + mod->num_trace_events; |
| 1782 | 1792 | ||
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c index 29f26540e9c9..031cc5655a51 100644 --- a/kernel/tracepoint.c +++ b/kernel/tracepoint.c | |||
| @@ -631,6 +631,11 @@ void tracepoint_iter_reset(struct tracepoint_iter *iter) | |||
| 631 | EXPORT_SYMBOL_GPL(tracepoint_iter_reset); | 631 | EXPORT_SYMBOL_GPL(tracepoint_iter_reset); |
| 632 | 632 | ||
| 633 | #ifdef CONFIG_MODULES | 633 | #ifdef CONFIG_MODULES |
| 634 | bool trace_module_has_bad_taint(struct module *mod) | ||
| 635 | { | ||
| 636 | return mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP)); | ||
| 637 | } | ||
| 638 | |||
| 634 | static int tracepoint_module_coming(struct module *mod) | 639 | static int tracepoint_module_coming(struct module *mod) |
| 635 | { | 640 | { |
| 636 | struct tp_module *tp_mod, *iter; | 641 | struct tp_module *tp_mod, *iter; |
| @@ -641,7 +646,7 @@ static int tracepoint_module_coming(struct module *mod) | |||
| 641 | * module headers (for forced load), to make sure we don't cause a crash. | 646 | * module headers (for forced load), to make sure we don't cause a crash. |
| 642 | * Staging and out-of-tree GPL modules are fine. | 647 | * Staging and out-of-tree GPL modules are fine. |
| 643 | */ | 648 | */ |
| 644 | if (mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP))) | 649 | if (trace_module_has_bad_taint(mod)) |
| 645 | return 0; | 650 | return 0; |
| 646 | mutex_lock(&tracepoints_mutex); | 651 | mutex_lock(&tracepoints_mutex); |
| 647 | tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL); | 652 | tp_mod = kmalloc(sizeof(struct tp_module), GFP_KERNEL); |
