tracing: Make TRACE_ITER_STOP_ON_FREE stop the correct buffer
PATCH 1/3 tracing: Make TRACE_ITER_STOP_ON_FREE stop the correct buffer
Releasing the free_buffer file in an instance causes the global buffer to be stopped when TRACE_ITER_STOP_ON_FREE is enabled. Operate on the correct buffer.
--- kernel/trace/trace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/trace/trace.c +1 -1
@@ -4468,7 +4468,7 @@ tracing_free_buffer_release(struct inode *inode, struct file *filp)/* disable tracing ? */ if (trace_flags &TRACE_ITER_STOP_ON_FREE ) -tracing_off (); +tracer_tracing_off (tr);/* resize the ring buffer to 0 */ tracing_resize_ring_buffer (tr,0 ,RING_BUFFER_ALL_CPUS );
Signature · 1 line
1.8.3
PATCH 2/3 tracing: Fix reset of time stamps during trace_clock changes
Fixed two issues with changing the timestamp clock with trace_clock:
- The global buffer was reset on instance clock changes. Change this to pass the correct per-instance buffer
- ftrace_now() is used to set buf->time_start in tracing_reset_online_cpus(). This was incorrect because ftrace_now() used the global buffer's clock to return the current time. Change this to use buffer_ftrace_now() which returns the current time for the correct per-instance buffer.
Also removed tracing_reset_current() because it is not used anywhere
--- kernel/trace/trace.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
kernel/trace/trace.c +12 -12
@@ -243,20 +243,25 @@ int filter_current_check_discard(struct ring_buffer *buffer, }EXPORT_SYMBOL_GPL (filter_current_check_discard); -cycle_t ftrace_now (int cpu) +cycle_t buffer_ftrace_now (struct trace_buffer *buf,int cpu) {u64 ts;/* Early boot up does not have a buffer yet */ -if (!global_trace.trace_buffer.buffer) +if (!buf->buffer)return trace_clock_local (); - ts =ring_buffer_time_stamp (global_trace.trace_buffer.buffer, cpu); -ring_buffer_normalize_time_stamp (global_trace.trace_buffer.buffer, cpu, &ts); + ts =ring_buffer_time_stamp (buf->buffer, cpu); +ring_buffer_normalize_time_stamp (buf->buffer, cpu, &ts);return ts; } +cycle_t ftrace_now (int cpu) +{ +return buffer_ftrace_now (&global_trace.trace_buffer, cpu); +} +/** * tracing_is_enabled - Show if global_trace has been disabled *
@@ -1211,7 +1216,7 @@ void tracing_reset_online_cpus(struct trace_buffer *buf)/* Make sure all commits have finished */ synchronize_sched (); - buf->time_start =ftrace_now (buf->cpu); + buf->time_start =buffer_ftrace_now (buf, buf->cpu);for_each_online_cpu (cpu)ring_buffer_reset_cpu (buffer, cpu);
@@ -1219,11 +1224,6 @@ void tracing_reset_online_cpus(struct trace_buffer *buf)ring_buffer_record_enable (buffer); } -void tracing_reset_current (int cpu) -{ -tracing_reset (&global_trace.trace_buffer, cpu); -} -/* Must have trace_types_lock held */ void tracing_reset_all_online_cpus (void ) {
@@ -4633,12 +4633,12 @@ static ssize_t tracing_clock_write(struct file *filp, const char __user *ubuf,* New clock may not be consistent with the previous clock. * Reset the buffer so that it doesn't have incomparable timestamps. */ -tracing_reset_online_cpus (&global_trace.trace_buffer); +tracing_reset_online_cpus (&tr->trace_buffer);#ifdef CONFIG_TRACER_MAX_TRACE if (tr->flags &TRACE_ARRAY_FL_GLOBAL && tr->max_buffer.buffer)ring_buffer_set_clock (tr->max_buffer.buffer, trace_clocks[i].func); -tracing_reset_online_cpus (&global_trace.max_buffer); +tracing_reset_online_cpus (&tr->max_buffer);#endif mutex_unlock (&trace_types_lock);
Signature · 1 line
1.8.3
Steven Rostedt
maintainerRe: [PATCH 2/3] tracing: Fix reset of time stamps during trace_clock changes
Quoted 8 lines · Alexander Z Lam
Fixed two issues with changing the timestamp clock with
trace_clock:- The global buffer was reset on instance clock changes. Change this to pass the correct per-instance buffer
-ftrace_now()is used to setbuf->time_startintracing_reset_online_cpus(). This was incorrect becauseftrace_now()used the global buffer's clock to return the current time. Change this to usebuffer_ftrace_now()which returns the current time for the correct per-instance buffer.
The first two patches look to go into 3.11 and 3.10 stable. The removal below is not urgent, but I can keep it in this patch.
Quoted 3 lines
Also removed
tracing_reset_current()because it is not used anywhere
The third patch can wait to 3.12. I'll review it later.
Thanks,
-- Steve
PATCH 3/3 tracing: Make tracing_cpumask available for all instances
In reply to Alexander Z LamAllow tracer instances to disable tracing by cpu by moving the static global tracing_cpumask into trace_array.
--- kernel/trace/trace.c | 37 ++++++++++++++++++++----------------- kernel/trace/trace.h | 1 + 2 files changed, 21 insertions(+), 17 deletions(-)
kernel/trace/trace.c +20 -17
@@ -3166,11 +3166,6 @@ static const struct file_operations show_traces_fops = { };/* -* Only trace on a CPU if the bitmask is set: -*/ -static cpumask_var_t tracing_cpumask; - -/* * The tracer itself will not take this lock, but still we want * to provide a consistent cpumask to user-space: */
@@ -3186,11 +3181,12 @@ 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);int len;mutex_lock (&tracing_cpumask_update_lock); - len =cpumask_scnprintf (mask_str, count, tracing_cpumask); + len =cpumask_scnprintf (mask_str, count, tr->tracing_cpumask);if (count - len <2 ) { count = -EINVAL ; goto out_err;
@@ -3208,7 +3204,7 @@ static ssize_t tracing_cpumask_write(struct file *filp, const char __user *ubuf, size_t count, loff_t *ppos) { - struct trace_array *tr = filp->private_data; + struct trace_array *tr = file_inode(filp)->i_private;cpumask_var_t tracing_cpumask_new;int err, cpu;
@@ -3228,12 +3224,12 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf,* Increase/decrease the disabled counter if we are * about to flip a bit in the cpumask: */ -if (cpumask_test_cpu (cpu, tracing_cpumask) && +if (cpumask_test_cpu (cpu, tr->tracing_cpumask) && !cpumask_test_cpu (cpu, tracing_cpumask_new)) {atomic_inc (&per_cpu_ptr (tr->trace_buffer.data, cpu)->disabled);ring_buffer_record_disable_cpu (tr->trace_buffer.buffer, cpu); } -if (!cpumask_test_cpu (cpu, tracing_cpumask) && +if (!cpumask_test_cpu (cpu, tr->tracing_cpumask) &&cpumask_test_cpu (cpu, tracing_cpumask_new)) {atomic_dec (&per_cpu_ptr (tr->trace_buffer.data, cpu)->disabled);ring_buffer_record_enable_cpu (tr->trace_buffer.buffer, cpu);
@@ -3242,7 +3238,7 @@ tracing_cpumask_write(struct file *filp, const char __user *ubuf,arch_spin_unlock (&ftrace_max_lock);local_irq_enable (); -cpumask_copy (tracing_cpumask, tracing_cpumask_new); +cpumask_copy (tr->tracing_cpumask, tracing_cpumask_new);mutex_unlock (&tracing_cpumask_update_lock);free_cpumask_var (tracing_cpumask_new);
@@ -3256,9 +3252,10 @@ err_unlock: }static const struct file_operations tracing_cpumask_fops = { - .open = tracing_open_generic, + .open = tracing_open_generic_tr, .read = tracing_cpumask_read, .write = tracing_cpumask_write, + .release = tracing_release_generic_tr, .llseek = generic_file_llseek, };
@@ -5937,6 +5934,11 @@ static int new_instance_create(const char *name)if (!tr->name) goto out_free_tr; +if (!alloc_cpumask_var (&tr->tracing_cpumask,GFP_KERNEL )) + goto out_free_tr; + +cpumask_copy (tr->tracing_cpumask, cpu_all_mask); +raw_spin_lock_init (&tr->start_lock); tr->current_trace = &nop_trace;
@@ -5968,6 +5970,7 @@ static int new_instance_create(const char *name) out_free_tr:if (tr->trace_buffer.buffer)ring_buffer_free (tr->trace_buffer.buffer); +free_cpumask_var (tr->tracing_cpumask);kfree (tr->name);kfree (tr);
@@ -6097,6 +6100,9 @@ init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer) {int cpu; +trace_create_file ("tracing_cpumask" ,0644 , d_tracer, + tr, &tracing_cpumask_fops); +trace_create_file ("trace_options" ,0644 , d_tracer, tr, &tracing_iter_fops);
@@ -6146,9 +6152,6 @@ static __init int tracer_init_debugfs(void)init_tracer_debugfs (&global_trace, d_tracer); -trace_create_file ("tracing_cpumask" ,0644 , d_tracer, - &global_trace, &tracing_cpumask_fops); -trace_create_file ("available_tracers" ,0444 , d_tracer, &global_trace, &show_traces_fops);
@@ -6370,7 +6373,7 @@ __init static int tracer_alloc_buffers(void)if (!alloc_cpumask_var (&tracing_buffer_mask,GFP_KERNEL )) goto out; -if (!alloc_cpumask_var (&tracing_cpumask,GFP_KERNEL )) +if (!alloc_cpumask_var (&global_trace.tracing_cpumask,GFP_KERNEL )) goto out_free_buffer_mask;/* Only allocate trace_printk buffers if a trace_printk exists */
@@ -6385,7 +6388,7 @@ __init static int tracer_alloc_buffers(void) ring_buf_size =1 ;cpumask_copy (tracing_buffer_mask, cpu_possible_mask); -cpumask_copy (tracing_cpumask, cpu_all_mask); +cpumask_copy (global_trace.tracing_cpumask, cpu_all_mask);raw_spin_lock_init (&global_trace.start_lock);
@@ -6440,7 +6443,7 @@ out_free_cpumask:#ifdef CONFIG_TRACER_MAX_TRACE free_percpu (global_trace.max_buffer.data);#endif -free_cpumask_var (tracing_cpumask); +free_cpumask_var (global_trace.tracing_cpumask); out_free_buffer_mask:free_cpumask_var (tracing_buffer_mask); out:
kernel/trace/trace.h +1 -0
@@ -206,6 +206,7 @@ struct trace_array {struct dentry *event_dir;struct list_head systems;struct list_head events; +cpumask_var_t tracing_cpumask;/* only trace on set CPUs */ int ref; };
Signature · 1 line
1.8.3