Skip to content

Commit 5239dde

Browse files
committed
Merge tag 'trace-v6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace
Pull tracing fixes from Steven Rostedt: - Fix polling to block on watermark like the reads do, as user space applications get confused when the select says read is available, and then the read blocks - Fix accounting of ring buffer dropped pages as it is what is used to determine if the buffer is empty or not - Fix memory leak in tracing_read_pipe() - Fix struct trace_array warning about being declared in parameters - Fix accounting of ftrace pages used in output at start up. - Fix allocation of dyn_ftrace pages by subtracting one from order instead of diving it by 2 - Static analyzer found a case were a pointer being used outside of a NULL check (rb_head_page_deactivate()) - Fix possible NULL pointer dereference if kstrdup() fails in ftrace_add_mod() - Fix memory leak in test_gen_synth_cmd() and test_empty_synth_event() - Fix bad pointer dereference in register_synth_event() on error path - Remove unused __bad_type_size() method - Fix possible NULL pointer dereference of entry in list 'tr->err_log' - Fix NULL pointer deference race if eprobe is called before the event setup * tag 'trace-v6.1-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/trace/linux-trace: tracing: Fix race where eprobes can be called before the event tracing: Fix potential null-pointer-access of entry in list 'tr->err_log' tracing: Remove unused __bad_type_size() method tracing: Fix wild-memory-access in register_synth_event() tracing: Fix memory leak in test_gen_synth_cmd() and test_empty_synth_event() ftrace: Fix null pointer dereference in ftrace_add_mod() ring_buffer: Do not deactivate non-existant pages ftrace: Optimize the allocation for mcount entries ftrace: Fix the possible incorrect kernel message tracing: Fix warning on variable 'struct trace_array' tracing: Fix memory leak in tracing_read_pipe() ring-buffer: Include dropped pages in counting dirty patches tracing/ring-buffer: Have polling block on watermark
2 parents 894909f + 94eedf3 commit 5239dde

File tree

9 files changed

+74
-46
lines changed

9 files changed

+74
-46
lines changed

include/linux/ring_buffer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ __ring_buffer_alloc(unsigned long size, unsigned flags, struct lock_class_key *k
100100

101101
int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full);
102102
__poll_t ring_buffer_poll_wait(struct trace_buffer *buffer, int cpu,
103-
struct file *filp, poll_table *poll_table);
103+
struct file *filp, poll_table *poll_table, int full);
104104
void ring_buffer_wake_waiters(struct trace_buffer *buffer, int cpu);
105105

106106
#define RING_BUFFER_ALL_CPUS -1

include/linux/trace.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,13 @@ struct trace_export {
2626
int flags;
2727
};
2828

29+
struct trace_array;
30+
2931
#ifdef CONFIG_TRACING
3032

3133
int register_ftrace_export(struct trace_export *export);
3234
int unregister_ftrace_export(struct trace_export *export);
3335

34-
struct trace_array;
35-
3636
void trace_printk_init_buffers(void);
3737
__printf(3, 4)
3838
int trace_array_printk(struct trace_array *tr, unsigned long ip,

kernel/trace/ftrace.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,7 @@ static int ftrace_add_mod(struct trace_array *tr,
12891289
if (!ftrace_mod)
12901290
return -ENOMEM;
12911291

1292+
INIT_LIST_HEAD(&ftrace_mod->list);
12921293
ftrace_mod->func = kstrdup(func, GFP_KERNEL);
12931294
ftrace_mod->module = kstrdup(module, GFP_KERNEL);
12941295
ftrace_mod->enable = enable;
@@ -3190,7 +3191,7 @@ static int ftrace_allocate_records(struct ftrace_page *pg, int count)
31903191
/* if we can't allocate this size, try something smaller */
31913192
if (!order)
31923193
return -ENOMEM;
3193-
order >>= 1;
3194+
order--;
31943195
goto again;
31953196
}
31963197

@@ -7391,7 +7392,7 @@ void __init ftrace_init(void)
73917392
}
73927393

73937394
pr_info("ftrace: allocating %ld entries in %ld pages\n",
7394-
count, count / ENTRIES_PER_PAGE + 1);
7395+
count, DIV_ROUND_UP(count, ENTRIES_PER_PAGE));
73957396

73967397
ret = ftrace_process_locs(NULL,
73977398
__start_mcount_loc,

kernel/trace/ring_buffer.c

Lines changed: 50 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,7 @@ struct ring_buffer_per_cpu {
519519
local_t committing;
520520
local_t commits;
521521
local_t pages_touched;
522+
local_t pages_lost;
522523
local_t pages_read;
523524
long last_pages_touch;
524525
size_t shortest_full;
@@ -894,10 +895,18 @@ size_t ring_buffer_nr_pages(struct trace_buffer *buffer, int cpu)
894895
size_t ring_buffer_nr_dirty_pages(struct trace_buffer *buffer, int cpu)
895896
{
896897
size_t read;
898+
size_t lost;
897899
size_t cnt;
898900

899901
read = local_read(&buffer->buffers[cpu]->pages_read);
902+
lost = local_read(&buffer->buffers[cpu]->pages_lost);
900903
cnt = local_read(&buffer->buffers[cpu]->pages_touched);
904+
905+
if (WARN_ON_ONCE(cnt < lost))
906+
return 0;
907+
908+
cnt -= lost;
909+
901910
/* The reader can read an empty page, but not more than that */
902911
if (cnt < read) {
903912
WARN_ON_ONCE(read > cnt + 1);
@@ -907,6 +916,21 @@ size_t ring_buffer_nr_dirty_pages(struct trace_buffer *buffer, int cpu)
907916
return cnt - read;
908917
}
909918

919+
static __always_inline bool full_hit(struct trace_buffer *buffer, int cpu, int full)
920+
{
921+
struct ring_buffer_per_cpu *cpu_buffer = buffer->buffers[cpu];
922+
size_t nr_pages;
923+
size_t dirty;
924+
925+
nr_pages = cpu_buffer->nr_pages;
926+
if (!nr_pages || !full)
927+
return true;
928+
929+
dirty = ring_buffer_nr_dirty_pages(buffer, cpu);
930+
931+
return (dirty * 100) > (full * nr_pages);
932+
}
933+
910934
/*
911935
* rb_wake_up_waiters - wake up tasks waiting for ring buffer input
912936
*
@@ -1046,22 +1070,20 @@ int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full)
10461070
!ring_buffer_empty_cpu(buffer, cpu)) {
10471071
unsigned long flags;
10481072
bool pagebusy;
1049-
size_t nr_pages;
1050-
size_t dirty;
1073+
bool done;
10511074

10521075
if (!full)
10531076
break;
10541077

10551078
raw_spin_lock_irqsave(&cpu_buffer->reader_lock, flags);
10561079
pagebusy = cpu_buffer->reader_page == cpu_buffer->commit_page;
1057-
nr_pages = cpu_buffer->nr_pages;
1058-
dirty = ring_buffer_nr_dirty_pages(buffer, cpu);
1080+
done = !pagebusy && full_hit(buffer, cpu, full);
1081+
10591082
if (!cpu_buffer->shortest_full ||
10601083
cpu_buffer->shortest_full > full)
10611084
cpu_buffer->shortest_full = full;
10621085
raw_spin_unlock_irqrestore(&cpu_buffer->reader_lock, flags);
1063-
if (!pagebusy &&
1064-
(!nr_pages || (dirty * 100) > full * nr_pages))
1086+
if (done)
10651087
break;
10661088
}
10671089

@@ -1087,6 +1109,7 @@ int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full)
10871109
* @cpu: the cpu buffer to wait on
10881110
* @filp: the file descriptor
10891111
* @poll_table: The poll descriptor
1112+
* @full: wait until the percentage of pages are available, if @cpu != RING_BUFFER_ALL_CPUS
10901113
*
10911114
* If @cpu == RING_BUFFER_ALL_CPUS then the task will wake up as soon
10921115
* as data is added to any of the @buffer's cpu buffers. Otherwise
@@ -1096,23 +1119,30 @@ int ring_buffer_wait(struct trace_buffer *buffer, int cpu, int full)
10961119
* zero otherwise.
10971120
*/
10981121
__poll_t ring_buffer_poll_wait(struct trace_buffer *buffer, int cpu,
1099-
struct file *filp, poll_table *poll_table)
1122+
struct file *filp, poll_table *poll_table, int full)
11001123
{
11011124
struct ring_buffer_per_cpu *cpu_buffer;
11021125
struct rb_irq_work *work;
11031126

1104-
if (cpu == RING_BUFFER_ALL_CPUS)
1127+
if (cpu == RING_BUFFER_ALL_CPUS) {
11051128
work = &buffer->irq_work;
1106-
else {
1129+
full = 0;
1130+
} else {
11071131
if (!cpumask_test_cpu(cpu, buffer->cpumask))
11081132
return -EINVAL;
11091133

11101134
cpu_buffer = buffer->buffers[cpu];
11111135
work = &cpu_buffer->irq_work;
11121136
}
11131137

1114-
poll_wait(filp, &work->waiters, poll_table);
1115-
work->waiters_pending = true;
1138+
if (full) {
1139+
poll_wait(filp, &work->full_waiters, poll_table);
1140+
work->full_waiters_pending = true;
1141+
} else {
1142+
poll_wait(filp, &work->waiters, poll_table);
1143+
work->waiters_pending = true;
1144+
}
1145+
11161146
/*
11171147
* There's a tight race between setting the waiters_pending and
11181148
* checking if the ring buffer is empty. Once the waiters_pending bit
@@ -1128,6 +1158,9 @@ __poll_t ring_buffer_poll_wait(struct trace_buffer *buffer, int cpu,
11281158
*/
11291159
smp_mb();
11301160

1161+
if (full)
1162+
return full_hit(buffer, cpu, full) ? EPOLLIN | EPOLLRDNORM : 0;
1163+
11311164
if ((cpu == RING_BUFFER_ALL_CPUS && !ring_buffer_empty(buffer)) ||
11321165
(cpu != RING_BUFFER_ALL_CPUS && !ring_buffer_empty_cpu(buffer, cpu)))
11331166
return EPOLLIN | EPOLLRDNORM;
@@ -1769,9 +1802,9 @@ static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer)
17691802

17701803
free_buffer_page(cpu_buffer->reader_page);
17711804

1772-
rb_head_page_deactivate(cpu_buffer);
1773-
17741805
if (head) {
1806+
rb_head_page_deactivate(cpu_buffer);
1807+
17751808
list_for_each_entry_safe(bpage, tmp, head, list) {
17761809
list_del_init(&bpage->list);
17771810
free_buffer_page(bpage);
@@ -2007,6 +2040,7 @@ rb_remove_pages(struct ring_buffer_per_cpu *cpu_buffer, unsigned long nr_pages)
20072040
*/
20082041
local_add(page_entries, &cpu_buffer->overrun);
20092042
local_sub(BUF_PAGE_SIZE, &cpu_buffer->entries_bytes);
2043+
local_inc(&cpu_buffer->pages_lost);
20102044
}
20112045

20122046
/*
@@ -2491,6 +2525,7 @@ rb_handle_head_page(struct ring_buffer_per_cpu *cpu_buffer,
24912525
*/
24922526
local_add(entries, &cpu_buffer->overrun);
24932527
local_sub(BUF_PAGE_SIZE, &cpu_buffer->entries_bytes);
2528+
local_inc(&cpu_buffer->pages_lost);
24942529

24952530
/*
24962531
* The entries will be zeroed out when we move the
@@ -3155,10 +3190,6 @@ static void rb_commit(struct ring_buffer_per_cpu *cpu_buffer,
31553190
static __always_inline void
31563191
rb_wakeups(struct trace_buffer *buffer, struct ring_buffer_per_cpu *cpu_buffer)
31573192
{
3158-
size_t nr_pages;
3159-
size_t dirty;
3160-
size_t full;
3161-
31623193
if (buffer->irq_work.waiters_pending) {
31633194
buffer->irq_work.waiters_pending = false;
31643195
/* irq_work_queue() supplies it's own memory barriers */
@@ -3182,10 +3213,7 @@ rb_wakeups(struct trace_buffer *buffer, struct ring_buffer_per_cpu *cpu_buffer)
31823213

31833214
cpu_buffer->last_pages_touch = local_read(&cpu_buffer->pages_touched);
31843215

3185-
full = cpu_buffer->shortest_full;
3186-
nr_pages = cpu_buffer->nr_pages;
3187-
dirty = ring_buffer_nr_dirty_pages(buffer, cpu_buffer->cpu);
3188-
if (full && nr_pages && (dirty * 100) <= full * nr_pages)
3216+
if (!full_hit(buffer, cpu_buffer->cpu, cpu_buffer->shortest_full))
31893217
return;
31903218

31913219
cpu_buffer->irq_work.wakeup_full = true;
@@ -5248,6 +5276,7 @@ rb_reset_cpu(struct ring_buffer_per_cpu *cpu_buffer)
52485276
local_set(&cpu_buffer->committing, 0);
52495277
local_set(&cpu_buffer->commits, 0);
52505278
local_set(&cpu_buffer->pages_touched, 0);
5279+
local_set(&cpu_buffer->pages_lost, 0);
52515280
local_set(&cpu_buffer->pages_read, 0);
52525281
cpu_buffer->last_pages_touch = 0;
52535282
cpu_buffer->shortest_full = 0;

kernel/trace/synth_event_gen_test.c

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,13 @@ static int __init test_gen_synth_cmd(void)
120120

121121
/* Now generate a gen_synth_test event */
122122
ret = synth_event_trace_array(gen_synth_test, vals, ARRAY_SIZE(vals));
123-
out:
123+
free:
124+
kfree(buf);
124125
return ret;
125126
delete:
126127
/* We got an error after creating the event, delete it */
127128
synth_event_delete("gen_synth_test");
128-
free:
129-
kfree(buf);
130-
131-
goto out;
129+
goto free;
132130
}
133131

134132
/*
@@ -227,15 +225,13 @@ static int __init test_empty_synth_event(void)
227225

228226
/* Now trace an empty_synth_test event */
229227
ret = synth_event_trace_array(empty_synth_test, vals, ARRAY_SIZE(vals));
230-
out:
228+
free:
229+
kfree(buf);
231230
return ret;
232231
delete:
233232
/* We got an error after creating the event, delete it */
234233
synth_event_delete("empty_synth_test");
235-
free:
236-
kfree(buf);
237-
238-
goto out;
234+
goto free;
239235
}
240236

241237
static struct synth_field_desc create_synth_test_fields[] = {

kernel/trace/trace.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6657,6 +6657,7 @@ static int tracing_release_pipe(struct inode *inode, struct file *file)
66576657
mutex_unlock(&trace_types_lock);
66586658

66596659
free_cpumask_var(iter->started);
6660+
kfree(iter->fmt);
66606661
mutex_destroy(&iter->mutex);
66616662
kfree(iter);
66626663

@@ -6681,7 +6682,7 @@ trace_poll(struct trace_iterator *iter, struct file *filp, poll_table *poll_tabl
66816682
return EPOLLIN | EPOLLRDNORM;
66826683
else
66836684
return ring_buffer_poll_wait(iter->array_buffer->buffer, iter->cpu_file,
6684-
filp, poll_table);
6685+
filp, poll_table, iter->tr->buffer_percent);
66856686
}
66866687

66876688
static __poll_t
@@ -7802,6 +7803,7 @@ static struct tracing_log_err *get_tracing_log_err(struct trace_array *tr,
78027803
int len)
78037804
{
78047805
struct tracing_log_err *err;
7806+
char *cmd;
78057807

78067808
if (tr->n_err_log_entries < TRACING_LOG_ERRS_MAX) {
78077809
err = alloc_tracing_log_err(len);
@@ -7810,12 +7812,12 @@ static struct tracing_log_err *get_tracing_log_err(struct trace_array *tr,
78107812

78117813
return err;
78127814
}
7813-
7815+
cmd = kzalloc(len, GFP_KERNEL);
7816+
if (!cmd)
7817+
return ERR_PTR(-ENOMEM);
78147818
err = list_first_entry(&tr->err_log, struct tracing_log_err, list);
78157819
kfree(err->cmd);
7816-
err->cmd = kzalloc(len, GFP_KERNEL);
7817-
if (!err->cmd)
7818-
return ERR_PTR(-ENOMEM);
7820+
err->cmd = cmd;
78197821
list_del(&err->list);
78207822

78217823
return err;

kernel/trace/trace_eprobe.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,9 @@ static void eprobe_trigger_func(struct event_trigger_data *data,
563563
{
564564
struct eprobe_data *edata = data->private_data;
565565

566+
if (unlikely(!rec))
567+
return;
568+
566569
__eprobe_trace_func(edata, rec);
567570
}
568571

kernel/trace/trace_events_synth.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -828,10 +828,9 @@ static int register_synth_event(struct synth_event *event)
828828
}
829829

830830
ret = set_synth_event_print_fmt(call);
831-
if (ret < 0) {
831+
/* unregister_trace_event() will be called inside */
832+
if (ret < 0)
832833
trace_remove_event_call(call);
833-
goto err;
834-
}
835834
out:
836835
return ret;
837836
err:

kernel/trace/trace_syscalls.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,6 @@ print_syscall_exit(struct trace_iterator *iter, int flags,
201201
return trace_handle_return(s);
202202
}
203203

204-
extern char *__bad_type_size(void);
205-
206204
#define SYSCALL_FIELD(_type, _name) { \
207205
.type = #_type, .name = #_name, \
208206
.size = sizeof(_type), .align = __alignof__(_type), \

0 commit comments

Comments
 (0)