diff options
Diffstat (limited to 'kernel/trace')
29 files changed, 66 insertions, 57 deletions
| diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile index 90f2701d92a7..19a15b2f1190 100644 --- a/kernel/trace/Makefile +++ b/kernel/trace/Makefile @@ -1,3 +1,4 @@ +# SPDX-License-Identifier: GPL-2.0  # Do not instrument the tracer itself: diff --git a/kernel/trace/blktrace.c b/kernel/trace/blktrace.c index 2a685b45b73b..45a3928544ce 100644 --- a/kernel/trace/blktrace.c +++ b/kernel/trace/blktrace.c @@ -648,6 +648,12 @@ int blk_trace_startstop(struct request_queue *q, int start)  }  EXPORT_SYMBOL_GPL(blk_trace_startstop); +/* + * When reading or writing the blktrace sysfs files, the references to the + * opened sysfs or device files should prevent the underlying block device + * from being removed. So no further delete protection is really needed. + */ +  /**   * blk_trace_ioctl: - handle the ioctls associated with tracing   * @bdev:	the block device @@ -665,7 +671,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)  	if (!q)  		return -ENXIO; -	mutex_lock(&bdev->bd_mutex); +	mutex_lock(&q->blk_trace_mutex);  	switch (cmd) {  	case BLKTRACESETUP: @@ -691,7 +697,7 @@ int blk_trace_ioctl(struct block_device *bdev, unsigned cmd, char __user *arg)  		break;  	} -	mutex_unlock(&bdev->bd_mutex); +	mutex_unlock(&q->blk_trace_mutex);  	return ret;  } @@ -1727,7 +1733,7 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev,  	if (q == NULL)  		goto out_bdput; -	mutex_lock(&bdev->bd_mutex); +	mutex_lock(&q->blk_trace_mutex);  	if (attr == &dev_attr_enable) {  		ret = sprintf(buf, "%u\n", !!q->blk_trace); @@ -1746,7 +1752,7 @@ static ssize_t sysfs_blk_trace_attr_show(struct device *dev,  		ret = sprintf(buf, "%llu\n", q->blk_trace->end_lba);  out_unlock_bdev: -	mutex_unlock(&bdev->bd_mutex); +	mutex_unlock(&q->blk_trace_mutex);  out_bdput:  	bdput(bdev);  out: @@ -1788,7 +1794,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,  	if (q == NULL)  		goto out_bdput; -	mutex_lock(&bdev->bd_mutex); +	mutex_lock(&q->blk_trace_mutex);  	if (attr == &dev_attr_enable) {  		if (value) @@ -1814,7 +1820,7 @@ static ssize_t sysfs_blk_trace_attr_store(struct device *dev,  	}  out_unlock_bdev: -	mutex_unlock(&bdev->bd_mutex); +	mutex_unlock(&q->blk_trace_mutex);  out_bdput:  	bdput(bdev);  out: diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 6abfafd7f173..8319e09e15b9 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -4954,9 +4954,6 @@ static char ftrace_graph_buf[FTRACE_FILTER_SIZE] __initdata;  static char ftrace_graph_notrace_buf[FTRACE_FILTER_SIZE] __initdata;  static int ftrace_graph_set_hash(struct ftrace_hash *hash, char *buffer); -static unsigned long save_global_trampoline; -static unsigned long save_global_flags; -  static int __init set_graph_function(char *str)  {  	strlcpy(ftrace_graph_buf, str, FTRACE_FILTER_SIZE); @@ -6808,17 +6805,6 @@ void unregister_ftrace_graph(void)  	unregister_pm_notifier(&ftrace_suspend_notifier);  	unregister_trace_sched_switch(ftrace_graph_probe_sched_switch, NULL); -#ifdef CONFIG_DYNAMIC_FTRACE -	/* -	 * Function graph does not allocate the trampoline, but -	 * other global_ops do. We need to reset the ALLOC_TRAMP flag -	 * if one was used. -	 */ -	global_ops.trampoline = save_global_trampoline; -	if (save_global_flags & FTRACE_OPS_FL_ALLOC_TRAMP) -		global_ops.flags |= FTRACE_OPS_FL_ALLOC_TRAMP; -#endif -   out:  	mutex_unlock(&ftrace_lock);  } diff --git a/kernel/trace/power-traces.c b/kernel/trace/power-traces.c index 0c7dee221dca..21bb161c2316 100644 --- a/kernel/trace/power-traces.c +++ b/kernel/trace/power-traces.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Power trace points   * diff --git a/kernel/trace/rpm-traces.c b/kernel/trace/rpm-traces.c index 4b3b5eaf94d1..25dec0b00280 100644 --- a/kernel/trace/rpm-traces.c +++ b/kernel/trace/rpm-traces.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Power trace points   * diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 5360b7aec57a..752e5daf0896 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -4020,11 +4020,17 @@ static int tracing_open(struct inode *inode, struct file *file)  	/* If this file was open for write, then erase contents */  	if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {  		int cpu = tracing_get_cpu(inode); +		struct trace_buffer *trace_buf = &tr->trace_buffer; + +#ifdef CONFIG_TRACER_MAX_TRACE +		if (tr->current_trace->print_max) +			trace_buf = &tr->max_buffer; +#endif  		if (cpu == RING_BUFFER_ALL_CPUS) -			tracing_reset_online_cpus(&tr->trace_buffer); +			tracing_reset_online_cpus(trace_buf);  		else -			tracing_reset(&tr->trace_buffer, cpu); +			tracing_reset(trace_buf, cpu);  	}  	if (file->f_mode & FMODE_READ) { @@ -5358,6 +5364,13 @@ static int tracing_set_tracer(struct trace_array *tr, const char *buf)  	if (t == tr->current_trace)  		goto out; +	/* Some tracers won't work on kernel command line */ +	if (system_state < SYSTEM_RUNNING && t->noboot) { +		pr_warn("Tracer '%s' is not allowed on command line, ignored\n", +			t->name); +		goto out; +	} +  	/* Some tracers are only allowed for the top level buffer */  	if (!trace_ok_for_array(t, tr)) {  		ret = -EINVAL; @@ -5667,7 +5680,7 @@ static int tracing_wait_pipe(struct file *filp)  		 *  		 * iter->pos will be 0 if we haven't read anything.  		 */ -		if (!tracing_is_on() && iter->pos) +		if (!tracer_tracing_is_on(iter->tr) && iter->pos)  			break;  		mutex_unlock(&iter->mutex); diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index fb5d54d0d1b3..401b0639116f 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef _LINUX_KERNEL_TRACE_H  #define _LINUX_KERNEL_TRACE_H @@ -444,6 +445,8 @@ struct tracer {  #ifdef CONFIG_TRACER_MAX_TRACE  	bool			use_max_tr;  #endif +	/* True if tracer cannot be enabled in kernel param */ +	bool			noboot;  }; diff --git a/kernel/trace/trace_benchmark.c b/kernel/trace/trace_benchmark.c index 16a8cf02eee9..79f838a75077 100644 --- a/kernel/trace/trace_benchmark.c +++ b/kernel/trace/trace_benchmark.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <linux/delay.h>  #include <linux/module.h>  #include <linux/kthread.h> diff --git a/kernel/trace/trace_benchmark.h b/kernel/trace/trace_benchmark.h index ebdbfc2f2a64..be1d86ff753d 100644 --- a/kernel/trace/trace_benchmark.h +++ b/kernel/trace/trace_benchmark.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #undef TRACE_SYSTEM  #define TRACE_SYSTEM benchmark diff --git a/kernel/trace/trace_branch.c b/kernel/trace/trace_branch.c index 4d8fdf3184dc..4ad967453b6f 100644 --- a/kernel/trace/trace_branch.c +++ b/kernel/trace/trace_branch.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * unlikely profiler   * diff --git a/kernel/trace/trace_entries.h b/kernel/trace/trace_entries.h index adcdbbeae010..e954ae3d82c0 100644 --- a/kernel/trace/trace_entries.h +++ b/kernel/trace/trace_entries.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  /*   * This file defines the trace event structures that go into the ring   * buffer directly. They are created via macros so that changes for them diff --git a/kernel/trace/trace_events_filter_test.h b/kernel/trace/trace_events_filter_test.h index bfd4dba0d603..39d7ef4f57cb 100644 --- a/kernel/trace/trace_events_filter_test.h +++ b/kernel/trace/trace_events_filter_test.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #undef TRACE_SYSTEM  #define TRACE_SYSTEM test diff --git a/kernel/trace/trace_export.c b/kernel/trace/trace_export.c index 39aa7aa66468..548e62eb5c46 100644 --- a/kernel/trace/trace_export.c +++ b/kernel/trace/trace_export.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * trace_export.c - export basic ftrace utilities to user space   * diff --git a/kernel/trace/trace_functions.c b/kernel/trace/trace_functions.c index a0910c0cdf2e..27f7ad12c4b1 100644 --- a/kernel/trace/trace_functions.c +++ b/kernel/trace/trace_functions.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * ring buffer based function tracer   * diff --git a/kernel/trace/trace_functions_graph.c b/kernel/trace/trace_functions_graph.c index b8f1f54731af..23c0b0cb5fb9 100644 --- a/kernel/trace/trace_functions_graph.c +++ b/kernel/trace/trace_functions_graph.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   *   * Function graph tracer. diff --git a/kernel/trace/trace_kdb.c b/kernel/trace/trace_kdb.c index 57149bce6aad..d953c163a079 100644 --- a/kernel/trace/trace_kdb.c +++ b/kernel/trace/trace_kdb.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * kdb helper for dumping the ftrace buffer   * diff --git a/kernel/trace/trace_mmiotrace.c b/kernel/trace/trace_mmiotrace.c index cd7480d0a201..b0388016b687 100644 --- a/kernel/trace/trace_mmiotrace.c +++ b/kernel/trace/trace_mmiotrace.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Memory mapped I/O tracing   * @@ -282,6 +283,7 @@ static struct tracer mmio_tracer __read_mostly =  	.close		= mmio_close,  	.read		= mmio_read,  	.print_line	= mmio_print_line, +	.noboot		= true,  };  __init static int init_mmio_trace(void) diff --git a/kernel/trace/trace_nop.c b/kernel/trace/trace_nop.c index 49f61fe96a6b..50523f953a5d 100644 --- a/kernel/trace/trace_nop.c +++ b/kernel/trace/trace_nop.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * nop tracer   * diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index bac629af2285..c738e764e2a5 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -656,15 +656,6 @@ int trace_print_lat_context(struct trace_iterator *iter)  	return !trace_seq_has_overflowed(s);  } -static const char state_to_char[] = TASK_STATE_TO_CHAR_STR; - -static int task_state_char(unsigned long state) -{ -	int bit = state ? __ffs(state) + 1 : 0; - -	return bit < sizeof(state_to_char) - 1 ? state_to_char[bit] : '?'; -} -  /**   * ftrace_find_event - find a registered event   * @type: the type of event to look for @@ -930,8 +921,8 @@ static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter,  	trace_assign_type(field, iter->ent); -	T = task_state_char(field->next_state); -	S = task_state_char(field->prev_state); +	T = __task_state_to_char(field->next_state); +	S = __task_state_to_char(field->prev_state);  	trace_find_cmdline(field->next_pid, comm);  	trace_seq_printf(&iter->seq,  			 " %5d:%3d:%c %s [%03d] %5d:%3d:%c %s\n", @@ -966,8 +957,8 @@ static int trace_ctxwake_raw(struct trace_iterator *iter, char S)  	trace_assign_type(field, iter->ent);  	if (!S) -		S = task_state_char(field->prev_state); -	T = task_state_char(field->next_state); +		S = __task_state_to_char(field->prev_state); +	T = __task_state_to_char(field->next_state);  	trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c\n",  			 field->prev_pid,  			 field->prev_prio, @@ -1002,8 +993,8 @@ static int trace_ctxwake_hex(struct trace_iterator *iter, char S)  	trace_assign_type(field, iter->ent);  	if (!S) -		S = task_state_char(field->prev_state); -	T = task_state_char(field->next_state); +		S = __task_state_to_char(field->prev_state); +	T = __task_state_to_char(field->next_state);  	SEQ_PUT_HEX_FIELD(s, field->prev_pid);  	SEQ_PUT_HEX_FIELD(s, field->prev_prio); diff --git a/kernel/trace/trace_output.h b/kernel/trace/trace_output.h index fabc49bcd493..dbba03ed96de 100644 --- a/kernel/trace/trace_output.h +++ b/kernel/trace/trace_output.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __TRACE_EVENTS_H  #define __TRACE_EVENTS_H diff --git a/kernel/trace/trace_sched_switch.c b/kernel/trace/trace_sched_switch.c index b341c02730be..e288168661e1 100644 --- a/kernel/trace/trace_sched_switch.c +++ b/kernel/trace/trace_sched_switch.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * trace context switch   * diff --git a/kernel/trace/trace_sched_wakeup.c b/kernel/trace/trace_sched_wakeup.c index ddec53b67646..7d461dcd4831 100644 --- a/kernel/trace/trace_sched_wakeup.c +++ b/kernel/trace/trace_sched_wakeup.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * trace task wakeup timings   * @@ -397,10 +398,10 @@ tracing_sched_switch_trace(struct trace_array *tr,  	entry	= ring_buffer_event_data(event);  	entry->prev_pid			= prev->pid;  	entry->prev_prio		= prev->prio; -	entry->prev_state		= prev->state; +	entry->prev_state		= __get_task_state(prev);  	entry->next_pid			= next->pid;  	entry->next_prio		= next->prio; -	entry->next_state		= next->state; +	entry->next_state		= __get_task_state(next);  	entry->next_cpu	= task_cpu(next);  	if (!call_filter_check_discard(call, entry, buffer, event)) @@ -425,10 +426,10 @@ tracing_sched_wakeup_trace(struct trace_array *tr,  	entry	= ring_buffer_event_data(event);  	entry->prev_pid			= curr->pid;  	entry->prev_prio		= curr->prio; -	entry->prev_state		= curr->state; +	entry->prev_state		= __get_task_state(curr);  	entry->next_pid			= wakee->pid;  	entry->next_prio		= wakee->prio; -	entry->next_state		= wakee->state; +	entry->next_state		= __get_task_state(wakee);  	entry->next_cpu			= task_cpu(wakee);  	if (!call_filter_check_discard(call, entry, buffer, event)) diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c index b17ec642793b..cd70eb5df38e 100644 --- a/kernel/trace/trace_selftest.c +++ b/kernel/trace/trace_selftest.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /* Include in trace.c */  #include <uapi/linux/sched/types.h> diff --git a/kernel/trace/trace_selftest_dynamic.c b/kernel/trace/trace_selftest_dynamic.c index b4c475a0a48b..8cda06a10d66 100644 --- a/kernel/trace/trace_selftest_dynamic.c +++ b/kernel/trace/trace_selftest_dynamic.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include "trace.h"  int DYN_FTRACE_TEST_NAME(void) diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index a4df67cbc711..719a52a4064a 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Copyright (C) 2008 Steven Rostedt <[email protected]>   * @@ -96,23 +97,9 @@ check_stack(unsigned long ip, unsigned long *stack)  	if (in_nmi())  		return; -	/* -	 * There's a slight chance that we are tracing inside the -	 * RCU infrastructure, and rcu_irq_enter() will not work -	 * as expected. -	 */ -	if (unlikely(rcu_irq_enter_disabled())) -		return; -  	local_irq_save(flags);  	arch_spin_lock(&stack_trace_max_lock); -	/* -	 * RCU may not be watching, make it see us. -	 * The stack trace code uses rcu_sched. -	 */ -	rcu_irq_enter(); -  	/* In case another CPU set the tracer_frame on us */  	if (unlikely(!frame_size))  		this_size -= tracer_frame; @@ -205,7 +192,6 @@ check_stack(unsigned long ip, unsigned long *stack)  	}   out: -	rcu_irq_exit();  	arch_spin_unlock(&stack_trace_max_lock);  	local_irq_restore(flags);  } diff --git a/kernel/trace/trace_stat.c b/kernel/trace/trace_stat.c index 413ff108fbd0..75bf1bcb4a8a 100644 --- a/kernel/trace/trace_stat.c +++ b/kernel/trace/trace_stat.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  /*   * Infrastructure for statistic tracing (histogram output).   * diff --git a/kernel/trace/trace_stat.h b/kernel/trace/trace_stat.h index 8f03914b9a6a..76d30b4ebe83 100644 --- a/kernel/trace/trace_stat.h +++ b/kernel/trace/trace_stat.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __TRACE_STAT_H  #define __TRACE_STAT_H diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 696afe72d3b1..a2a642f2c64f 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0  #include <trace/syscall.h>  #include <trace/events/syscalls.h>  #include <linux/syscalls.h> diff --git a/kernel/trace/tracing_map.h b/kernel/trace/tracing_map.h index 618838f5f30a..ab0ca77331d0 100644 --- a/kernel/trace/tracing_map.h +++ b/kernel/trace/tracing_map.h @@ -1,3 +1,4 @@ +/* SPDX-License-Identifier: GPL-2.0 */  #ifndef __TRACING_MAP_H  #define __TRACING_MAP_H |