ftrace: restore iterator trace in pipe read
[deliverable/linux.git] / kernel / trace / trace.c
index 65d2c0a61ed4170c5b08851614484cf2d7778a69..d141fc98f3a88867410d6a4cd2c8f9835596c0c7 100644 (file)
@@ -37,7 +37,7 @@ unsigned long __read_mostly   tracing_thresh;
 
 static int tracing_disabled = 1;
 
-static long
+long
 ns2usecs(cycle_t nsec)
 {
        nsec += 500;
@@ -96,18 +96,6 @@ unsigned long nsecs_to_usecs(unsigned long nsecs)
        return nsecs / 1000;
 }
 
-enum trace_type {
-       __TRACE_FIRST_TYPE = 0,
-
-       TRACE_FN,
-       TRACE_CTX,
-       TRACE_WAKE,
-       TRACE_STACK,
-       TRACE_SPECIAL,
-
-       __TRACE_LAST_TYPE
-};
-
 enum trace_flag_type {
        TRACE_FLAG_IRQS_OFF             = 0x01,
        TRACE_FLAG_NEED_RESCHED         = 0x02,
@@ -129,10 +117,12 @@ static const char *trace_options[] = {
        "bin",
        "block",
        "stacktrace",
+       "sched-tree",
        NULL
 };
 
-static DEFINE_SPINLOCK(ftrace_max_lock);
+static raw_spinlock_t ftrace_max_lock =
+       (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
 
 /*
  * Copy the new maximum trace into the separate maximum-trace
@@ -188,7 +178,7 @@ void *head_page(struct trace_array_cpu *data)
        return page_address(page);
 }
 
-static int
+int
 trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
 {
        int len = (PAGE_SIZE - 1) - s->len;
@@ -203,7 +193,7 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
        va_end(ap);
 
        /* If we can't write it all, don't bother writing anything */
-       if (ret > len)
+       if (ret >= len)
                return 0;
 
        s->len += ret;
@@ -334,7 +324,7 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
        int i;
 
        WARN_ON_ONCE(!irqs_disabled());
-       spin_lock(&ftrace_max_lock);
+       __raw_spin_lock(&ftrace_max_lock);
        /* clear out all the previous traces */
        for_each_possible_cpu(i) {
                data = tr->data[i];
@@ -343,7 +333,7 @@ update_max_tr(struct trace_array *tr, struct task_struct *tsk, int cpu)
        }
 
        __update_max_tr(tr, tsk, cpu);
-       spin_unlock(&ftrace_max_lock);
+       __raw_spin_unlock(&ftrace_max_lock);
 }
 
 /**
@@ -359,7 +349,7 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu)
        int i;
 
        WARN_ON_ONCE(!irqs_disabled());
-       spin_lock(&ftrace_max_lock);
+       __raw_spin_lock(&ftrace_max_lock);
        for_each_possible_cpu(i)
                tracing_reset(max_tr.data[i]);
 
@@ -367,7 +357,7 @@ update_max_tr_single(struct trace_array *tr, struct task_struct *tsk, int cpu)
        tracing_reset(data);
 
        __update_max_tr(tr, tsk, cpu);
-       spin_unlock(&ftrace_max_lock);
+       __raw_spin_unlock(&ftrace_max_lock);
 }
 
 int register_tracer(struct tracer *type)
@@ -636,7 +626,7 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags)
        pc = preempt_count();
 
        entry->preempt_count    = pc & 0xff;
-       entry->pid              = tsk->pid;
+       entry->pid              = (tsk) ? tsk->pid : 0;
        entry->t                = ftrace_now(raw_smp_processor_id());
        entry->flags = (irqs_disabled_flags(flags) ? TRACE_FLAG_IRQS_OFF : 0) |
                ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |
@@ -651,15 +641,15 @@ trace_function(struct trace_array *tr, struct trace_array_cpu *data,
        struct trace_entry *entry;
        unsigned long irq_flags;
 
-       spin_lock_irqsave(&data->lock, irq_flags);
+       raw_local_irq_save(irq_flags);
+       __raw_spin_lock(&data->lock);
        entry                   = tracing_get_trace_entry(tr, data);
        tracing_generic_entry_update(entry, flags);
        entry->type             = TRACE_FN;
        entry->fn.ip            = ip;
        entry->fn.parent_ip     = parent_ip;
-       spin_unlock_irqrestore(&data->lock, irq_flags);
-
-       trace_wake_up();
+       __raw_spin_unlock(&data->lock);
+       raw_local_irq_restore(irq_flags);
 }
 
 void
@@ -679,14 +669,16 @@ __trace_special(void *__tr, void *__data,
        struct trace_entry *entry;
        unsigned long irq_flags;
 
-       spin_lock_irqsave(&data->lock, irq_flags);
+       raw_local_irq_save(irq_flags);
+       __raw_spin_lock(&data->lock);
        entry                   = tracing_get_trace_entry(tr, data);
        tracing_generic_entry_update(entry, 0);
        entry->type             = TRACE_SPECIAL;
        entry->special.arg1     = arg1;
        entry->special.arg2     = arg2;
        entry->special.arg3     = arg3;
-       spin_unlock_irqrestore(&data->lock, irq_flags);
+       __raw_spin_unlock(&data->lock);
+       raw_local_irq_restore(irq_flags);
 
        trace_wake_up();
 }
@@ -726,7 +718,8 @@ tracing_sched_switch_trace(struct trace_array *tr,
        struct trace_entry *entry;
        unsigned long irq_flags;
 
-       spin_lock_irqsave(&data->lock, irq_flags);
+       raw_local_irq_save(irq_flags);
+       __raw_spin_lock(&data->lock);
        entry                   = tracing_get_trace_entry(tr, data);
        tracing_generic_entry_update(entry, flags);
        entry->type             = TRACE_CTX;
@@ -735,8 +728,10 @@ tracing_sched_switch_trace(struct trace_array *tr,
        entry->ctx.prev_state   = prev->state;
        entry->ctx.next_pid     = next->pid;
        entry->ctx.next_prio    = next->prio;
+       entry->ctx.next_state   = next->state;
        __trace_stack(tr, data, flags, 4);
-       spin_unlock_irqrestore(&data->lock, irq_flags);
+       __raw_spin_unlock(&data->lock);
+       raw_local_irq_restore(irq_flags);
 }
 
 void
@@ -749,7 +744,8 @@ tracing_sched_wakeup_trace(struct trace_array *tr,
        struct trace_entry *entry;
        unsigned long irq_flags;
 
-       spin_lock_irqsave(&data->lock, irq_flags);
+       raw_local_irq_save(irq_flags);
+       __raw_spin_lock(&data->lock);
        entry                   = tracing_get_trace_entry(tr, data);
        tracing_generic_entry_update(entry, flags);
        entry->type             = TRACE_WAKE;
@@ -758,8 +754,10 @@ tracing_sched_wakeup_trace(struct trace_array *tr,
        entry->ctx.prev_state   = curr->state;
        entry->ctx.next_pid     = wakee->pid;
        entry->ctx.next_prio    = wakee->prio;
+       entry->ctx.next_state   = wakee->state;
        __trace_stack(tr, data, flags, 5);
-       spin_unlock_irqrestore(&data->lock, irq_flags);
+       __raw_spin_unlock(&data->lock);
+       raw_local_irq_restore(irq_flags);
 
        trace_wake_up();
 }
@@ -954,8 +952,10 @@ static void *s_start(struct seq_file *m, loff_t *pos)
 
        mutex_lock(&trace_types_lock);
 
-       if (!current_trace || current_trace != iter->trace)
+       if (!current_trace || current_trace != iter->trace) {
+               mutex_unlock(&trace_types_lock);
                return NULL;
+       }
 
        atomic_inc(&trace_record_cmdline_disabled);
 
@@ -1206,8 +1206,9 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
        unsigned long abs_usecs;
        unsigned long rel_usecs;
        char *comm;
-       int S;
+       int S, T;
        int i;
+       unsigned state;
 
        if (!next_entry)
                next_entry = entry;
@@ -1226,10 +1227,8 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
                                 abs_usecs % 1000, rel_usecs/1000,
                                 rel_usecs % 1000);
        } else {
-               if (entry->type != TRACE_STACK) {
-                       lat_print_generic(s, entry, cpu);
-                       lat_print_timestamp(s, abs_usecs, rel_usecs);
-               }
+               lat_print_generic(s, entry, cpu);
+               lat_print_timestamp(s, abs_usecs, rel_usecs);
        }
        switch (entry->type) {
        case TRACE_FN:
@@ -1240,19 +1239,22 @@ print_lat_fmt(struct trace_iterator *iter, unsigned int trace_idx, int cpu)
                break;
        case TRACE_CTX:
        case TRACE_WAKE:
-               S = entry->ctx.prev_state < sizeof(state_to_char) ?
-                       state_to_char[entry->ctx.prev_state] : 'X';
+               T = entry->ctx.next_state < sizeof(state_to_char) ?
+                       state_to_char[entry->ctx.next_state] : 'X';
+
+               state = entry->ctx.prev_state ? __ffs(entry->ctx.prev_state) + 1 : 0;
+               S = state < sizeof(state_to_char) - 1 ? state_to_char[state] : 'X';
                comm = trace_find_cmdline(entry->ctx.next_pid);
-               trace_seq_printf(s, " %5d:%3d:%c %s %5d:%3d %s\n",
+               trace_seq_printf(s, " %5d:%3d:%c %s %5d:%3d:%c %s\n",
                                 entry->ctx.prev_pid,
                                 entry->ctx.prev_prio,
                                 S, entry->type == TRACE_CTX ? "==>" : "  +",
                                 entry->ctx.next_pid,
                                 entry->ctx.next_prio,
-                                comm);
+                                T, comm);
                break;
        case TRACE_SPECIAL:
-               trace_seq_printf(s, " %ld %ld %ld\n",
+               trace_seq_printf(s, "# %ld %ld %ld\n",
                                 entry->special.arg1,
                                 entry->special.arg2,
                                 entry->special.arg3);
@@ -1281,7 +1283,7 @@ static int print_trace_fmt(struct trace_iterator *iter)
        unsigned long secs;
        char *comm;
        int ret;
-       int S;
+       int S, T;
        int i;
 
        entry = iter->ent;
@@ -1292,17 +1294,15 @@ static int print_trace_fmt(struct trace_iterator *iter)
        usec_rem = do_div(t, 1000000ULL);
        secs = (unsigned long)t;
 
-       if (entry->type != TRACE_STACK) {
-               ret = trace_seq_printf(s, "%16s-%-5d ", comm, entry->pid);
-               if (!ret)
-                       return 0;
-               ret = trace_seq_printf(s, "[%02d] ", iter->cpu);
-               if (!ret)
-                       return 0;
-               ret = trace_seq_printf(s, "%5lu.%06lu: ", secs, usec_rem);
-               if (!ret)
-                       return 0;
-       }
+       ret = trace_seq_printf(s, "%16s-%-5d ", comm, entry->pid);
+       if (!ret)
+               return 0;
+       ret = trace_seq_printf(s, "[%02d] ", iter->cpu);
+       if (!ret)
+               return 0;
+       ret = trace_seq_printf(s, "%5lu.%06lu: ", secs, usec_rem);
+       if (!ret)
+               return 0;
 
        switch (entry->type) {
        case TRACE_FN:
@@ -1327,18 +1327,21 @@ static int print_trace_fmt(struct trace_iterator *iter)
        case TRACE_WAKE:
                S = entry->ctx.prev_state < sizeof(state_to_char) ?
                        state_to_char[entry->ctx.prev_state] : 'X';
-               ret = trace_seq_printf(s, " %5d:%3d:%c %s %5d:%3d\n",
+               T = entry->ctx.next_state < sizeof(state_to_char) ?
+                       state_to_char[entry->ctx.next_state] : 'X';
+               ret = trace_seq_printf(s, " %5d:%3d:%c %s %5d:%3d:%c\n",
                                       entry->ctx.prev_pid,
                                       entry->ctx.prev_prio,
                                       S,
                                       entry->type == TRACE_CTX ? "==>" : "  +",
                                       entry->ctx.next_pid,
-                                      entry->ctx.next_prio);
+                                      entry->ctx.next_prio,
+                                      T);
                if (!ret)
                        return 0;
                break;
        case TRACE_SPECIAL:
-               ret = trace_seq_printf(s, " %ld %ld %ld\n",
+               ret = trace_seq_printf(s, "# %ld %ld %ld\n",
                                 entry->special.arg1,
                                 entry->special.arg2,
                                 entry->special.arg3);
@@ -1370,7 +1373,7 @@ static int print_raw_fmt(struct trace_iterator *iter)
        struct trace_seq *s = &iter->seq;
        struct trace_entry *entry;
        int ret;
-       int S;
+       int S, T;
 
        entry = iter->ent;
 
@@ -1390,20 +1393,23 @@ static int print_raw_fmt(struct trace_iterator *iter)
        case TRACE_WAKE:
                S = entry->ctx.prev_state < sizeof(state_to_char) ?
                        state_to_char[entry->ctx.prev_state] : 'X';
+               T = entry->ctx.next_state < sizeof(state_to_char) ?
+                       state_to_char[entry->ctx.next_state] : 'X';
                if (entry->type == TRACE_WAKE)
                        S = '+';
-               ret = trace_seq_printf(s, "%d %d %c %d %d\n",
+               ret = trace_seq_printf(s, "%d %d %c %d %d %c\n",
                                       entry->ctx.prev_pid,
                                       entry->ctx.prev_prio,
                                       S,
                                       entry->ctx.next_pid,
-                                      entry->ctx.next_prio);
+                                      entry->ctx.next_prio,
+                                      T);
                if (!ret)
                        return 0;
                break;
        case TRACE_SPECIAL:
        case TRACE_STACK:
-               ret = trace_seq_printf(s, " %ld %ld %ld\n",
+               ret = trace_seq_printf(s, "# %ld %ld %ld\n",
                                 entry->special.arg1,
                                 entry->special.arg2,
                                 entry->special.arg3);
@@ -1431,7 +1437,7 @@ static int print_hex_fmt(struct trace_iterator *iter)
        struct trace_seq *s = &iter->seq;
        unsigned char newline = '\n';
        struct trace_entry *entry;
-       int S;
+       int S, T;
 
        entry = iter->ent;
 
@@ -1448,6 +1454,8 @@ static int print_hex_fmt(struct trace_iterator *iter)
        case TRACE_WAKE:
                S = entry->ctx.prev_state < sizeof(state_to_char) ?
                        state_to_char[entry->ctx.prev_state] : 'X';
+               T = entry->ctx.next_state < sizeof(state_to_char) ?
+                       state_to_char[entry->ctx.next_state] : 'X';
                if (entry->type == TRACE_WAKE)
                        S = '+';
                SEQ_PUT_HEX_FIELD_RET(s, entry->ctx.prev_pid);
@@ -1456,6 +1464,7 @@ static int print_hex_fmt(struct trace_iterator *iter)
                SEQ_PUT_HEX_FIELD_RET(s, entry->ctx.next_pid);
                SEQ_PUT_HEX_FIELD_RET(s, entry->ctx.next_prio);
                SEQ_PUT_HEX_FIELD_RET(s, entry->fn.parent_ip);
+               SEQ_PUT_HEX_FIELD_RET(s, T);
                break;
        case TRACE_SPECIAL:
        case TRACE_STACK:
@@ -1491,6 +1500,7 @@ static int print_bin_fmt(struct trace_iterator *iter)
                SEQ_PUT_FIELD_RET(s, entry->ctx.prev_state);
                SEQ_PUT_FIELD_RET(s, entry->ctx.next_pid);
                SEQ_PUT_FIELD_RET(s, entry->ctx.next_prio);
+               SEQ_PUT_FIELD_RET(s, entry->ctx.next_state);
                break;
        case TRACE_SPECIAL:
        case TRACE_STACK:
@@ -1520,6 +1530,9 @@ static int trace_empty(struct trace_iterator *iter)
 
 static int print_trace_line(struct trace_iterator *iter)
 {
+       if (iter->trace && iter->trace->print_line)
+               return iter->trace->print_line(iter);
+
        if (trace_flags & TRACE_ITER_BIN)
                return print_bin_fmt(iter);
 
@@ -1753,9 +1766,102 @@ static struct file_operations tracing_lt_fops = {
 };
 
 static struct file_operations show_traces_fops = {
-       .open = show_traces_open,
-       .read = seq_read,
-       .release = seq_release,
+       .open           = show_traces_open,
+       .read           = seq_read,
+       .release        = seq_release,
+};
+
+/*
+ * Only trace on a CPU if the bitmask is set:
+ */
+static cpumask_t tracing_cpumask = CPU_MASK_ALL;
+
+/*
+ * When tracing/tracing_cpu_mask is modified then this holds
+ * the new bitmask we are about to install:
+ */
+static cpumask_t tracing_cpumask_new;
+
+/*
+ * The tracer itself will not take this lock, but still we want
+ * to provide a consistent cpumask to user-space:
+ */
+static DEFINE_MUTEX(tracing_cpumask_update_lock);
+
+/*
+ * Temporary storage for the character representation of the
+ * CPU bitmask (and one more byte for the newline):
+ */
+static char mask_str[NR_CPUS + 1];
+
+static ssize_t
+tracing_cpumask_read(struct file *filp, char __user *ubuf,
+                    size_t count, loff_t *ppos)
+{
+       int len;
+
+       mutex_lock(&tracing_cpumask_update_lock);
+
+       len = cpumask_scnprintf(mask_str, count, tracing_cpumask);
+       if (count - len < 2) {
+               count = -EINVAL;
+               goto out_err;
+       }
+       len += sprintf(mask_str + len, "\n");
+       count = simple_read_from_buffer(ubuf, count, ppos, mask_str, NR_CPUS+1);
+
+out_err:
+       mutex_unlock(&tracing_cpumask_update_lock);
+
+       return count;
+}
+
+static ssize_t
+tracing_cpumask_write(struct file *filp, const char __user *ubuf,
+                     size_t count, loff_t *ppos)
+{
+       int err, cpu;
+
+       mutex_lock(&tracing_cpumask_update_lock);
+       err = cpumask_parse_user(ubuf, count, tracing_cpumask_new);
+       if (err)
+               goto err_unlock;
+
+       raw_local_irq_disable();
+       __raw_spin_lock(&ftrace_max_lock);
+       for_each_possible_cpu(cpu) {
+               /*
+                * Increase/decrease the disabled counter if we are
+                * about to flip a bit in the cpumask:
+                */
+               if (cpu_isset(cpu, tracing_cpumask) &&
+                               !cpu_isset(cpu, tracing_cpumask_new)) {
+                       atomic_inc(&global_trace.data[cpu]->disabled);
+               }
+               if (!cpu_isset(cpu, tracing_cpumask) &&
+                               cpu_isset(cpu, tracing_cpumask_new)) {
+                       atomic_dec(&global_trace.data[cpu]->disabled);
+               }
+       }
+       __raw_spin_unlock(&ftrace_max_lock);
+       raw_local_irq_enable();
+
+       tracing_cpumask = tracing_cpumask_new;
+
+       mutex_unlock(&tracing_cpumask_update_lock);
+
+       return count;
+
+err_unlock:
+       mutex_unlock(&tracing_cpumask_update_lock);
+
+       return err;
+}
+
+static struct file_operations tracing_cpumask_fops = {
+       .open           = tracing_open_generic,
+       .read           = tracing_cpumask_read,
+       .write          = tracing_cpumask_write,
 };
 
 static ssize_t
@@ -1788,8 +1894,7 @@ tracing_iter_ctrl_read(struct file *filp, char __user *ubuf,
        r += sprintf(buf + r, "\n");
        WARN_ON(r >= len + 2);
 
-       r = simple_read_from_buffer(ubuf, cnt, ppos,
-                                   buf, r);
+       r = simple_read_from_buffer(ubuf, cnt, ppos, buf, r);
 
        kfree(buf);
 
@@ -1829,6 +1934,11 @@ tracing_iter_ctrl_write(struct file *filp, const char __user *ubuf,
                        break;
                }
        }
+       /*
+        * If no option could be set, return an error:
+        */
+       if (!trace_options[i])
+               return -EINVAL;
 
        filp->f_pos += cnt;
 
@@ -1836,9 +1946,9 @@ tracing_iter_ctrl_write(struct file *filp, const char __user *ubuf,
 }
 
 static struct file_operations tracing_iter_fops = {
-       .open = tracing_open_generic,
-       .read = tracing_iter_ctrl_read,
-       .write = tracing_iter_ctrl_write,
+       .open           = tracing_open_generic,
+       .read           = tracing_iter_ctrl_read,
+       .write          = tracing_iter_ctrl_write,
 };
 
 static const char readme_msg[] =
@@ -1869,8 +1979,8 @@ tracing_readme_read(struct file *filp, char __user *ubuf,
 }
 
 static struct file_operations tracing_readme_fops = {
-       .open = tracing_open_generic,
-       .read = tracing_readme_read,
+       .open           = tracing_open_generic,
+       .read           = tracing_readme_read,
 };
 
 static ssize_t
@@ -2044,6 +2154,7 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp)
                return -ENOMEM;
 
        iter->tr = &global_trace;
