aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2017-08-24 17:08:22 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2017-08-24 17:08:22 -0400
commit415be6c256ddb5ef2eccd9f45fc67d73d49f466a (patch)
treeb09a2cd8737f7bcb0ead691e6e50baee6a46cb32 /kernel
parent1cffe5955f1d16523e2850382f4971c5ec8da5c5 (diff)
parent8b0db1a5bdfcee0dbfa89607672598ae203c9045 (diff)
Merge tag 'trace-v4.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
Pull tracing fixes from Steven Rostedt: "Various bug fixes: - Two small memory leaks in error paths. - A missed return error code on an error path. - A fix to check the tracing ring buffer CPU when it doesn't exist (caused by setting maxcpus on the command line that is less than the actual number of CPUs, and then onlining them manually). - A fix to have the reset of boot tracers called by lateinit_sync() instead of just lateinit(). As some of the tracers register via lateinit(), and if the clear happens before the tracer is registered, it will never start even though it was told to via the kernel command line" * tag 'trace-v4.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace: tracing: Fix freeing of filter in create_filter() when set_str is false tracing: Fix kmemleak in tracing_map_array_free() ftrace: Check for null ret_stack on profile function graph entry function ring-buffer: Have ring_buffer_alloc_read_page() return error on offline CPU tracing: Missing error code in tracer_alloc_buffers() tracing: Call clear_boot_tracer() at lateinit_sync
Diffstat (limited to 'kernel')
-rw-r--r--kernel/trace/ftrace.c4
-rw-r--r--kernel/trace/ring_buffer.c14
-rw-r--r--kernel/trace/ring_buffer_benchmark.c2
-rw-r--r--kernel/trace/trace.c19
-rw-r--r--kernel/trace/trace_events_filter.c4
-rw-r--r--kernel/trace/tracing_map.c11
6 files changed, 38 insertions, 16 deletions
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 02004ae91860..96cea88fa00f 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -889,6 +889,10 @@ static int profile_graph_entry(struct ftrace_graph_ent *trace)
889 889
890 function_profile_call(trace->func, 0, NULL, NULL); 890 function_profile_call(trace->func, 0, NULL, NULL);
891 891
892 /* If function graph is shutting down, ret_stack can be NULL */
893 if (!current->ret_stack)
894 return 0;
895
892 if (index >= 0 && index < FTRACE_RETFUNC_DEPTH) 896 if (index >= 0 && index < FTRACE_RETFUNC_DEPTH)
893 current->ret_stack[index].subtime = 0; 897 current->ret_stack[index].subtime = 0;
894 898
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
index 529cc50d7243..81279c6602ff 100644
--- a/kernel/trace/ring_buffer.c
+++ b/kernel/trace/ring_buffer.c
@@ -4386,15 +4386,19 @@ EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu);
4386 * the page that was allocated, with the read page of the buffer. 4386 * the page that was allocated, with the read page of the buffer.
4387 * 4387 *
4388 * Returns: 4388 * Returns:
4389 * The page allocated, or NULL on error. 4389 * The page allocated, or ERR_PTR
4390 */ 4390 */
4391void *ring_buffer_alloc_read_page(struct ring_buffer *buffer, int cpu) 4391void *ring_buffer_alloc_read_page(struct ring_buffer *buffer, int cpu)
4392{ 4392{
4393 struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu]; 4393 struct ring_buffer_per_cpu *cpu_buffer;
4394 struct buffer_data_page *bpage = NULL; 4394 struct buffer_data_page *bpage = NULL;
4395 unsigned long flags; 4395 unsigned long flags;
4396 struct page *page; 4396 struct page *page;
4397 4397
4398 if (!cpumask_test_cpu(cpu, buffer->cpumask))
4399 return ERR_PTR(-ENODEV);
4400
4401 cpu_buffer = buffer->buffers[cpu];
4398 local_irq_save(flags); 4402 local_irq_save(flags);
4399 arch_spin_lock(&cpu_buffer->lock); 4403 arch_spin_lock(&cpu_buffer->lock);
4400 4404
@@ -4412,7 +4416,7 @@ void *ring_buffer_alloc_read_page(struct ring_buffer *buffer, int cpu)
4412 page = alloc_pages_node(cpu_to_node(cpu), 4416 page = alloc_pages_node(cpu_to_node(cpu),
4413 GFP_KERNEL | __GFP_NORETRY, 0); 4417 GFP_KERNEL | __GFP_NORETRY, 0);
4414 if (!page) 4418 if (!page)
4415 return NULL; 4419 return ERR_PTR(-ENOMEM);
4416 4420
4417 bpage = page_address(page); 4421 bpage = page_address(page);
4418 4422
@@ -4467,8 +4471,8 @@ EXPORT_SYMBOL_GPL(ring_buffer_free_read_page);
4467 * 4471 *
4468 * for example: 4472 * for example:
4469 * rpage = ring_buffer_alloc_read_page(buffer, cpu); 4473 * rpage = ring_buffer_alloc_read_page(buffer, cpu);
4470 * if (!rpage) 4474 * if (IS_ERR(rpage))
4471 * return error; 4475 * return PTR_ERR(rpage);
4472 * ret = ring_buffer_read_page(buffer, &rpage, len, cpu, 0); 4476 * ret = ring_buffer_read_page(buffer, &rpage, len, cpu, 0);
4473 * if (ret >= 0) 4477 * if (ret >= 0)
4474 * process_page(rpage, ret); 4478 * process_page(rpage, ret);
diff --git a/kernel/trace/ring_buffer_benchmark.c b/kernel/trace/ring_buffer_benchmark.c
index 9fbcaf567886..68ee79afe31c 100644
--- a/kernel/trace/ring_buffer_benchmark.c
+++ b/kernel/trace/ring_buffer_benchmark.c
@@ -113,7 +113,7 @@ static enum event_status read_page(int cpu)
113 int i; 113 int i;
114 114
115 bpage = ring_buffer_alloc_read_page(buffer, cpu); 115 bpage = ring_buffer_alloc_read_page(buffer, cpu);
116 if (!bpage) 116 if (IS_ERR(bpage))
117 return EVENT_DROPPED; 117 return EVENT_DROPPED;
118 118
119 ret = ring_buffer_read_page(buffer, &bpage, PAGE_SIZE, cpu, 1); 119 ret = ring_buffer_read_page(buffer, &bpage, PAGE_SIZE, cpu, 1);
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 42b9355033d4..44004d8aa3b3 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -6598,7 +6598,7 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
6598{ 6598{
6599 struct ftrace_buffer_info *info = filp->private_data; 6599 struct ftrace_buffer_info *info = filp->private_data;
6600 struct trace_iterator *iter = &info->iter; 6600 struct trace_iterator *iter = &info->iter;
6601 ssize_t ret; 6601 ssize_t ret = 0;
6602 ssize_t size; 6602 ssize_t size;
6603 6603
6604 if (!count) 6604 if (!count)
@@ -6612,10 +6612,15 @@ tracing_buffers_read(struct file *filp, char __user *ubuf,
6612 if (!info->spare) { 6612 if (!info->spare) {
6613 info->spare = ring_buffer_alloc_read_page(iter->trace_buffer->buffer, 6613 info->spare = ring_buffer_alloc_read_page(iter->trace_buffer->buffer,
6614 iter->cpu_file); 6614 iter->cpu_file);
6615 info->spare_cpu = iter->cpu_file; 6615 if (IS_ERR(info->spare)) {
6616 ret = PTR_ERR(info->spare);
6617 info->spare = NULL;
6618 } else {
6619 info->spare_cpu = iter->cpu_file;
6620 }
6616 } 6621 }
6617 if (!info->spare) 6622 if (!info->spare)
6618 return -ENOMEM; 6623 return ret;
6619 6624
6620 /* Do we have previous read data to read? */ 6625 /* Do we have previous read data to read? */
6621 if (info->read < PAGE_SIZE) 6626 if (info->read < PAGE_SIZE)
@@ -6790,8 +6795,9 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos,
6790 ref->ref = 1; 6795 ref->ref = 1;
6791 ref->buffer = iter->trace_buffer->buffer; 6796 ref->buffer = iter->trace_buffer->buffer;
6792 ref->page = ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file); 6797 ref->page = ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file);
6793 if (!ref->page) { 6798 if (IS_ERR(ref->page)) {
6794 ret = -ENOMEM; 6799 ret = PTR_ERR(ref->page);
6800 ref->page = NULL;
6795 kfree(ref); 6801 kfree(ref);
6796 break; 6802 break;
6797 } 6803 }
@@ -8293,6 +8299,7 @@ __init static int tracer_alloc_buffers(void)
8293 if (ret < 0) 8299 if (ret < 0)
8294 goto out_free_cpumask; 8300 goto out_free_cpumask;
8295 /* Used for event triggers */ 8301 /* Used for event triggers */
8302 ret = -ENOMEM;
8296 temp_buffer = ring_buffer_alloc(PAGE_SIZE, RB_FL_OVERWRITE); 8303 temp_buffer = ring_buffer_alloc(PAGE_SIZE, RB_FL_OVERWRITE);
8297 if (!temp_buffer) 8304 if (!temp_buffer)
8298 goto out_rm_hp_state; 8305 goto out_rm_hp_state;
@@ -8407,4 +8414,4 @@ __init static int clear_boot_tracer(void)
8407} 8414}
8408 8415
8409fs_initcall(tracer_init_tracefs); 8416fs_initcall(tracer_init_tracefs);
8410late_initcall(clear_boot_tracer); 8417late_initcall_sync(clear_boot_tracer);
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c
index 59a411ff60c7..181e139a8057 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -1959,6 +1959,10 @@ static int create_filter(struct trace_event_call *call,
1959 if (err && set_str) 1959 if (err && set_str)
1960 append_filter_err(ps, filter); 1960 append_filter_err(ps, filter);
1961 } 1961 }
1962 if (err && !set_str) {
1963 free_event_filter(filter);
1964 filter = NULL;
1965 }
1962 create_filter_finish(ps); 1966 create_filter_finish(ps);
1963 1967
1964 *filterp = filter; 1968 *filterp = filter;
diff --git a/kernel/trace/tracing_map.c b/kernel/trace/tracing_map.c
index 0a689bbb78ef..305039b122fa 100644
--- a/kernel/trace/tracing_map.c
+++ b/kernel/trace/tracing_map.c
@@ -221,16 +221,19 @@ void tracing_map_array_free(struct tracing_map_array *a)
221 if (!a) 221 if (!a)
222 return; 222 return;
223 223
224 if (!a->pages) { 224 if (!a->pages)
225 kfree(a); 225 goto free;
226 return;
227 }
228 226
229 for (i = 0; i < a->n_pages; i++) { 227 for (i = 0; i < a->n_pages; i++) {
230 if (!a->pages[i]) 228 if (!a->pages[i])
231 break; 229 break;
232 free_page((unsigned long)a->pages[i]); 230 free_page((unsigned long)a->pages[i]);
233 } 231 }
232
233 kfree(a->pages);
234
235 free:
236 kfree(a);
234} 237}
235 238
236struct tracing_map_array *tracing_map_array_alloc(unsigned int n_elts, 239struct tracing_map_array *tracing_map_array_alloc(unsigned int n_elts,