diff options
Diffstat (limited to 'kernel/trace/trace.c')
| -rw-r--r-- | kernel/trace/trace.c | 54 | 
1 files changed, 19 insertions, 35 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 73e67b68c53b..2a8d8a294345 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -362,7 +362,7 @@ trace_ignore_this_task(struct trace_pid_list *filtered_pids, struct task_struct  }  /** - * trace_pid_filter_add_remove - Add or remove a task from a pid_list + * trace_pid_filter_add_remove_task - Add or remove a task from a pid_list   * @pid_list: The list to modify   * @self: The current task for fork or NULL for exit   * @task: The task to add or remove @@ -925,7 +925,7 @@ static void tracing_snapshot_instance(struct trace_array *tr)  }  /** - * trace_snapshot - take a snapshot of the current buffer. + * tracing_snapshot - take a snapshot of the current buffer.   *   * This causes a swap between the snapshot buffer and the current live   * tracing buffer. You can use this to take snapshots of the live @@ -1004,9 +1004,9 @@ int tracing_alloc_snapshot(void)  EXPORT_SYMBOL_GPL(tracing_alloc_snapshot);  /** - * trace_snapshot_alloc - allocate and take a snapshot of the current buffer. + * tracing_snapshot_alloc - allocate and take a snapshot of the current buffer.   * - * This is similar to trace_snapshot(), but it will allocate the + * This is similar to tracing_snapshot(), but it will allocate the   * snapshot buffer if it isn't already allocated. Use this only   * where it is safe to sleep, as the allocation may sleep.   * @@ -1303,7 +1303,7 @@ unsigned long __read_mostly	tracing_thresh;  /*   * Copy the new maximum trace into the separate maximum-trace   * structure. (this way the maximum trace is permanently saved, - * for later retrieval via /sys/kernel/debug/tracing/latency_trace) + * for later retrieval via /sys/kernel/tracing/tracing_max_latency)   */  static void  __update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu) @@ -2415,7 +2415,7 @@ trace_process_export(struct trace_export *export,  	entry = ring_buffer_event_data(event);  	size = ring_buffer_event_length(event); -	export->write(entry, size); +	export->write(export, entry, size);  }  static DEFINE_MUTEX(ftrace_export_lock); @@ -4178,37 +4178,30 @@ static const struct file_operations show_traces_fops = {  	.llseek		= seq_lseek,  }; -/* - * The tracer itself will not take this lock, but still we want - * to provide a consistent cpumask to user-space: - */ -static DEFINE_MUTEX(tracing_cpumask_update_lock); - -/* - * Temporary storage for the character representation of the - * CPU bitmask (and one more byte for the newline): - */ -static char mask_str[NR_CPUS + 1]; -  static ssize_t  tracing_cpumask_read(struct file *filp, char __user *ubuf,  		     size_t count, loff_t *ppos)  {  	struct trace_array *tr = file_inode(filp)->i_private; +	char *mask_str;  	int len; -	mutex_lock(&tracing_cpumask_update_lock); +	len = snprintf(NULL, 0, "%*pb\n", +		       cpumask_pr_args(tr->tracing_cpumask)) + 1; +	mask_str = kmalloc(len, GFP_KERNEL); +	if (!mask_str) +		return -ENOMEM; -	len = snprintf(mask_str, count, "%*pb\n", +	len = snprintf(mask_str, len, "%*pb\n",  		       cpumask_pr_args(tr->tracing_cpumask));  	if (len >= count) {  		count = -EINVAL;  		goto out_err;  	} -	count = simple_read_from_buffer(ubuf, count, ppos, mask_str, NR_CPUS+1); +	count = simple_read_from_buffer(ubuf, count, ppos, mask_str, len);  out_err: -	mutex_unlock(&tracing_cpumask_update_lock); +	kfree(mask_str);  	return count;  } @@ -4228,8 +4221,6 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf,  	if (err)  		goto err_unlock; -	mutex_lock(&tracing_cpumask_update_lock); -  	local_irq_disable();  	arch_spin_lock(&tr->max_lock);  	for_each_tracing_cpu(cpu) { @@ -4252,8 +4243,6 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf,  	local_irq_enable();  	cpumask_copy(tr->tracing_cpumask, tracing_cpumask_new); - -	mutex_unlock(&tracing_cpumask_update_lock);  	free_cpumask_var(tracing_cpumask_new);  	return count; @@ -6780,7 +6769,7 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,  		.spd_release	= buffer_spd_release,  	};  	struct buffer_ref *ref; -	int entries, size, i; +	int entries, i;  	ssize_t ret = 0;  #ifdef CONFIG_TRACER_MAX_TRACE @@ -6834,14 +6823,6 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,  			break;  		} -		/* -		 * zero out any left over data, this is going to -		 * user land. -		 */ -		size = ring_buffer_page_len(ref->page); -		if (size < PAGE_SIZE) -			memset(ref->page + size, 0, PAGE_SIZE - size); -  		page = virt_to_page(ref->page);  		spd.pages[i] = page; @@ -7599,6 +7580,7 @@ allocate_trace_buffer(struct trace_array *tr, struct trace_buffer *buf, int size  	buf->data = alloc_percpu(struct trace_array_cpu);  	if (!buf->data) {  		ring_buffer_free(buf->buffer); +		buf->buffer = NULL;  		return -ENOMEM;  	} @@ -7622,7 +7604,9 @@ static int allocate_trace_buffers(struct trace_array *tr, int size)  				    allocate_snapshot ? size : 1);  	if (WARN_ON(ret)) {  		ring_buffer_free(tr->trace_buffer.buffer); +		tr->trace_buffer.buffer = NULL;  		free_percpu(tr->trace_buffer.data); +		tr->trace_buffer.data = NULL;  		return -ENOMEM;  	}  	tr->allocated_snapshot = allocate_snapshot;  |