|
@@ -1224,18 +1224,17 @@ void tracing_reset_current(int cpu)
|
|
|
tracing_reset(&global_trace.trace_buffer, cpu);
|
|
|
}
|
|
|
|
|
|
+/* Must have trace_types_lock held */
|
|
|
void tracing_reset_all_online_cpus(void)
|
|
|
{
|
|
|
struct trace_array *tr;
|
|
|
|
|
|
- mutex_lock(&trace_types_lock);
|
|
|
list_for_each_entry(tr, &ftrace_trace_arrays, list) {
|
|
|
tracing_reset_online_cpus(&tr->trace_buffer);
|
|
|
#ifdef CONFIG_TRACER_MAX_TRACE
|
|
|
tracing_reset_online_cpus(&tr->max_buffer);
|
|
|
#endif
|
|
|
}
|
|
|
- mutex_unlock(&trace_types_lock);
|
|
|
}
|
|
|
|
|
|
#define SAVED_CMDLINES 128
|
|
@@ -2843,6 +2842,17 @@ static int s_show(struct seq_file *m, void *v)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Should be used after trace_array_get(), trace_types_lock
|
|
|
+ * ensures that i_cdev was already initialized.
|
|
|
+ */
|
|
|
+static inline int tracing_get_cpu(struct inode *inode)
|
|
|
+{
|
|
|
+ if (inode->i_cdev) /* See trace_create_cpu_file() */
|
|
|
+ return (long)inode->i_cdev - 1;
|
|
|
+ return RING_BUFFER_ALL_CPUS;
|
|
|
+}
|
|
|
+
|
|
|
static const struct seq_operations tracer_seq_ops = {
|
|
|
.start = s_start,
|
|
|
.next = s_next,
|
|
@@ -2851,9 +2861,9 @@ static const struct seq_operations tracer_seq_ops = {
|
|
|
};
|
|
|
|
|
|
static struct trace_iterator *
|
|
|
-__tracing_open(struct trace_array *tr, struct trace_cpu *tc,
|
|
|
- struct inode *inode, struct file *file, bool snapshot)
|
|
|
+__tracing_open(struct inode *inode, struct file *file, bool snapshot)
|
|
|
{
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
struct trace_iterator *iter;
|
|
|
int cpu;
|
|
|
|
|
@@ -2894,8 +2904,8 @@ __tracing_open(struct trace_array *tr, struct trace_cpu *tc,
|
|
|
iter->trace_buffer = &tr->trace_buffer;
|
|
|
iter->snapshot = snapshot;
|
|
|
iter->pos = -1;
|
|
|
+ iter->cpu_file = tracing_get_cpu(inode);
|
|
|
mutex_init(&iter->mutex);
|
|
|
- iter->cpu_file = tc->cpu;
|
|
|
|
|
|
/* Notify the tracer early; before we stop tracing. */
|
|
|
if (iter->trace && iter->trace->open)
|
|
@@ -2971,44 +2981,22 @@ static int tracing_open_generic_tr(struct inode *inode, struct file *filp)
|
|
|
filp->private_data = inode->i_private;
|
|
|
|
|
|
return 0;
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
-static int tracing_open_generic_tc(struct inode *inode, struct file *filp)
|
|
|
-{
|
|
|
- struct trace_cpu *tc = inode->i_private;
|
|
|
- struct trace_array *tr = tc->tr;
|
|
|
-
|
|
|
- if (tracing_disabled)
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
- if (trace_array_get(tr) < 0)
|
|
|
- return -ENODEV;
|
|
|
-
|
|
|
- filp->private_data = inode->i_private;
|
|
|
-
|
|
|
- return 0;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
static int tracing_release(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
struct seq_file *m = file->private_data;
|
|
|
struct trace_iterator *iter;
|
|
|
- struct trace_array *tr;
|
|
|
int cpu;
|
|
|
|
|
|
- /* Writes do not use seq_file, need to grab tr from inode */
|
|
|
if (!(file->f_mode & FMODE_READ)) {
|
|
|
- struct trace_cpu *tc = inode->i_private;
|
|
|
-
|
|
|
- trace_array_put(tc->tr);
|
|
|
+ trace_array_put(tr);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ /* Writes do not use seq_file */
|
|
|
iter = m->private;
|
|
|
- tr = iter->tr;
|
|
|
-
|
|
|
mutex_lock(&trace_types_lock);
|
|
|
|
|
|
for_each_tracing_cpu(cpu) {
|
|
@@ -3044,15 +3032,6 @@ static int tracing_release_generic_tr(struct inode *inode, struct file *file)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int tracing_release_generic_tc(struct inode *inode, struct file *file)
|
|
|
-{
|
|
|
- struct trace_cpu *tc = inode->i_private;
|
|
|
- struct trace_array *tr = tc->tr;
|
|
|
-
|
|
|
- trace_array_put(tr);
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int tracing_single_release_tr(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
struct trace_array *tr = inode->i_private;
|
|
@@ -3064,8 +3043,7 @@ static int tracing_single_release_tr(struct inode *inode, struct file *file)
|
|
|
|
|
|
static int tracing_open(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
- struct trace_cpu *tc = inode->i_private;
|
|
|
- struct trace_array *tr = tc->tr;
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
struct trace_iterator *iter;
|
|
|
int ret = 0;
|
|
|
|
|
@@ -3073,16 +3051,17 @@ static int tracing_open(struct inode *inode, struct file *file)
|
|
|
return -ENODEV;
|
|
|
|
|
|
/* If this file was open for write, then erase contents */
|
|
|
- if ((file->f_mode & FMODE_WRITE) &&
|
|
|
- (file->f_flags & O_TRUNC)) {
|
|
|
- if (tc->cpu == RING_BUFFER_ALL_CPUS)
|
|
|
+ if ((file->f_mode & FMODE_WRITE) && (file->f_flags & O_TRUNC)) {
|
|
|
+ int cpu = tracing_get_cpu(inode);
|
|
|
+
|
|
|
+ if (cpu == RING_BUFFER_ALL_CPUS)
|
|
|
tracing_reset_online_cpus(&tr->trace_buffer);
|
|
|
else
|
|
|
- tracing_reset(&tr->trace_buffer, tc->cpu);
|
|
|
+ tracing_reset(&tr->trace_buffer, cpu);
|
|
|
}
|
|
|
|
|
|
if (file->f_mode & FMODE_READ) {
|
|
|
- iter = __tracing_open(tr, tc, inode, file, false);
|
|
|
+ iter = __tracing_open(inode, file, false);
|
|
|
if (IS_ERR(iter))
|
|
|
ret = PTR_ERR(iter);
|
|
|
else if (trace_flags & TRACE_ITER_LATENCY_FMT)
|
|
@@ -3948,8 +3927,7 @@ tracing_max_lat_write(struct file *filp, const char __user *ubuf,
|
|
|
|
|
|
static int tracing_open_pipe(struct inode *inode, struct file *filp)
|
|
|
{
|
|
|
- struct trace_cpu *tc = inode->i_private;
|
|
|
- struct trace_array *tr = tc->tr;
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
struct trace_iterator *iter;
|
|
|
int ret = 0;
|
|
|
|
|
@@ -3995,9 +3973,9 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp)
|
|
|
if (trace_clocks[tr->clock_id].in_ns)
|
|
|
iter->iter_flags |= TRACE_FILE_TIME_IN_NS;
|
|
|
|
|
|
- iter->cpu_file = tc->cpu;
|
|
|
- iter->tr = tc->tr;
|
|
|
- iter->trace_buffer = &tc->tr->trace_buffer;
|
|
|
+ iter->tr = tr;
|
|
|
+ iter->trace_buffer = &tr->trace_buffer;
|
|
|
+ iter->cpu_file = tracing_get_cpu(inode);
|
|
|
mutex_init(&iter->mutex);
|
|
|
filp->private_data = iter;
|
|
|
|
|
@@ -4020,8 +3998,7 @@ fail:
|
|
|
static int tracing_release_pipe(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
struct trace_iterator *iter = file->private_data;
|
|
|
- struct trace_cpu *tc = inode->i_private;
|
|
|
- struct trace_array *tr = tc->tr;
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
|
|
|
mutex_lock(&trace_types_lock);
|
|
|
|
|
@@ -4374,15 +4351,16 @@ static ssize_t
|
|
|
tracing_entries_read(struct file *filp, char __user *ubuf,
|
|
|
size_t cnt, loff_t *ppos)
|
|
|
{
|
|
|
- struct trace_cpu *tc = filp->private_data;
|
|
|
- struct trace_array *tr = tc->tr;
|
|
|
+ struct inode *inode = file_inode(filp);
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
+ int cpu = tracing_get_cpu(inode);
|
|
|
char buf[64];
|
|
|
int r = 0;
|
|
|
ssize_t ret;
|
|
|
|
|
|
mutex_lock(&trace_types_lock);
|
|
|
|
|
|
- if (tc->cpu == RING_BUFFER_ALL_CPUS) {
|
|
|
+ if (cpu == RING_BUFFER_ALL_CPUS) {
|
|
|
int cpu, buf_size_same;
|
|
|
unsigned long size;
|
|
|
|
|
@@ -4409,7 +4387,7 @@ tracing_entries_read(struct file *filp, char __user *ubuf,
|
|
|
} else
|
|
|
r = sprintf(buf, "X\n");
|
|
|
} else
|
|
|
- r = sprintf(buf, "%lu\n", per_cpu_ptr(tr->trace_buffer.data, tc->cpu)->entries >> 10);
|
|
|
+ r = sprintf(buf, "%lu\n", per_cpu_ptr(tr->trace_buffer.data, cpu)->entries >> 10);
|
|
|
|
|
|
mutex_unlock(&trace_types_lock);
|
|
|
|
|
@@ -4421,7 +4399,8 @@ static ssize_t
|
|
|
tracing_entries_write(struct file *filp, const char __user *ubuf,
|
|
|
size_t cnt, loff_t *ppos)
|
|
|
{
|
|
|
- struct trace_cpu *tc = filp->private_data;
|
|
|
+ struct inode *inode = file_inode(filp);
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
unsigned long val;
|
|
|
int ret;
|
|
|
|
|
@@ -4435,8 +4414,7 @@ tracing_entries_write(struct file *filp, const char __user *ubuf,
|
|
|
|
|
|
/* value is in KB */
|
|
|
val <<= 10;
|
|
|
-
|
|
|
- ret = tracing_resize_ring_buffer(tc->tr, val, tc->cpu);
|
|
|
+ ret = tracing_resize_ring_buffer(tr, val, tracing_get_cpu(inode));
|
|
|
if (ret < 0)
|
|
|
return ret;
|
|
|
|
|
@@ -4697,8 +4675,7 @@ struct ftrace_buffer_info {
|
|
|
#ifdef CONFIG_TRACER_SNAPSHOT
|
|
|
static int tracing_snapshot_open(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
- struct trace_cpu *tc = inode->i_private;
|
|
|
- struct trace_array *tr = tc->tr;
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
struct trace_iterator *iter;
|
|
|
struct seq_file *m;
|
|
|
int ret = 0;
|
|
@@ -4707,7 +4684,7 @@ static int tracing_snapshot_open(struct inode *inode, struct file *file)
|
|
|
return -ENODEV;
|
|
|
|
|
|
if (file->f_mode & FMODE_READ) {
|
|
|
- iter = __tracing_open(tr, tc, inode, file, true);
|
|
|
+ iter = __tracing_open(inode, file, true);
|
|
|
if (IS_ERR(iter))
|
|
|
ret = PTR_ERR(iter);
|
|
|
} else {
|
|
@@ -4724,8 +4701,8 @@ static int tracing_snapshot_open(struct inode *inode, struct file *file)
|
|
|
ret = 0;
|
|
|
|
|
|
iter->tr = tr;
|
|
|
- iter->trace_buffer = &tc->tr->max_buffer;
|
|
|
- iter->cpu_file = tc->cpu;
|
|
|
+ iter->trace_buffer = &tr->max_buffer;
|
|
|
+ iter->cpu_file = tracing_get_cpu(inode);
|
|
|
m->private = iter;
|
|
|
file->private_data = m;
|
|
|
}
|
|
@@ -4884,11 +4861,11 @@ static const struct file_operations tracing_pipe_fops = {
|
|
|
};
|
|
|
|
|
|
static const struct file_operations tracing_entries_fops = {
|
|
|
- .open = tracing_open_generic_tc,
|
|
|
+ .open = tracing_open_generic_tr,
|
|
|
.read = tracing_entries_read,
|
|
|
.write = tracing_entries_write,
|
|
|
.llseek = generic_file_llseek,
|
|
|
- .release = tracing_release_generic_tc,
|
|
|
+ .release = tracing_release_generic_tr,
|
|
|
};
|
|
|
|
|
|
static const struct file_operations tracing_total_entries_fops = {
|
|
@@ -4940,8 +4917,7 @@ static const struct file_operations snapshot_raw_fops = {
|
|
|
|
|
|
static int tracing_buffers_open(struct inode *inode, struct file *filp)
|
|
|
{
|
|
|
- struct trace_cpu *tc = inode->i_private;
|
|
|
- struct trace_array *tr = tc->tr;
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
struct ftrace_buffer_info *info;
|
|
|
int ret;
|
|
|
|
|
@@ -4960,7 +4936,7 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)
|
|
|
mutex_lock(&trace_types_lock);
|
|
|
|
|
|
info->iter.tr = tr;
|
|
|
- info->iter.cpu_file = tc->cpu;
|
|
|
+ info->iter.cpu_file = tracing_get_cpu(inode);
|
|
|
info->iter.trace = tr->current_trace;
|
|
|
info->iter.trace_buffer = &tr->trace_buffer;
|
|
|
info->spare = NULL;
|
|
@@ -5277,14 +5253,14 @@ static ssize_t
|
|
|
tracing_stats_read(struct file *filp, char __user *ubuf,
|
|
|
size_t count, loff_t *ppos)
|
|
|
{
|
|
|
- struct trace_cpu *tc = filp->private_data;
|
|
|
- struct trace_array *tr = tc->tr;
|
|
|
+ struct inode *inode = file_inode(filp);
|
|
|
+ struct trace_array *tr = inode->i_private;
|
|
|
struct trace_buffer *trace_buf = &tr->trace_buffer;
|
|
|
+ int cpu = tracing_get_cpu(inode);
|
|
|
struct trace_seq *s;
|
|
|
unsigned long cnt;
|
|
|
unsigned long long t;
|
|
|
unsigned long usec_rem;
|
|
|
- int cpu = tc->cpu;
|
|
|
|
|
|
s = kmalloc(sizeof(*s), GFP_KERNEL);
|
|
|
if (!s)
|
|
@@ -5337,10 +5313,10 @@ tracing_stats_read(struct file *filp, char __user *ubuf,
|
|
|
}
|
|
|
|
|
|
static const struct file_operations tracing_stats_fops = {
|
|
|
- .open = tracing_open_generic_tc,
|
|
|
+ .open = tracing_open_generic_tr,
|
|
|
.read = tracing_stats_read,
|
|
|
.llseek = generic_file_llseek,
|
|
|
- .release = tracing_release_generic_tc,
|
|
|
+ .release = tracing_release_generic_tr,
|
|
|
};
|
|
|
|
|
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
|
@@ -5529,10 +5505,20 @@ static struct dentry *tracing_dentry_percpu(struct trace_array *tr, int cpu)
|
|
|
return tr->percpu_dir;
|
|
|
}
|
|
|
|
|
|
+static struct dentry *
|
|
|
+trace_create_cpu_file(const char *name, umode_t mode, struct dentry *parent,
|
|
|
+ void *data, long cpu, const struct file_operations *fops)
|
|
|
+{
|
|
|
+ struct dentry *ret = trace_create_file(name, mode, parent, data, fops);
|
|
|
+
|
|
|
+ if (ret) /* See tracing_get_cpu() */
|
|
|
+ ret->d_inode->i_cdev = (void *)(cpu + 1);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
static void
|
|
|
tracing_init_debugfs_percpu(struct trace_array *tr, long cpu)
|
|
|
{
|
|
|
- struct trace_array_cpu *data = per_cpu_ptr(tr->trace_buffer.data, cpu);
|
|
|
struct dentry *d_percpu = tracing_dentry_percpu(tr, cpu);
|
|
|
struct dentry *d_cpu;
|
|
|
char cpu_dir[30]; /* 30 characters should be more than enough */
|
|
@@ -5548,28 +5534,28 @@ tracing_init_debugfs_percpu(struct trace_array *tr, long cpu)
|
|
|
}
|
|
|
|
|
|
/* per cpu trace_pipe */
|
|
|
- trace_create_file("trace_pipe", 0444, d_cpu,
|
|
|
- (void *)&data->trace_cpu, &tracing_pipe_fops);
|
|
|
+ trace_create_cpu_file("trace_pipe", 0444, d_cpu,
|
|
|
+ tr, cpu, &tracing_pipe_fops);
|
|
|
|
|
|
/* per cpu trace */
|
|
|
- trace_create_file("trace", 0644, d_cpu,
|
|
|
- (void *)&data->trace_cpu, &tracing_fops);
|
|
|
+ trace_create_cpu_file("trace", 0644, d_cpu,
|
|
|
+ tr, cpu, &tracing_fops);
|
|
|
|
|
|
- trace_create_file("trace_pipe_raw", 0444, d_cpu,
|
|
|
- (void *)&data->trace_cpu, &tracing_buffers_fops);
|
|
|
+ trace_create_cpu_file("trace_pipe_raw", 0444, d_cpu,
|
|
|
+ tr, cpu, &tracing_buffers_fops);
|
|
|
|
|
|
- trace_create_file("stats", 0444, d_cpu,
|
|
|
- (void *)&data->trace_cpu, &tracing_stats_fops);
|
|
|
+ trace_create_cpu_file("stats", 0444, d_cpu,
|
|
|
+ tr, cpu, &tracing_stats_fops);
|
|
|
|
|
|
- trace_create_file("buffer_size_kb", 0444, d_cpu,
|
|
|
- (void *)&data->trace_cpu, &tracing_entries_fops);
|
|
|
+ trace_create_cpu_file("buffer_size_kb", 0444, d_cpu,
|
|
|
+ tr, cpu, &tracing_entries_fops);
|
|
|
|
|
|
#ifdef CONFIG_TRACER_SNAPSHOT
|
|
|
- trace_create_file("snapshot", 0644, d_cpu,
|
|
|
- (void *)&data->trace_cpu, &snapshot_fops);
|
|
|
+ trace_create_cpu_file("snapshot", 0644, d_cpu,
|
|
|
+ tr, cpu, &snapshot_fops);
|
|
|
|
|
|
- trace_create_file("snapshot_raw", 0444, d_cpu,
|
|
|
- (void *)&data->trace_cpu, &snapshot_raw_fops);
|
|
|
+ trace_create_cpu_file("snapshot_raw", 0444, d_cpu,
|
|
|
+ tr, cpu, &snapshot_raw_fops);
|
|
|
#endif
|
|
|
}
|
|
|
|
|
@@ -5878,17 +5864,6 @@ struct dentry *trace_instance_dir;
|
|
|
static void
|
|
|
init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer);
|
|
|
|
|
|
-static void init_trace_buffers(struct trace_array *tr, struct trace_buffer *buf)
|
|
|
-{
|
|
|
- int cpu;
|
|
|
-
|
|
|
- for_each_tracing_cpu(cpu) {
|
|
|
- memset(per_cpu_ptr(buf->data, cpu), 0, sizeof(struct trace_array_cpu));
|
|
|
- per_cpu_ptr(buf->data, cpu)->trace_cpu.cpu = cpu;
|
|
|
- per_cpu_ptr(buf->data, cpu)->trace_cpu.tr = tr;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
static int
|
|
|
allocate_trace_buffer(struct trace_array *tr, struct trace_buffer *buf, int size)
|
|
|
{
|
|
@@ -5906,8 +5881,6 @@ allocate_trace_buffer(struct trace_array *tr, struct trace_buffer *buf, int size
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- init_trace_buffers(tr, buf);
|
|
|
-
|
|
|
/* Allocate the first page for all buffers */
|
|
|
set_buffer_entries(&tr->trace_buffer,
|
|
|
ring_buffer_size(tr->trace_buffer.buffer, 0));
|
|
@@ -5974,10 +5947,6 @@ static int new_instance_create(const char *name)
|
|
|
if (allocate_trace_buffers(tr, trace_buf_size) < 0)
|
|
|
goto out_free_tr;
|
|
|
|
|
|
- /* Holder for file callbacks */
|
|
|
- tr->trace_cpu.cpu = RING_BUFFER_ALL_CPUS;
|
|
|
- tr->trace_cpu.tr = tr;
|
|
|
-
|
|
|
tr->dir = debugfs_create_dir(name, trace_instance_dir);
|
|
|
if (!tr->dir)
|
|
|
goto out_free_tr;
|
|
@@ -6132,13 +6101,13 @@ init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer)
|
|
|
tr, &tracing_iter_fops);
|
|
|
|
|
|
trace_create_file("trace", 0644, d_tracer,
|
|
|
- (void *)&tr->trace_cpu, &tracing_fops);
|
|
|
+ tr, &tracing_fops);
|
|
|
|
|
|
trace_create_file("trace_pipe", 0444, d_tracer,
|
|
|
- (void *)&tr->trace_cpu, &tracing_pipe_fops);
|
|
|
+ tr, &tracing_pipe_fops);
|
|
|
|
|
|
trace_create_file("buffer_size_kb", 0644, d_tracer,
|
|
|
- (void *)&tr->trace_cpu, &tracing_entries_fops);
|
|
|
+ tr, &tracing_entries_fops);
|
|
|
|
|
|
trace_create_file("buffer_total_size_kb", 0444, d_tracer,
|
|
|
tr, &tracing_total_entries_fops);
|
|
@@ -6153,11 +6122,11 @@ init_tracer_debugfs(struct trace_array *tr, struct dentry *d_tracer)
|
|
|
&trace_clock_fops);
|
|
|
|
|
|
trace_create_file("tracing_on", 0644, d_tracer,
|
|
|
- tr, &rb_simple_fops);
|
|
|
+ tr, &rb_simple_fops);
|
|
|
|
|
|
#ifdef CONFIG_TRACER_SNAPSHOT
|
|
|
trace_create_file("snapshot", 0644, d_tracer,
|
|
|
- (void *)&tr->trace_cpu, &snapshot_fops);
|
|
|
+ tr, &snapshot_fops);
|
|
|
#endif
|
|
|
|
|
|
for_each_tracing_cpu(cpu)
|
|
@@ -6451,10 +6420,6 @@ __init static int tracer_alloc_buffers(void)
|
|
|
|
|
|
global_trace.flags = TRACE_ARRAY_FL_GLOBAL;
|
|
|
|
|
|
- /* Holder for file callbacks */
|
|
|
- global_trace.trace_cpu.cpu = RING_BUFFER_ALL_CPUS;
|
|
|
- global_trace.trace_cpu.tr = &global_trace;
|
|
|
-
|
|
|
INIT_LIST_HEAD(&global_trace.systems);
|
|
|
INIT_LIST_HEAD(&global_trace.events);
|
|
|
list_add(&global_trace.list, &ftrace_trace_arrays);
|