mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-07-24 03:15:36 +00:00
174 lines
4.8 KiB
Diff
174 lines
4.8 KiB
Diff
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Date: Mon, 25 Jan 2021 20:45:09 +0100
|
|
Subject: [PATCH 2/4] tracing: Inline tracing_gen_ctx_flags()
|
|
|
|
Inline tracing_gen_ctx_flags(). This allows to have one ifdef
|
|
CONFIG_TRACE_IRQFLAGS_SUPPORT.
|
|
|
|
This requires to move `trace_flag_type' so tracing_gen_ctx_flags() can
|
|
use it.
|
|
|
|
Link: https://lkml.kernel.org/r/20210125194511.3924915-3-bigeasy@linutronix.de
|
|
|
|
Suggested-by: Steven Rostedt <rostedt@goodmis.org>
|
|
Link: https://lkml.kernel.org/r/20210125140323.6b1ff20c@gandalf.local.home
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
---
|
|
include/linux/trace_events.h | 54 ++++++++++++++++++++++++++++++++++++++++---
|
|
kernel/trace/trace.c | 38 +-----------------------------
|
|
kernel/trace/trace.h | 19 ---------------
|
|
3 files changed, 53 insertions(+), 58 deletions(-)
|
|
|
|
--- a/include/linux/trace_events.h
|
|
+++ b/include/linux/trace_events.h
|
|
@@ -160,9 +160,57 @@ static inline void tracing_generic_entry
|
|
entry->flags = trace_ctx >> 16;
|
|
}
|
|
|
|
-unsigned int tracing_gen_ctx_flags(unsigned long irqflags);
|
|
-unsigned int tracing_gen_ctx(void);
|
|
-unsigned int tracing_gen_ctx_dec(void);
|
|
+unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status);
|
|
+
|
|
+enum trace_flag_type {
|
|
+ TRACE_FLAG_IRQS_OFF = 0x01,
|
|
+ TRACE_FLAG_IRQS_NOSUPPORT = 0x02,
|
|
+ TRACE_FLAG_NEED_RESCHED = 0x04,
|
|
+ TRACE_FLAG_HARDIRQ = 0x08,
|
|
+ TRACE_FLAG_SOFTIRQ = 0x10,
|
|
+ TRACE_FLAG_PREEMPT_RESCHED = 0x20,
|
|
+ TRACE_FLAG_NMI = 0x40,
|
|
+};
|
|
+
|
|
+#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
|
|
+static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags)
|
|
+{
|
|
+ unsigned int irq_status = irqs_disabled_flags(irqflags) ?
|
|
+ TRACE_FLAG_IRQS_OFF : 0;
|
|
+ return tracing_gen_ctx_irq_test(irq_status);
|
|
+}
|
|
+static inline unsigned int tracing_gen_ctx(void)
|
|
+{
|
|
+ unsigned long irqflags;
|
|
+
|
|
+ local_save_flags(irqflags);
|
|
+ return tracing_gen_ctx_flags(irqflags);
|
|
+}
|
|
+#else
|
|
+
|
|
+static inline unsigned int tracing_gen_ctx_flags(unsigned long irqflags)
|
|
+{
|
|
+ return tracing_gen_ctx_irq_test(TRACE_FLAG_IRQS_NOSUPPORT);
|
|
+}
|
|
+static inline unsigned int tracing_gen_ctx(void)
|
|
+{
|
|
+ return tracing_gen_ctx_irq_test(TRACE_FLAG_IRQS_NOSUPPORT);
|
|
+}
|
|
+#endif
|
|
+
|
|
+static inline unsigned int tracing_gen_ctx_dec(void)
|
|
+{
|
|
+ unsigned int trace_ctx;
|
|
+
|
|
+ trace_ctx = tracing_gen_ctx();
|
|
+ /*
|
|
+ * Subtract one from the preeption counter if preemption is enabled,
|
|
+ * see trace_event_buffer_reserve()for details.
|
|
+ */
|
|
+ if (IS_ENABLED(CONFIG_PREEMPTION))
|
|
+ trace_ctx--;
|
|
+ return trace_ctx;
|
|
+}
|
|
|
|
struct trace_event_file;
|
|
|
|
--- a/kernel/trace/trace.c
|
|
+++ b/kernel/trace/trace.c
|
|
@@ -2578,20 +2578,13 @@ enum print_line_t trace_handle_return(st
|
|
}
|
|
EXPORT_SYMBOL_GPL(trace_handle_return);
|
|
|
|
-unsigned int tracing_gen_ctx_flags(unsigned long irqflags)
|
|
+unsigned int tracing_gen_ctx_irq_test(unsigned int irqs_status)
|
|
{
|
|
- unsigned int trace_flags = 0;
|
|
+ unsigned int trace_flags = irqs_status;
|
|
unsigned int pc;
|
|
|
|
pc = preempt_count();
|
|
|
|
-#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
|
|
- if (irqs_disabled_flags(irqflags))
|
|
- trace_flags |= TRACE_FLAG_IRQS_OFF;
|
|
-#else
|
|
- trace_flags |= TRACE_FLAG_IRQS_NOSUPPORT;
|
|
-#endif
|
|
-
|
|
if (pc & NMI_MASK)
|
|
trace_flags |= TRACE_FLAG_NMI;
|
|
if (pc & HARDIRQ_MASK)
|
|
@@ -2607,33 +2600,6 @@ unsigned int tracing_gen_ctx_flags(unsig
|
|
return (trace_flags << 16) | (pc & 0xff);
|
|
}
|
|
|
|
-unsigned int tracing_gen_ctx(void)
|
|
-{
|
|
- unsigned long irqflags;
|
|
-
|
|
-#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
|
|
- local_save_flags(irqflags);
|
|
-#else
|
|
- irqflags = 0;
|
|
-#endif
|
|
- return tracing_gen_ctx_flags(irqflags);
|
|
-}
|
|
-
|
|
-unsigned int tracing_gen_ctx_dec(void)
|
|
-{
|
|
- unsigned int trace_ctx;
|
|
-
|
|
- trace_ctx = tracing_gen_ctx();
|
|
-
|
|
- /*
|
|
- * Subtract one from the preeption counter if preemption is enabled,
|
|
- * see trace_event_buffer_reserve()for details.
|
|
- */
|
|
- if (IS_ENABLED(CONFIG_PREEMPTION))
|
|
- trace_ctx--;
|
|
- return trace_ctx;
|
|
-}
|
|
-
|
|
struct ring_buffer_event *
|
|
trace_buffer_lock_reserve(struct trace_buffer *buffer,
|
|
int type,
|
|
--- a/kernel/trace/trace.h
|
|
+++ b/kernel/trace/trace.h
|
|
@@ -136,25 +136,6 @@ struct kretprobe_trace_entry_head {
|
|
unsigned long ret_ip;
|
|
};
|
|
|
|
-/*
|
|
- * trace_flag_type is an enumeration that holds different
|
|
- * states when a trace occurs. These are:
|
|
- * IRQS_OFF - interrupts were disabled
|
|
- * IRQS_NOSUPPORT - arch does not support irqs_disabled_flags
|
|
- * NEED_RESCHED - reschedule is requested
|
|
- * HARDIRQ - inside an interrupt handler
|
|
- * SOFTIRQ - inside a softirq handler
|
|
- */
|
|
-enum trace_flag_type {
|
|
- TRACE_FLAG_IRQS_OFF = 0x01,
|
|
- TRACE_FLAG_IRQS_NOSUPPORT = 0x02,
|
|
- TRACE_FLAG_NEED_RESCHED = 0x04,
|
|
- TRACE_FLAG_HARDIRQ = 0x08,
|
|
- TRACE_FLAG_SOFTIRQ = 0x10,
|
|
- TRACE_FLAG_PREEMPT_RESCHED = 0x20,
|
|
- TRACE_FLAG_NMI = 0x40,
|
|
-};
|
|
-
|
|
#define TRACE_BUF_SIZE 1024
|
|
|
|
struct trace_array;
|