ftrace: handle archs that do not support irqs_disabled_flags
Impact: build fix on non-lockdep architectures Some architectures do not support a way to read the irq flags that is set from "local_irq_save(flags)" to determine if interrupts were disabled or enabled. Ftrace uses this information to display to the user if the trace occurred with interrupts enabled or disabled. Besides the fact that those archs that do not support this will fail to compile, unless they fix it, we do not want to have the trace simply say interrupts were not disabled or they were enabled, without knowing the real answer. This patch adds a 'X' in the output to let the user know that the architecture they are running on does not support a way for the tracer to determine if interrupts were enabled or disabled. It also lets those same archs compile with tracing enabled. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
f3384b28a0
Коммит
9244489a7b
|
@ -291,6 +291,9 @@ explains which is which.
|
||||||
CPU#: The CPU which the process was running on.
|
CPU#: The CPU which the process was running on.
|
||||||
|
|
||||||
irqs-off: 'd' interrupts are disabled. '.' otherwise.
|
irqs-off: 'd' interrupts are disabled. '.' otherwise.
|
||||||
|
Note: If the architecture does not support a way to
|
||||||
|
read the irq flags variable, an 'X' will always
|
||||||
|
be printed here.
|
||||||
|
|
||||||
need-resched: 'N' task need_resched is set, '.' otherwise.
|
need-resched: 'N' task need_resched is set, '.' otherwise.
|
||||||
|
|
||||||
|
|
|
@ -656,7 +656,11 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags,
|
||||||
entry->preempt_count = pc & 0xff;
|
entry->preempt_count = pc & 0xff;
|
||||||
entry->pid = (tsk) ? tsk->pid : 0;
|
entry->pid = (tsk) ? tsk->pid : 0;
|
||||||
entry->flags =
|
entry->flags =
|
||||||
|
#ifdef CONFIG_TRACE_IRQFLAGS_SUPPORT
|
||||||
(irqs_disabled_flags(flags) ? TRACE_FLAG_IRQS_OFF : 0) |
|
(irqs_disabled_flags(flags) ? TRACE_FLAG_IRQS_OFF : 0) |
|
||||||
|
#else
|
||||||
|
TRACE_FLAG_IRQS_NOSUPPORT |
|
||||||
|
#endif
|
||||||
((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |
|
((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) |
|
||||||
((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) |
|
((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) |
|
||||||
(need_resched() ? TRACE_FLAG_NEED_RESCHED : 0);
|
(need_resched() ? TRACE_FLAG_NEED_RESCHED : 0);
|
||||||
|
@ -1244,7 +1248,8 @@ lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)
|
||||||
trace_seq_printf(s, "%8.8s-%-5d ", comm, entry->pid);
|
trace_seq_printf(s, "%8.8s-%-5d ", comm, entry->pid);
|
||||||
trace_seq_printf(s, "%3d", cpu);
|
trace_seq_printf(s, "%3d", cpu);
|
||||||
trace_seq_printf(s, "%c%c",
|
trace_seq_printf(s, "%c%c",
|
||||||
(entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : '.',
|
(entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
|
||||||
|
(entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' : '.',
|
||||||
((entry->flags & TRACE_FLAG_NEED_RESCHED) ? 'N' : '.'));
|
((entry->flags & TRACE_FLAG_NEED_RESCHED) ? 'N' : '.'));
|
||||||
|
|
||||||
hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
|
hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
|
||||||
|
|
|
@ -120,18 +120,20 @@ struct trace_boot {
|
||||||
/*
|
/*
|
||||||
* trace_flag_type is an enumeration that holds different
|
* trace_flag_type is an enumeration that holds different
|
||||||
* states when a trace occurs. These are:
|
* states when a trace occurs. These are:
|
||||||
* IRQS_OFF - interrupts were disabled
|
* IRQS_OFF - interrupts were disabled
|
||||||
* NEED_RESCED - reschedule is requested
|
* IRQS_NOSUPPORT - arch does not support irqs_disabled_flags
|
||||||
* HARDIRQ - inside an interrupt handler
|
* NEED_RESCED - reschedule is requested
|
||||||
* SOFTIRQ - inside a softirq handler
|
* HARDIRQ - inside an interrupt handler
|
||||||
* CONT - multiple entries hold the trace item
|
* SOFTIRQ - inside a softirq handler
|
||||||
|
* CONT - multiple entries hold the trace item
|
||||||
*/
|
*/
|
||||||
enum trace_flag_type {
|
enum trace_flag_type {
|
||||||
TRACE_FLAG_IRQS_OFF = 0x01,
|
TRACE_FLAG_IRQS_OFF = 0x01,
|
||||||
TRACE_FLAG_NEED_RESCHED = 0x02,
|
TRACE_FLAG_IRQS_NOSUPPORT = 0x02,
|
||||||
TRACE_FLAG_HARDIRQ = 0x04,
|
TRACE_FLAG_NEED_RESCHED = 0x04,
|
||||||
TRACE_FLAG_SOFTIRQ = 0x08,
|
TRACE_FLAG_HARDIRQ = 0x08,
|
||||||
TRACE_FLAG_CONT = 0x10,
|
TRACE_FLAG_SOFTIRQ = 0x10,
|
||||||
|
TRACE_FLAG_CONT = 0x20,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TRACE_BUF_SIZE 1024
|
#define TRACE_BUF_SIZE 1024
|
||||||
|
|
Загрузка…
Ссылка в новой задаче