+       iter->trace = current_trace;
 
        filp->private_data = iter;
 
@@ -2091,6 +2202,8 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
 {
        struct trace_iterator *iter = filp->private_data;
        struct trace_array_cpu *data;
+       struct trace_array *tr = iter->tr;
+       struct tracer *tracer = iter->trace;
        static cpumask_t mask;
        static int start;
        unsigned long flags;
@@ -2120,8 +2233,6 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
        start = 0;
 
        while (trace_empty(iter)) {
-               if (!(trace_flags & TRACE_ITER_BLOCK))
-                       return -EWOULDBLOCK;
                /*
                 * This is a make-shift waitqueue. The reason we don't use
                 * an actual wait queue is because:
@@ -2165,7 +2276,8 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
                cnt = PAGE_SIZE - 1;
 
        memset(iter, 0, sizeof(*iter));
-       iter->tr = &global_trace;
+       iter->tr = tr;
+       iter->trace = tracer;
        iter->pos = -1;
 
        /*
@@ -2194,7 +2306,7 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
 
        for_each_cpu_mask(cpu, mask) {
                data = iter->tr->data[cpu];
-               spin_lock(&data->lock);
+               __raw_spin_lock(&data->lock);
        }
 
        while (find_next_entry_inc(iter) != NULL) {
@@ -2215,7 +2327,7 @@ tracing_read_pipe(struct file *filp, char __user *ubuf,
 
        for_each_cpu_mask(cpu, mask) {
                data = iter->tr->data[cpu];
-               spin_unlock(&data->lock);
+               __raw_spin_unlock(&data->lock);
        }
 
        for_each_cpu_mask(cpu, mask) {
@@ -2333,6 +2445,11 @@ static __init void tracer_init_debugfs(void)
        if (!entry)
                pr_warning("Could not create debugfs 'iter_ctrl' entry\n");
 
+       entry = debugfs_create_file("tracing_cpumask", 0644, d_tracer,
+                                   NULL, &tracing_cpumask_fops);
+       if (!entry)
+               pr_warning("Could not create debugfs 'tracing_cpumask' entry\n");
+
        entry = debugfs_create_file("latency_trace", 0444, d_tracer,
                                    &global_trace, &tracing_lt_fops);
        if (!entry)
@@ -2428,8 +2545,7 @@ static int trace_alloc_page(void)
        /* Now that we successfully allocate a page per CPU, add them */
        for_each_possible_cpu(i) {
                data = global_trace.data[i];
-               spin_lock_init(&data->lock);
-               lockdep_set_class(&data->lock, &data->lock_key);
+               data->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
                page = list_entry(pages.next, struct page, lru);
                list_del_init(&page->lru);
                list_add_tail(&page->lru, &data->trace_pages);
@@ -2437,8 +2553,7 @@ static int trace_alloc_page(void)
 
 #ifdef CONFIG_TRACER_MAX_TRACE
                data = max_tr.data[i];
-               spin_lock_init(&data->lock);
-               lockdep_set_class(&data->lock, &data->lock_key);
+               data->lock = (raw_spinlock_t)__RAW_SPIN_LOCK_UNLOCKED;
                page = list_entry(pages.next, struct page, lru);
                list_del_init(&page->lru);
                list_add_tail(&page->lru, &data->trace_pages);
This page took 0.041241 seconds and 5 git commands to generate.