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
Showing the changes to kernel (6 of 6 files). Show all
Unified · Split
| @@ -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 | ||
| @@ -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 | */ |
| 4391 | void *ring_buffer_alloc_read_page(struct ring_buffer *buffer, int cpu) | 4391 | void *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); |
| @@ -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); |
| @@ -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 | ||
| 8409 | fs_initcall(tracer_init_tracefs); | 8416 | fs_initcall(tracer_init_tracefs); |
| 8410 | late_initcall(clear_boot_tracer); | 8417 | late_initcall_sync(clear_boot_tracer); |
| @@ -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; |
| @@ -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 | ||
| 236 | struct tracing_map_array *tracing_map_array_alloc(unsigned int n_elts, | 239 | struct tracing_map_array *tracing_map_array_alloc(unsigned int n_elts, |