Merge branch 'i2c/for-4.4' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
[firefly-linux-kernel-4.4.55.git] / kernel / trace / trace.h
index 74bde81601a902759e5714b04a5a987ddbde2d15..dd7620802e725e1e2f262f77ba7d8c76dda98ef9 100644 (file)
@@ -71,9 +71,6 @@ enum trace_type {
                tstruct                                                 \
        }
 
-#undef TP_ARGS
-#define TP_ARGS(args...)       args
-
 #undef FTRACE_ENTRY_DUP
 #define FTRACE_ENTRY_DUP(name, name_struct, id, tstruct, printk, filter)
 
@@ -156,9 +153,12 @@ struct trace_array_cpu {
        pid_t                   pid;
        kuid_t                  uid;
        char                    comm[TASK_COMM_LEN];
+
+       bool                    ignore_pid;
 };
 
 struct tracer;
+struct trace_option_dentry;
 
 struct trace_buffer {
        struct trace_array              *tr;
@@ -168,6 +168,19 @@ struct trace_buffer {
        int                             cpu;
 };
 
+#define TRACE_FLAGS_MAX_SIZE           32
+
+struct trace_options {
+       struct tracer                   *tracer;
+       struct trace_option_dentry      *topts;
+};
+
+struct trace_pid_list {
+       unsigned int                    nr_pids;
+       int                             order;
+       pid_t                           *pids;
+};
+
 /*
  * The trace array - an array of per-CPU trace arrays. This is the
  * highest level data structure that individual tracers deal with.
@@ -193,6 +206,7 @@ struct trace_array {
        bool                    allocated_snapshot;
        unsigned long           max_latency;
 #endif
+       struct trace_pid_list   __rcu *filtered_pids;
        /*
         * max_lock is used to protect the swapping of buffers
         * when taking a max snapshot. The buffers themselves are
@@ -216,13 +230,17 @@ struct trace_array {
 #endif
        int                     stop_count;
        int                     clock_id;
+       int                     nr_topts;
        struct tracer           *current_trace;
+       unsigned int            trace_flags;
+       unsigned char           trace_flags_index[TRACE_FLAGS_MAX_SIZE];
        unsigned int            flags;
        raw_spinlock_t          start_lock;
        struct dentry           *dir;
        struct dentry           *options;
        struct dentry           *percpu_dir;
        struct dentry           *event_dir;
+       struct trace_options    *topts;
        struct list_head        systems;
        struct list_head        events;
        cpumask_var_t           tracing_cpumask; /* only trace on set CPUs */
@@ -333,6 +351,13 @@ struct tracer_flags {
 #define TRACER_OPT(s, b)       .name = #s, .bit = b
 
 
+struct trace_option_dentry {
+       struct tracer_opt               *opt;
+       struct tracer_flags             *flags;
+       struct trace_array              *tr;
+       struct dentry                   *entry;
+};
+
 /**
  * struct tracer - a specific tracer and its callbacks to interact with tracefs
  * @name: the name chosen to select it on the available_tracers file
@@ -611,29 +636,12 @@ void update_max_tr_single(struct trace_array *tr,
 #endif /* CONFIG_TRACER_MAX_TRACE */
 
 #ifdef CONFIG_STACKTRACE
-void ftrace_trace_stack(struct ring_buffer *buffer, unsigned long flags,
-                       int skip, int pc);
-
-void ftrace_trace_stack_regs(struct ring_buffer *buffer, unsigned long flags,
-                            int skip, int pc, struct pt_regs *regs);
-
 void ftrace_trace_userstack(struct ring_buffer *buffer, unsigned long flags,
                            int pc);
 
 void __trace_stack(struct trace_array *tr, unsigned long flags, int skip,
                   int pc);
 #else
-static inline void ftrace_trace_stack(struct ring_buffer *buffer,
-                                     unsigned long flags, int skip, int pc)
-{
-}
-
-static inline void ftrace_trace_stack_regs(struct ring_buffer *buffer,
-                                          unsigned long flags, int skip,
-                                          int pc, struct pt_regs *regs)
-{
-}
-
 static inline void ftrace_trace_userstack(struct ring_buffer *buffer,
                                          unsigned long flags, int pc)
 {
@@ -707,8 +715,6 @@ int trace_array_printk_buf(struct ring_buffer *buffer,
 void trace_printk_seq(struct trace_seq *s);
 enum print_line_t print_trace_line(struct trace_iterator *iter);
 
-extern unsigned long trace_flags;
-
 extern char trace_find_mark(unsigned long long duration);
 
 /* Standard output formatting function used for function return traces */
@@ -723,9 +729,14 @@ extern char trace_find_mark(unsigned long long duration);
 #define TRACE_GRAPH_PRINT_ABS_TIME      0x20
 #define TRACE_GRAPH_PRINT_IRQS          0x40
 #define TRACE_GRAPH_PRINT_TAIL          0x80
+#define TRACE_GRAPH_SLEEP_TIME         0x100
+#define TRACE_GRAPH_GRAPH_TIME         0x200
 #define TRACE_GRAPH_PRINT_FILL_SHIFT   28
 #define TRACE_GRAPH_PRINT_FILL_MASK    (0x3 << TRACE_GRAPH_PRINT_FILL_SHIFT)
 
+extern void ftrace_graph_sleep_time_control(bool enable);
+extern void ftrace_graph_graph_time_control(bool enable);
+
 extern enum print_line_t
 print_graph_function_flags(struct trace_iterator *iter, u32 flags);
 extern void print_graph_headers_flags(struct seq_file *s, u32 flags);
@@ -859,7 +870,7 @@ void ftrace_destroy_filter_files(struct ftrace_ops *ops);
 #define ftrace_destroy_filter_files(ops) do { } while (0)
 #endif /* CONFIG_FUNCTION_TRACER && CONFIG_DYNAMIC_FTRACE */
 
-int ftrace_event_is_function(struct trace_event_call *call);
+bool ftrace_event_is_function(struct trace_event_call *call);
 
 /*
  * struct trace_parser - servers for reading the user input separated by spaces
@@ -896,42 +907,94 @@ extern void trace_parser_put(struct trace_parser *parser);
 extern int trace_get_user(struct trace_parser *parser, const char __user *ubuf,
        size_t cnt, loff_t *ppos);
 
+/*
+ * Only create function graph options if function graph is configured.
+ */
+#ifdef CONFIG_FUNCTION_GRAPH_TRACER
+# define FGRAPH_FLAGS                                          \
+               C(DISPLAY_GRAPH,        "display-graph"),
+#else
+# define FGRAPH_FLAGS
+#endif
+
+#ifdef CONFIG_BRANCH_TRACER
+# define BRANCH_FLAGS                                  \
+               C(BRANCH,               "branch"),
+#else
+# define BRANCH_FLAGS
+#endif
+
+#ifdef CONFIG_FUNCTION_TRACER
+# define FUNCTION_FLAGS                                                \
+               C(FUNCTION,             "function-trace"),
+# define FUNCTION_DEFAULT_FLAGS                TRACE_ITER_FUNCTION
+#else
+# define FUNCTION_FLAGS
+# define FUNCTION_DEFAULT_FLAGS                0UL
+#endif
+
+#ifdef CONFIG_STACKTRACE
+# define STACK_FLAGS                           \
+               C(STACKTRACE,           "stacktrace"),
+#else
+# define STACK_FLAGS
+#endif
+
 /*
  * trace_iterator_flags is an enumeration that defines bit
  * positions into trace_flags that controls the output.
  *
  * NOTE: These bits must match the trace_options array in
- *       trace.c.
+ *       trace.c (this macro guarantees it).
+ */
+#define TRACE_FLAGS                                            \
+               C(PRINT_PARENT,         "print-parent"),        \
+               C(SYM_OFFSET,           "sym-offset"),          \
+               C(SYM_ADDR,             "sym-addr"),            \
+               C(VERBOSE,              "verbose"),             \
+               C(RAW,                  "raw"),                 \
+               C(HEX,                  "hex"),                 \
+               C(BIN,                  "bin"),                 \
+               C(BLOCK,                "block"),               \
+               C(PRINTK,               "trace_printk"),        \
+               C(ANNOTATE,             "annotate"),            \
+               C(USERSTACKTRACE,       "userstacktrace"),      \
+               C(SYM_USEROBJ,          "sym-userobj"),         \
+               C(PRINTK_MSGONLY,       "printk-msg-only"),     \
+               C(CONTEXT_INFO,         "context-info"),   /* Print pid/cpu/time */ \
+               C(LATENCY_FMT,          "latency-format"),      \
+               C(RECORD_CMD,           "record-cmd"),          \
+               C(OVERWRITE,            "overwrite"),           \
+               C(STOP_ON_FREE,         "disable_on_free"),     \
+               C(IRQ_INFO,             "irq-info"),            \
+               C(MARKERS,              "markers"),             \
+               FUNCTION_FLAGS                                  \
+               FGRAPH_FLAGS                                    \
+               STACK_FLAGS                                     \
+               BRANCH_FLAGS
+
+/*
+ * By defining C, we can make TRACE_FLAGS a list of bit names
+ * that will define the bits for the flag masks.
  */
-enum trace_iterator_flags {
-       TRACE_ITER_PRINT_PARENT         = 0x01,
-       TRACE_ITER_SYM_OFFSET           = 0x02,
-       TRACE_ITER_SYM_ADDR             = 0x04,
-       TRACE_ITER_VERBOSE              = 0x08,
-       TRACE_ITER_RAW                  = 0x10,
-       TRACE_ITER_HEX                  = 0x20,
-       TRACE_ITER_BIN                  = 0x40,
-       TRACE_ITER_BLOCK                = 0x80,
-       TRACE_ITER_STACKTRACE           = 0x100,
-       TRACE_ITER_PRINTK               = 0x200,
-       TRACE_ITER_PREEMPTONLY          = 0x400,
-       TRACE_ITER_BRANCH               = 0x800,
-       TRACE_ITER_ANNOTATE             = 0x1000,
-       TRACE_ITER_USERSTACKTRACE       = 0x2000,
-       TRACE_ITER_SYM_USEROBJ          = 0x4000,
-       TRACE_ITER_PRINTK_MSGONLY       = 0x8000,
-       TRACE_ITER_CONTEXT_INFO         = 0x10000, /* Print pid/cpu/time */
-       TRACE_ITER_LATENCY_FMT          = 0x20000,
-       TRACE_ITER_SLEEP_TIME           = 0x40000,
-       TRACE_ITER_GRAPH_TIME           = 0x80000,
-       TRACE_ITER_RECORD_CMD           = 0x100000,
-       TRACE_ITER_OVERWRITE            = 0x200000,
-       TRACE_ITER_STOP_ON_FREE         = 0x400000,
-       TRACE_ITER_IRQ_INFO             = 0x800000,
-       TRACE_ITER_MARKERS              = 0x1000000,
-       TRACE_ITER_FUNCTION             = 0x2000000,
+#undef C
+#define C(a, b) TRACE_ITER_##a##_BIT
+
+enum trace_iterator_bits {
+       TRACE_FLAGS
+       /* Make sure we don't go more than we have bits for */
+       TRACE_ITER_LAST_BIT
 };
 
+/*
+ * By redefining C, we can make TRACE_FLAGS a list of masks that
+ * use the bits as defined above.
+ */
+#undef C
+#define C(a, b) TRACE_ITER_##a = (1 << TRACE_ITER_##a##_BIT)
+
+enum trace_iterator_flags { TRACE_FLAGS };
+
 /*
  * TRACE_ITER_SYM_MASK masks the options in trace_flags that
  * control the output of kernel symbols.
@@ -946,7 +1009,7 @@ extern int enable_branch_tracing(struct trace_array *tr);
 extern void disable_branch_tracing(void);
 static inline int trace_branch_enable(struct trace_array *tr)
 {
-       if (trace_flags & TRACE_ITER_BRANCH)
+       if (tr->trace_flags & TRACE_ITER_BRANCH)
                return enable_branch_tracing(tr);
        return 0;
 }
@@ -1269,6 +1332,7 @@ extern const char *__stop___trace_bprintk_fmt[];
 extern const char *__start___tracepoint_str[];
 extern const char *__stop___tracepoint_str[];
 
+void trace_printk_control(bool enabled);
 void trace_printk_init_buffers(void);
 void trace_printk_start_comm(void);
 int trace_keep_overwrite(struct tracer *tracer, u32 mask, int set);