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

Showing the changes to kernel (6 of 6 files). Show all

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
889889
890890 function_profile_call(trace->func, 0, NULL, NULL);
891891
892+ /* If function graph is shutting down, ret_stack can be NULL */
893+ if (!current->ret_stack)
894+ return 0;
895+
892896 if (index >= 0 && index < FTRACE_RETFUNC_DEPTH)
893897 current->ret_stack[index].subtime = 0;
894898
kernel/trace/ring_buffer.c+9−5
@@ -4386,15 +4386,19 @@ EXPORT_SYMBOL_GPL(ring_buffer_swap_cpu); · 4385 unmodified lines
43864386 * the page that was allocated, with the read page of the buffer.
43874387 *
43884388 * Returns:
4389− * The page allocated, or NULL on error.
4389+ * The page allocated, or ERR_PTR
43904390 */
43914391 void *ring_buffer_alloc_read_page(struct ring_buffer *buffer, int cpu)
43924392 {
4393− struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
4393+ struct ring_buffer_per_cpu *cpu_buffer;
43944394 struct buffer_data_page *bpage = NULL;
43954395 unsigned long flags;
43964396 struct page *page;
43974397
4398+ if (!cpumask_test_cpu(cpu, buffer->cpumask))
4399+ return ERR_PTR(-ENODEV);
4400+
4401+ cpu_buffer = buffer->buffers[cpu];
43984402 local_irq_save(flags);
43994403 arch_spin_lock(&cpu_buffer->lock);
44004404
@@ -4412,7 +4416,7 @@ void *ring_buffer_alloc_read_page(struct ring_buffer *buffer, int cpu) · 11 unmodified lines
44124416 page = alloc_pages_node(cpu_to_node(cpu),
44134417 GFP_KERNEL | __GFP_NORETRY, 0);
44144418 if (!page)
4415− return NULL;
4419+ return ERR_PTR(-ENOMEM);
44164420
44174421 bpage = page_address(page);
44184422
@@ -4467,8 +4471,8 @@ EXPORT_SYMBOL_GPL(ring_buffer_free_read_page); · 48 unmodified lines
44674471 *
44684472 * for example:
44694473 * rpage = ring_buffer_alloc_read_page(buffer, cpu);
4470− * if (!rpage)
4471− * return error;
4474+ * if (IS_ERR(rpage))
4475+ * return PTR_ERR(rpage);
44724476 * ret = ring_buffer_read_page(buffer, &rpage, len, cpu, 0);
44734477 * if (ret >= 0)
44744478 * 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
113113 int i;
114114
115115 bpage = ring_buffer_alloc_read_page(buffer, cpu);
116− if (!bpage)
116+ if (IS_ERR(bpage))
117117 return EVENT_DROPPED;
118118
119119 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
65986598 {
65996599 struct ftrace_buffer_info *info = filp->private_data;
66006600 struct trace_iterator *iter = &info->iter;
6601− ssize_t ret;
6601+ ssize_t ret = 0;
66026602 ssize_t size;
66036603
66046604 if (!count)
@@ -6612,10 +6612,15 @@ tracing_buffers_read(struct file *filp, char __user *ubuf, · 7 unmodified lines
66126612 if (!info->spare) {
66136613 info->spare = ring_buffer_alloc_read_page(iter->trace_buffer->buffer,
66146614 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+ }
66166621 }
66176622 if (!info->spare)
6618− return -ENOMEM;
6623+ return ret;
66196624
66206625 /* Do we have previous read data to read? */
66216626 if (info->read < PAGE_SIZE)
@@ -6790,8 +6795,9 @@ tracing_buffers_splice_read(struct file *file, loff_t *ppos, · 168 unmodified lines
67906795 ref->ref = 1;
67916796 ref->buffer = iter->trace_buffer->buffer;
67926797 ref->page = ring_buffer_alloc_read_page(ref->buffer, iter->cpu_file);
6793− if (!ref->page) {
6794− ret = -ENOMEM;
6798+ if (IS_ERR(ref->page)) {
6799+ ret = PTR_ERR(ref->page);
6800+ ref->page = NULL;
67956801 kfree(ref);
67966802 break;
67976803 }
@@ -8293,6 +8299,7 @@ __init static int tracer_alloc_buffers(void) · 1495 unmodified lines
82938299 if (ret < 0)
82948300 goto out_free_cpumask;
82958301 /* Used for event triggers */
8302+ ret = -ENOMEM;
82968303 temp_buffer = ring_buffer_alloc(PAGE_SIZE, RB_FL_OVERWRITE);
82978304 if (!temp_buffer)
82988305 goto out_rm_hp_state;
@@ -8407,4 +8414,4 @@ __init static int clear_boot_tracer(void) · 108 unmodified lines
84078414 }
84088415
84098416 fs_initcall(tracer_init_tracefs);
8410−late_initcall(clear_boot_tracer);
8417+late_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
19591959 if (err && set_str)
19601960 append_filter_err(ps, filter);
19611961 }
1962+ if (err && !set_str) {
1963+ free_event_filter(filter);
1964+ filter = NULL;
1965+ }
19621966 create_filter_finish(ps);
19631967
19641968 *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
221221 if (!a)
222222 return;
223223
224− if (!a->pages) {
225− kfree(a);
226− return;
227− }
224+ if (!a->pages)
225+ goto free;
228226
229227 for (i = 0; i < a->n_pages; i++) {
230228 if (!a->pages[i])
231229 break;
232230 free_page((unsigned long)a->pages[i]);
233231 }
232+
233+ kfree(a->pages);
234+
235+ free:
236+ kfree(a);
234237 }
235238
236239 struct 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