History

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

Linus Torvalds committed 9 years ago

Commit 415be6c2 parents 1cffe59 8b0db1a6 files · +38 −16Browse files

Unified · Split

6 files
  1. kernel/trace/ftrace.c +4 −0
  2. kernel/trace/ring_buffer.c +9 −5
  3. kernel/trace/ring_buffer_benchmark.c +1 −1
  4. kernel/trace/trace.c +13 −6
  5. kernel/trace/trace_events_filter.c +4 −0
  6. kernel/trace/tracing_map.c +7 −4
kernel/trace/ftrace.c+4−0
@@ -889,6 +889,10 @@ static int profile_graph_entry(struct ftrace_graph_ent *trace) · 888 unmodified lines
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
kernel/trace/ring_buffer.c+9−5
@@ -4386,15 +4386,19 @@ EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu); · 4385 unmodified lines
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) · 11 unmodified lines
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); · 48 unmodified lines
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);
kernel/trace/ring_buffer_benchmark.c+1−1
@@ -113,7 +113,7 @@ static enum event_status read_page(int cpu) · 112 unmodified lines
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);
kernel/trace/trace.c+13−6
@@ -6598,7 +6598,7 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, · 6597 unmodified lines
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, · 7 unmodified lines
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, · 168 unmodified lines
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) · 1495 unmodified lines
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) · 108 unmodified lines
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);
kernel/trace/trace_events_filter.c+4−0
@@ -1959,6 +1959,10 @@ static int create_filter(struct trace_event_call *call, · 1958 unmodified lines
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;
kernel/trace/tracing_map.c+7−4
@@ -221,16 +221,19 @@ void tracing_map_array_free(struct tracing_map_array *a) · 220 unmodified lines
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,

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t