|
@@ -278,6 +278,29 @@ struct tracer {
|
|
|
};
|
|
|
|
|
|
|
|
|
+/* Only current can touch trace_recursion */
|
|
|
+#define trace_recursion_inc() do { (current)->trace_recursion++; } while (0)
|
|
|
+#define trace_recursion_dec() do { (current)->trace_recursion--; } while (0)
|
|
|
+
|
|
|
+/* Ring buffer has the 10 LSB bits to count */
|
|
|
+#define trace_recursion_buffer() ((current)->trace_recursion & 0x3ff)
|
|
|
+
|
|
|
+/* for function tracing recursion */
|
|
|
+#define TRACE_INTERNAL_BIT (1<<11)
|
|
|
+#define TRACE_GLOBAL_BIT (1<<12)
|
|
|
+/*
|
|
|
+ * Abuse of the trace_recursion.
|
|
|
+ * As we need a way to maintain state if we are tracing the function
|
|
|
+ * graph in irq because we want to trace a particular function that
|
|
|
+ * was called in irq context but we have irq tracing off. Since this
|
|
|
+ * can only be modified by current, we can reuse trace_recursion.
|
|
|
+ */
|
|
|
+#define TRACE_IRQ_BIT (1<<13)
|
|
|
+
|
|
|
+#define trace_recursion_set(bit) do { (current)->trace_recursion |= (bit); } while (0)
|
|
|
+#define trace_recursion_clear(bit) do { (current)->trace_recursion &= ~(bit); } while (0)
|
|
|
+#define trace_recursion_test(bit) ((current)->trace_recursion & (bit))
|
|
|
+
|
|
|
#define TRACE_PIPE_ALL_CPU -1
|
|
|
|
|
|
int tracer_init(struct tracer *t, struct trace_array *tr);
|
|
@@ -516,8 +539,18 @@ static inline int ftrace_graph_addr(unsigned long addr)
|
|
|
return 1;
|
|
|
|
|
|
for (i = 0; i < ftrace_graph_count; i++) {
|
|
|
- if (addr == ftrace_graph_funcs[i])
|
|
|
+ if (addr == ftrace_graph_funcs[i]) {
|
|
|
+ /*
|
|
|
+ * If no irqs are to be traced, but a set_graph_function
|
|
|
+ * is set, and called by an interrupt handler, we still
|
|
|
+ * want to trace it.
|
|
|
+ */
|
|
|
+ if (in_irq())
|
|
|
+ trace_recursion_set(TRACE_IRQ_BIT);
|
|
|
+ else
|
|
|
+ trace_recursion_clear(TRACE_IRQ_BIT);
|
|
|
return 1;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -794,19 +827,4 @@ extern const char *__stop___trace_bprintk_fmt[];
|
|
|
FTRACE_ENTRY(call, struct_name, id, PARAMS(tstruct), PARAMS(print))
|
|
|
#include "trace_entries.h"
|
|
|
|
|
|
-/* Only current can touch trace_recursion */
|
|
|
-#define trace_recursion_inc() do { (current)->trace_recursion++; } while (0)
|
|
|
-#define trace_recursion_dec() do { (current)->trace_recursion--; } while (0)
|
|
|
-
|
|
|
-/* Ring buffer has the 10 LSB bits to count */
|
|
|
-#define trace_recursion_buffer() ((current)->trace_recursion & 0x3ff)
|
|
|
-
|
|
|
-/* for function tracing recursion */
|
|
|
-#define TRACE_INTERNAL_BIT (1<<11)
|
|
|
-#define TRACE_GLOBAL_BIT (1<<12)
|
|
|
-
|
|
|
-#define trace_recursion_set(bit) do { (current)->trace_recursion |= (bit); } while (0)
|
|
|
-#define trace_recursion_clear(bit) do { (current)->trace_recursion &= ~(bit); } while (0)
|
|
|
-#define trace_recursion_test(bit) ((current)->trace_recursion & (bit))
|
|
|
-
|
|
|
#endif /* _LINUX_KERNEL_TRACE_H */
|