@ -3165,11 +3165,6 @@ static const struct file_operations show_traces_fops = {
. llseek = seq_lseek ,
} ;
/*
* 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 ) - > i_private ;
int len ;
mutex_lock ( & tracing_cpumask_update_lock ) ;
len = cpumask_scnprintf ( mask_str , count , tracing_cpumask ) ;
len = cpumask_scnprintf ( mask_str , count , tr - > tr acing_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 - > tr acing_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 - > tr acing_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 - > tr acing_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 ,
} ;
@ -5938,6 +5935,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 ;
@ -5969,6 +5971,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 ) ;
@ -6098,6 +6101,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 ) ;
@ -6147,9 +6153,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 ) ;
@ -6371,7 +6374,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 */
@ -6386,7 +6389,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 ) ;
@ -6441,7 +6444,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 :