Commit 460a75a6 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'trace-v6.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace

Pull tracing fixes from Steven Rostedt:

 - Do not stop trace events in modules if TAINT_TEST is set

 - Do not clobber mount options when tracefs is mounted a second time

 - Prevent crash of kprobes in gate area

 - Add static annotation to some non global functions

 - Add some entries into the MAINTAINERS file

 - Fix check of event_mutex held when accessing trigger list

 - Add some __init/__exit annotations

 - Fix reporting of what called hardirq_{enable,disable}_ip function

* tag 'trace-v6.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace:
  tracefs: Only clobber mode/uid/gid on remount if asked
  kprobes: Prohibit probes in gate area
  rv/reactor: add __init/__exit annotations to module init/exit funcs
  tracing: Fix to check event_mutex is held while accessing trigger list
  tracing: hold caller_addr to hardirq_{enable,disable}_ip
  tracepoint: Allow trace events in modules with TAINT_TEST
  MAINTAINERS: add scripts/tracing/ to TRACING
  MAINTAINERS: Add Runtime Verification (RV) entry
  rv/monitors: Make monitor's automata definition static
parents f448dda8 47311db8
...@@ -17745,6 +17745,17 @@ L: linux-rdma@vger.kernel.org ...@@ -17745,6 +17745,17 @@ L: linux-rdma@vger.kernel.org
S: Maintained S: Maintained
F: drivers/infiniband/ulp/rtrs/ F: drivers/infiniband/ulp/rtrs/
RUNTIME VERIFICATION (RV)
M: Daniel Bristot de Oliveira <bristot@kernel.org>
M: Steven Rostedt <rostedt@goodmis.org>
L: linux-trace-devel@vger.kernel.org
S: Maintained
F: Documentation/trace/rv/
F: include/linux/rv.h
F: include/rv/
F: kernel/trace/rv/
F: tools/verification/
RXRPC SOCKETS (AF_RXRPC) RXRPC SOCKETS (AF_RXRPC)
M: David Howells <dhowells@redhat.com> M: David Howells <dhowells@redhat.com>
M: Marc Dionne <marc.dionne@auristor.com> M: Marc Dionne <marc.dionne@auristor.com>
...@@ -20611,6 +20622,7 @@ F: include/*/ftrace.h ...@@ -20611,6 +20622,7 @@ F: include/*/ftrace.h
F: include/linux/trace*.h F: include/linux/trace*.h
F: include/trace/ F: include/trace/
F: kernel/trace/ F: kernel/trace/
F: scripts/tracing/
F: tools/testing/selftests/ftrace/ F: tools/testing/selftests/ftrace/
TRACING MMIO ACCESSES (MMIOTRACE) TRACING MMIO ACCESSES (MMIOTRACE)
......
...@@ -141,6 +141,8 @@ struct tracefs_mount_opts { ...@@ -141,6 +141,8 @@ struct tracefs_mount_opts {
kuid_t uid; kuid_t uid;
kgid_t gid; kgid_t gid;
umode_t mode; umode_t mode;
/* Opt_* bitfield. */
unsigned int opts;
}; };
enum { enum {
...@@ -241,6 +243,7 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts) ...@@ -241,6 +243,7 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts)
kgid_t gid; kgid_t gid;
char *p; char *p;
opts->opts = 0;
opts->mode = TRACEFS_DEFAULT_MODE; opts->mode = TRACEFS_DEFAULT_MODE;
while ((p = strsep(&data, ",")) != NULL) { while ((p = strsep(&data, ",")) != NULL) {
...@@ -275,24 +278,36 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts) ...@@ -275,24 +278,36 @@ static int tracefs_parse_options(char *data, struct tracefs_mount_opts *opts)
* but traditionally tracefs has ignored all mount options * but traditionally tracefs has ignored all mount options
*/ */
} }
opts->opts |= BIT(token);
} }
return 0; return 0;
} }
static int tracefs_apply_options(struct super_block *sb) static int tracefs_apply_options(struct super_block *sb, bool remount)
{ {
struct tracefs_fs_info *fsi = sb->s_fs_info; struct tracefs_fs_info *fsi = sb->s_fs_info;
struct inode *inode = d_inode(sb->s_root); struct inode *inode = d_inode(sb->s_root);
struct tracefs_mount_opts *opts = &fsi->mount_opts; struct tracefs_mount_opts *opts = &fsi->mount_opts;
inode->i_mode &= ~S_IALLUGO; /*
inode->i_mode |= opts->mode; * On remount, only reset mode/uid/gid if they were provided as mount
* options.
*/
if (!remount || opts->opts & BIT(Opt_mode)) {
inode->i_mode &= ~S_IALLUGO;
inode->i_mode |= opts->mode;
}
inode->i_uid = opts->uid; if (!remount || opts->opts & BIT(Opt_uid))
inode->i_uid = opts->uid;
/* Set all the group ids to the mount option */ if (!remount || opts->opts & BIT(Opt_gid)) {
set_gid(sb->s_root, opts->gid); /* Set all the group ids to the mount option */
set_gid(sb->s_root, opts->gid);
}
return 0; return 0;
} }
...@@ -307,7 +322,7 @@ static int tracefs_remount(struct super_block *sb, int *flags, char *data) ...@@ -307,7 +322,7 @@ static int tracefs_remount(struct super_block *sb, int *flags, char *data)
if (err) if (err)
goto fail; goto fail;
tracefs_apply_options(sb); tracefs_apply_options(sb, true);
fail: fail:
return err; return err;
...@@ -359,7 +374,7 @@ static int trace_fill_super(struct super_block *sb, void *data, int silent) ...@@ -359,7 +374,7 @@ static int trace_fill_super(struct super_block *sb, void *data, int silent)
sb->s_op = &tracefs_super_operations; sb->s_op = &tracefs_super_operations;
tracefs_apply_options(sb); tracefs_apply_options(sb, false);
return 0; return 0;
......
...@@ -1562,6 +1562,7 @@ static int check_kprobe_address_safe(struct kprobe *p, ...@@ -1562,6 +1562,7 @@ static int check_kprobe_address_safe(struct kprobe *p,
/* Ensure it is not in reserved area nor out of text */ /* Ensure it is not in reserved area nor out of text */
if (!(core_kernel_text((unsigned long) p->addr) || if (!(core_kernel_text((unsigned long) p->addr) ||
is_module_text_address((unsigned long) p->addr)) || is_module_text_address((unsigned long) p->addr)) ||
in_gate_area_no_mm((unsigned long) p->addr) ||
within_kprobe_blacklist((unsigned long) p->addr) || within_kprobe_blacklist((unsigned long) p->addr) ||
jump_label_text_reserved(p->addr, p->addr) || jump_label_text_reserved(p->addr, p->addr) ||
static_call_text_reserved(p->addr, p->addr) || static_call_text_reserved(p->addr, p->addr) ||
......
...@@ -27,7 +27,7 @@ struct automaton_wip { ...@@ -27,7 +27,7 @@ struct automaton_wip {
bool final_states[state_max_wip]; bool final_states[state_max_wip];
}; };
struct automaton_wip automaton_wip = { static struct automaton_wip automaton_wip = {
.state_names = { .state_names = {
"preemptive", "preemptive",
"non_preemptive" "non_preemptive"
......
...@@ -27,7 +27,7 @@ struct automaton_wwnr { ...@@ -27,7 +27,7 @@ struct automaton_wwnr {
bool final_states[state_max_wwnr]; bool final_states[state_max_wwnr];
}; };
struct automaton_wwnr automaton_wwnr = { static struct automaton_wwnr automaton_wwnr = {
.state_names = { .state_names = {
"not_running", "not_running",
"running" "running"
......
...@@ -24,13 +24,13 @@ static struct rv_reactor rv_panic = { ...@@ -24,13 +24,13 @@ static struct rv_reactor rv_panic = {
.react = rv_panic_reaction .react = rv_panic_reaction
}; };
static int register_react_panic(void) static int __init register_react_panic(void)
{ {
rv_register_reactor(&rv_panic); rv_register_reactor(&rv_panic);
return 0; return 0;
} }
static void unregister_react_panic(void) static void __exit unregister_react_panic(void)
{ {
rv_unregister_reactor(&rv_panic); rv_unregister_reactor(&rv_panic);
} }
......
...@@ -23,13 +23,13 @@ static struct rv_reactor rv_printk = { ...@@ -23,13 +23,13 @@ static struct rv_reactor rv_printk = {
.react = rv_printk_reaction .react = rv_printk_reaction
}; };
static int register_react_printk(void) static int __init register_react_printk(void)
{ {
rv_register_reactor(&rv_printk); rv_register_reactor(&rv_printk);
return 0; return 0;
} }
static void unregister_react_printk(void) static void __exit unregister_react_printk(void)
{ {
rv_unregister_reactor(&rv_printk); rv_unregister_reactor(&rv_printk);
} }
......
...@@ -142,7 +142,8 @@ static bool check_user_trigger(struct trace_event_file *file) ...@@ -142,7 +142,8 @@ static bool check_user_trigger(struct trace_event_file *file)
{ {
struct event_trigger_data *data; struct event_trigger_data *data;
list_for_each_entry_rcu(data, &file->triggers, list) { list_for_each_entry_rcu(data, &file->triggers, list,
lockdep_is_held(&event_mutex)) {
if (data->flags & EVENT_TRIGGER_FL_PROBE) if (data->flags & EVENT_TRIGGER_FL_PROBE)
continue; continue;
return true; return true;
......
...@@ -95,14 +95,14 @@ __visible void trace_hardirqs_on_caller(unsigned long caller_addr) ...@@ -95,14 +95,14 @@ __visible void trace_hardirqs_on_caller(unsigned long caller_addr)
} }
lockdep_hardirqs_on_prepare(); lockdep_hardirqs_on_prepare();
lockdep_hardirqs_on(CALLER_ADDR0); lockdep_hardirqs_on(caller_addr);
} }
EXPORT_SYMBOL(trace_hardirqs_on_caller); EXPORT_SYMBOL(trace_hardirqs_on_caller);
NOKPROBE_SYMBOL(trace_hardirqs_on_caller); NOKPROBE_SYMBOL(trace_hardirqs_on_caller);
__visible void trace_hardirqs_off_caller(unsigned long caller_addr) __visible void trace_hardirqs_off_caller(unsigned long caller_addr)
{ {
lockdep_hardirqs_off(CALLER_ADDR0); lockdep_hardirqs_off(caller_addr);
if (!this_cpu_read(tracing_irq_cpu)) { if (!this_cpu_read(tracing_irq_cpu)) {
this_cpu_write(tracing_irq_cpu, 1); this_cpu_write(tracing_irq_cpu, 1);
......
...@@ -571,7 +571,8 @@ static void for_each_tracepoint_range( ...@@ -571,7 +571,8 @@ static void for_each_tracepoint_range(
bool trace_module_has_bad_taint(struct module *mod) bool trace_module_has_bad_taint(struct module *mod)
{ {
return mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP) | return mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP) |
(1 << TAINT_UNSIGNED_MODULE)); (1 << TAINT_UNSIGNED_MODULE) |
(1 << TAINT_TEST));
} }
static BLOCKING_NOTIFIER_HEAD(tracepoint_notify_list); static BLOCKING_NOTIFIER_HEAD(tracepoint_notify_list);
...@@ -647,7 +648,7 @@ static int tracepoint_module_coming(struct module *mod) ...@@ -647,7 +648,7 @@ static int tracepoint_module_coming(struct module *mod)
/* /*
* We skip modules that taint the kernel, especially those with different * We skip modules that taint the kernel, especially those with different
* module headers (for forced load), to make sure we don't cause a crash. * module headers (for forced load), to make sure we don't cause a crash.
* Staging, out-of-tree, and unsigned GPL modules are fine. * Staging, out-of-tree, unsigned GPL, and test modules are fine.
*/ */
if (trace_module_has_bad_taint(mod)) if (trace_module_has_bad_taint(mod))
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment