Re: [RFC] btf: Some structs are doubled because of struct ring_buffer

Jiri Olsa
2019-12-18T16:14:24Z

On Sat, Dec 14, 2019 at 12:35:10PM +0100, Jiri Olsa wrote:
> On Fri, Dec 13, 2019 at 02:05:31PM -0500, Steven Rostedt wrote:
>
> SNIP
>
> > struct trace_array *tr = filp->private_data;
> > - struct ring_buffer *buffer = tr->trace_buffer.buffer;
> > + struct trace_buffer *buffer = tr->trace_buffer.buffer;
> > unsigned long val;
> > int ret;
> >
> > diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
> > index 63bf60f79398..308fcd673102 100644
> > --- a/kernel/trace/trace.h
> > +++ b/kernel/trace/trace.h
> > @@ -178,7 +178,7 @@ struct trace_option_dentry;
> >
> > struct trace_buffer {
> > struct trace_array *tr;
> > - struct ring_buffer *buffer;
> > + struct trace_buffer *buffer;
>
> perf change is fine, but 'trace_buffer' won't work because
> we already have 'struct trace_buffer' defined in here
>
> maybe we could change this name to trace_buffer_array?

..like in patch below? it's independent of your previous changes

jirka

---
diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index 4c6e15605766..05588dafd3dc 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -79,7 +79,7 @@ struct trace_entry {
struct trace_iterator {
struct trace_array *tr;
struct tracer *trace;
- struct trace_buffer *trace_buffer;
+ struct trace_buffer_array *trace_buffer;
void *private;
int cpu_file;
struct mutex mutex;
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c
index 23459d53d576..9abee8bf831c 100644
--- a/kernel/trace/trace.c
+++ b/kernel/trace/trace.c
@@ -603,7 +603,7 @@ int trace_pid_write(struct trace_pid_list *filtered_pids,
return read;
}

-static u64 buffer_ftrace_now(struct trace_buffer *buf, int cpu)
+static u64 buffer_ftrace_now(struct trace_buffer_array *buf, int cpu)
{
u64 ts;

@@ -1036,9 +1036,9 @@ void *tracing_cond_snapshot_data(struct trace_array *tr)
}
EXPORT_SYMBOL_GPL(tracing_cond_snapshot_data);

-static int resize_buffer_duplicate_size(struct trace_buffer *trace_buf,
- struct trace_buffer *size_buf, int cpu_id);
-static void set_buffer_entries(struct trace_buffer *buf, unsigned long val);
+static int resize_buffer_duplicate_size(struct trace_buffer_array *trace_buf,
+ struct trace_buffer_array *size_buf, int cpu_id);
+static void set_buffer_entries(struct trace_buffer_array *buf, unsigned long val);

int tracing_alloc_snapshot_instance(struct trace_array *tr)
{
@@ -1590,8 +1590,8 @@ void latency_fsnotify(struct trace_array *tr)
static void
__update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
{
- struct trace_buffer *trace_buf = &tr->trace_buffer;
- struct trace_buffer *max_buf = &tr->max_buffer;
+ struct trace_buffer_array *trace_buf = &tr->trace_buffer;
+ struct trace_buffer_array *max_buf = &tr->max_buffer;
struct trace_array_cpu *data = per_cpu_ptr(trace_buf->data, cpu);
struct trace_array_cpu *max_data = per_cpu_ptr(max_buf->data, cpu);

@@ -1962,7 +1962,7 @@ int __init register_tracer(struct tracer *type)
return ret;
}

-static void tracing_reset_cpu(struct trace_buffer *buf, int cpu)
+static void tracing_reset_cpu(struct trace_buffer_array *buf, int cpu)
{
struct ring_buffer *buffer = buf->buffer;

@@ -1978,7 +1978,7 @@ static void tracing_reset_cpu(struct trace_buffer *buf, int cpu)
ring_buffer_record_enable(buffer);
}

-void tracing_reset_online_cpus(struct trace_buffer *buf)
+void tracing_reset_online_cpus(struct trace_buffer_array *buf)
{
struct ring_buffer *buffer = buf->buffer;
int cpu;
@@ -3602,7 +3602,7 @@ static void s_stop(struct seq_file *m, void *p)
}

static void
-get_total_entries_cpu(struct trace_buffer *buf, unsigned long *total,
+get_total_entries_cpu(struct trace_buffer_array *buf, unsigned long *total,
unsigned long *entries, int cpu)
{
unsigned long count;
@@ -3624,7 +3624,7 @@ get_total_entries_cpu(struct trace_buffer *buf, unsigned long *total,
}

static void
-get_total_entries(struct trace_buffer *buf,
+get_total_entries(struct trace_buffer_array *buf,
unsigned long *total, unsigned long *entries)
{
unsigned long t, e;
@@ -3676,7 +3676,7 @@ static void print_lat_help_header(struct seq_file *m)
"# \\ / ||||| \\ | / \n");
}

-static void print_event_info(struct trace_buffer *buf, struct seq_file *m)
+static void print_event_info(struct trace_buffer_array *buf, struct seq_file *m)
{
unsigned long total;
unsigned long entries;
@@ -3687,7 +3687,7 @@ static void print_event_info(struct trace_buffer *buf, struct seq_file *m)
seq_puts(m, "#\n");
}

-static void print_func_help_header(struct trace_buffer *buf, struct seq_file *m,
+static void print_func_help_header(struct trace_buffer_array *buf, struct seq_file *m,
unsigned int flags)
{
bool tgid = flags & TRACE_ITER_RECORD_TGID;
@@ -3698,7 +3698,7 @@ static void print_func_help_header(struct trace_buffer *buf, struct seq_file *m,
seq_printf(m, "# | | %s | | |\n", tgid ? " | " : "");
}

-static void print_func_help_header_irq(struct trace_buffer *buf, struct seq_file *m,
+static void print_func_help_header_irq(struct trace_buffer_array *buf, struct seq_file *m,
unsigned int flags)
{
bool tgid = flags & TRACE_ITER_RECORD_TGID;
@@ -3720,7 +3720,7 @@ void
print_trace_header(struct seq_file *m, struct trace_iterator *iter)
{
unsigned long sym_flags = (global_trace.trace_flags & TRACE_ITER_SYM_MASK);
- struct trace_buffer *buf = iter->trace_buffer;
+ struct trace_buffer_array *buf = iter->trace_buffer;
struct trace_array_cpu *data = per_cpu_ptr(buf->data, buf->cpu);
struct tracer *type = iter->trace;
unsigned long entries;
@@ -4357,7 +4357,7 @@ static int tracing_open(struct inode *inode, struct file *file)
/* If this file was open for write, then erase contents */
if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
int cpu = tracing_get_cpu(inode);
- struct trace_buffer *trace_buf = &tr->trace_buffer;
+ struct trace_buffer_array *trace_buf = &tr->trace_buffer;

#ifdef CONFIG_TRACER_MAX_TRACE
if (tr->current_trace->print_max)
@@ -5532,7 +5532,7 @@ int tracer_init(struct tracer *t, struct trace_array *tr)
return t->init(tr);
}

-static void set_buffer_entries(struct trace_buffer *buf, unsigned long val)
+static void set_buffer_entries(struct trace_buffer_array *buf, unsigned long val)
{
int cpu;

@@ -5542,8 +5542,8 @@ static void set_buffer_entries(struct trace_buffer *buf, unsigned long val)

#ifdef CONFIG_TRACER_MAX_TRACE
/* resize @tr's buffer to the size of @size_tr's entries */
-static int resize_buffer_duplicate_size(struct trace_buffer *trace_buf,
- struct trace_buffer *size_buf, int cpu_id)
+static int resize_buffer_duplicate_size(struct trace_buffer_array *trace_buf,
+ struct trace_buffer_array *size_buf, int cpu_id)
{
int cpu, ret = 0;

@@ -7607,7 +7607,7 @@ tracing_stats_read(struct file *filp, char __user *ubuf,
{
struct inode *inode = file_inode(filp);
struct trace_array *tr = inode->i_private;
- struct trace_buffer *trace_buf = &tr->trace_buffer;
+ struct trace_buffer_array *trace_buf = &tr->trace_buffer;
int cpu = tracing_get_cpu(inode);
struct trace_seq *s;
unsigned long cnt;
@@ -8354,7 +8354,7 @@ static void
init_tracer_tracefs(struct trace_array *tr, struct dentry *d_tracer);

static int
-allocate_trace_buffer(struct trace_array *tr, struct trace_buffer *buf, int size)
+allocate_trace_buffer(struct trace_array *tr, struct trace_buffer_array *buf, int size)
{
enum ring_buffer_flags rb_flags;

@@ -8409,7 +8409,7 @@ static int allocate_trace_buffers(struct trace_array *tr, int size)
return 0;
}

-static void free_trace_buffer(struct trace_buffer *buf)
+static void free_trace_buffer(struct trace_buffer_array *buf)
{
if (buf->buffer) {
ring_buffer_free(buf->buffer);
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index 63bf60f79398..01d0ab7de131 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -176,7 +176,7 @@ struct trace_array_cpu {
struct tracer;
struct trace_option_dentry;

-struct trace_buffer {
+struct trace_buffer_array {
struct trace_array *tr;
struct ring_buffer *buffer;
struct trace_array_cpu __percpu *data;
@@ -247,9 +247,9 @@ struct cond_snapshot {
* They have on/off state as well:
*/
struct trace_array {
- struct list_head list;
- char *name;
- struct trace_buffer trace_buffer;
+ struct list_head list;
+ char *name;
+ struct trace_buffer_array trace_buffer;
#ifdef CONFIG_TRACER_MAX_TRACE
/*
* The max_buffer is used to snapshot the trace when a maximum
@@ -262,8 +262,8 @@ struct trace_array {
* with the buffer of the trace_buffer and the buffers are reset for
* the trace_buffer so the tracing can continue.
*/
- struct trace_buffer max_buffer;
- bool allocated_snapshot;
+ struct trace_buffer_array max_buffer;
+ bool allocated_snapshot;
#endif
#if defined(CONFIG_TRACER_MAX_TRACE) || defined(CONFIG_HWLAT_TRACER)
unsigned long max_latency;
@@ -685,7 +685,7 @@ trace_buffer_iter(struct trace_iterator *iter, int cpu)

int tracer_init(struct tracer *t, struct trace_array *tr);
int tracing_is_enabled(void);
-void tracing_reset_online_cpus(struct trace_buffer *buf);
+void tracing_reset_online_cpus(struct trace_buffer_array *buf);
void tracing_reset_current(int cpu);
void tracing_reset_all_online_cpus(void);
int tracing_open_generic(struct inode *inode, struct file *filp);
diff --git a/kernel/trace/trace_selftest.c b/kernel/trace/trace_selftest.c
index 69ee8ef12cee..d9fc1e0cd8d1 100644
--- a/kernel/trace/trace_selftest.c
+++ b/kernel/trace/trace_selftest.c
@@ -23,7 +23,7 @@ static inline int trace_valid_entry(struct trace_entry *entry)
return 0;
}

-static int trace_test_buffer_cpu(struct trace_buffer *buf, int cpu)
+static int trace_test_buffer_cpu(struct trace_buffer_array *buf, int cpu)
{
struct ring_buffer_event *event;
struct trace_entry *entry;
@@ -60,7 +60,7 @@ static int trace_test_buffer_cpu(struct trace_buffer *buf, int cpu)
* Test the trace buffer to see if all the elements
* are still sane.
*/
-static int __maybe_unused trace_test_buffer(struct trace_buffer *buf, unsigned long *count)
+static int __maybe_unused trace_test_buffer(struct trace_buffer_array *buf, unsigned long *count)
{
unsigned long flags, cnt = 0;
int cpu, ret = 0;