diff options
author | Alex Shi <alex.shi@linaro.org> | 2017-12-21 12:06:53 +0800 |
---|---|---|
committer | Alex Shi <alex.shi@linaro.org> | 2017-12-21 12:06:53 +0800 |
commit | 317c5652a7c300c2d82ef5bfae8d3558f389d219 (patch) | |
tree | 9cb4998f4275d8d551ab04cd33af32cf0266b3af /kernel/trace | |
parent | 2cea360fea5e5e1cb69496612466be2b99254096 (diff) | |
parent | 1b29aa698d3ef8826599dc856054640eb71d2e33 (diff) |
Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
Diffstat (limited to 'kernel/trace')
-rw-r--r-- | kernel/trace/trace.c | 29 |
1 files changed, 9 insertions, 20 deletions
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 23de746b2195..6d4ff15b8c0d 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -3430,37 +3430,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; } @@ -3480,8 +3473,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) { @@ -3504,8 +3495,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; |