Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
[linux-2.6-microblaze.git] / kernel / trace / trace.c
index 848f67a..f40d850 100644 (file)
@@ -1543,8 +1543,7 @@ static void latency_fsnotify_workfn(struct work_struct *work)
 {
        struct trace_array *tr = container_of(work, struct trace_array,
                                              fsnotify_work);
-       fsnotify(tr->d_max_latency->d_inode, FS_MODIFY,
-                tr->d_max_latency->d_inode, FSNOTIFY_EVENT_INODE, NULL, 0);
+       fsnotify_inode(tr->d_max_latency->d_inode, FS_MODIFY);
 }
 
 static void latency_fsnotify_workfn_irq(struct irq_work *iwork)
@@ -2003,7 +2002,6 @@ static void tracing_reset_cpu(struct array_buffer *buf, int cpu)
 void tracing_reset_online_cpus(struct array_buffer *buf)
 {
        struct trace_buffer *buffer = buf->buffer;
-       int cpu;
 
        if (!buffer)
                return;
@@ -2015,8 +2013,7 @@ void tracing_reset_online_cpus(struct array_buffer *buf)
 
        buf->time_start = buffer_ftrace_now(buf, buf->cpu);
 
-       for_each_online_cpu(cpu)
-               ring_buffer_reset_cpu(buffer, cpu);
+       ring_buffer_reset_online_cpus(buffer);
 
        ring_buffer_record_enable(buffer);
 }
@@ -2932,12 +2929,6 @@ static void __ftrace_trace_stack(struct trace_buffer *buffer,
                skip++;
 #endif
 
-       /*
-        * Since events can happen in NMIs there's no safe way to
-        * use the per cpu ftrace_stacks. We reserve it and if an interrupt
-        * or NMI comes in, it will just have to use the default
-        * FTRACE_STACK_SIZE.
-        */
        preempt_disable_notrace();
 
        stackidx = __this_cpu_inc_return(ftrace_stack_reserve) - 1;
@@ -3137,6 +3128,9 @@ static int alloc_percpu_trace_buffer(void)
 {
        struct trace_buffer_struct *buffers;
 
+       if (trace_percpu_buffer)
+               return 0;
+
        buffers = alloc_percpu(struct trace_buffer_struct);
        if (MEM_FAIL(!buffers, "Could not allocate percpu trace_printk buffer"))
                return -ENOMEM;
@@ -3339,6 +3333,26 @@ int trace_array_vprintk(struct trace_array *tr,
        return __trace_array_vprintk(tr->array_buffer.buffer, ip, fmt, args);
 }
 
+/**
+ * trace_array_printk - Print a message to a specific instance
+ * @tr: The instance trace_array descriptor
+ * @ip: The instruction pointer that this is called from.
+ * @fmt: The format to print (printf format)
+ *
+ * If a subsystem sets up its own instance, they have the right to
+ * printk strings into their tracing instance buffer using this
+ * function. Note, this function will not write into the top level
+ * buffer (use trace_printk() for that), as writing into the top level
+ * buffer should only have events that can be individually disabled.
+ * trace_printk() is only used for debugging a kernel, and should not
+ * be ever encorporated in normal use.
+ *
+ * trace_array_printk() can be used, as it will not add noise to the
+ * top level tracing buffer.
+ *
+ * Note, trace_array_init_printk() must be called on @tr before this
+ * can be used.
+ */
 __printf(3, 0)
 int trace_array_printk(struct trace_array *tr,
                       unsigned long ip, const char *fmt, ...)
@@ -3346,12 +3360,16 @@ int trace_array_printk(struct trace_array *tr,
        int ret;
        va_list ap;
 
-       if (!(global_trace.trace_flags & TRACE_ITER_PRINTK))
-               return 0;
-
        if (!tr)
                return -ENOENT;
 
+       /* This is only allowed for created instances */
+       if (tr == &global_trace)
+               return 0;
+
+       if (!(tr->trace_flags & TRACE_ITER_PRINTK))
+               return 0;
+
        va_start(ap, fmt);
        ret = trace_array_vprintk(tr, ip, fmt, ap);
        va_end(ap);
@@ -3359,6 +3377,27 @@ int trace_array_printk(struct trace_array *tr,
 }
 EXPORT_SYMBOL_GPL(trace_array_printk);
 
+/**
+ * trace_array_init_printk - Initialize buffers for trace_array_printk()
+ * @tr: The trace array to initialize the buffers for
+ *
+ * As trace_array_printk() only writes into instances, they are OK to
+ * have in the kernel (unlike trace_printk()). This needs to be called
+ * before trace_array_printk() can be used on a trace_array.
+ */
+int trace_array_init_printk(struct trace_array *tr)
+{
+       if (!tr)
+               return -ENOENT;
+
+       /* This is only allowed for created instances */
+       if (tr == &global_trace)
+               return -EINVAL;
+
+       return alloc_percpu_trace_buffer();
+}
+EXPORT_SYMBOL_GPL(trace_array_init_printk);
+
 __printf(3, 4)
 int trace_array_printk_buf(struct trace_buffer *buffer,
                           unsigned long ip, const char *fmt, ...)
@@ -5887,7 +5926,7 @@ int tracing_set_tracer(struct trace_array *tr, const char *buf)
        }
 
        /* If trace pipe files are being read, we can't change the tracer */
-       if (tr->current_trace->ref) {
+       if (tr->trace_ref) {
                ret = -EBUSY;
                goto out;
        }
@@ -6103,7 +6142,7 @@ static int tracing_open_pipe(struct inode *inode, struct file *filp)
 
        nonseekable_open(inode, filp);
 
-       tr->current_trace->ref++;
+       tr->trace_ref++;
 out:
        mutex_unlock(&trace_types_lock);
        return ret;
@@ -6122,7 +6161,7 @@ static int tracing_release_pipe(struct inode *inode, struct file *file)
 
        mutex_lock(&trace_types_lock);
 
-       tr->current_trace->ref--;
+       tr->trace_ref--;
 
        if (iter->trace->pipe_close)
                iter->trace->pipe_close(iter);
@@ -7406,7 +7445,7 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)
        if (ret)
                return ret;
 
-       info = kzalloc(sizeof(*info), GFP_KERNEL);
+       info = kvzalloc(sizeof(*info), GFP_KERNEL);
        if (!info) {
                trace_array_put(tr);
                return -ENOMEM;
@@ -7424,7 +7463,7 @@ static int tracing_buffers_open(struct inode *inode, struct file *filp)
 
        filp->private_data = info;
 
-       tr->current_trace->ref++;
+       tr->trace_ref++;
 
        mutex_unlock(&trace_types_lock);
 
@@ -7525,14 +7564,14 @@ static int tracing_buffers_release(struct inode *inode, struct file *file)
 
        mutex_lock(&trace_types_lock);
 
-       iter->tr->current_trace->ref--;
+       iter->tr->trace_ref--;
 
        __trace_array_put(iter->tr);
 
        if (info->spare)
                ring_buffer_free_read_page(iter->array_buffer->buffer,
                                           info->spare_cpu, info->spare);
-       kfree(info);
+       kvfree(info);
 
        mutex_unlock(&trace_types_lock);
 
@@ -8733,7 +8772,7 @@ static int __remove_instance(struct trace_array *tr)
        int i;
 
        /* Reference counter for a newly created trace array = 1. */
-       if (tr->ref > 1 || (tr->current_trace && tr->current_trace->ref))
+       if (tr->ref > 1 || (tr->current_trace && tr->trace_ref))
                return -EBUSY;
 
        list_del(&tr->list);