diff options
-rw-r--r-- | Documentation/trace/ftrace.txt | 6 | ||||
-rw-r--r-- | kernel/trace/trace.c | 3 | ||||
-rw-r--r-- | kernel/trace/trace.h | 1 | ||||
-rw-r--r-- | kernel/trace/trace_output.c | 19 |
4 files changed, 25 insertions, 4 deletions
diff --git a/Documentation/trace/ftrace.txt b/Documentation/trace/ftrace.txt index ea2d35d64d26..bd365988e8d8 100644 --- a/Documentation/trace/ftrace.txt +++ b/Documentation/trace/ftrace.txt | |||
@@ -655,7 +655,11 @@ explains which is which. | |||
655 | read the irq flags variable, an 'X' will always | 655 | read the irq flags variable, an 'X' will always |
656 | be printed here. | 656 | be printed here. |
657 | 657 | ||
658 | need-resched: 'N' task need_resched is set, '.' otherwise. | 658 | need-resched: |
659 | 'N' both TIF_NEED_RESCHED and PREEMPT_NEED_RESCHED is set, | ||
660 | 'n' only TIF_NEED_RESCHED is set, | ||
661 | 'p' only PREEMPT_NEED_RESCHED is set, | ||
662 | '.' otherwise. | ||
659 | 663 | ||
660 | hardirq/softirq: | 664 | hardirq/softirq: |
661 | 'H' - hard irq occurred inside a softirq. | 665 | 'H' - hard irq occurred inside a softirq. |
diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 7974ba20557d..d9fea7dfd5d3 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c | |||
@@ -1509,7 +1509,8 @@ tracing_generic_entry_update(struct trace_entry *entry, unsigned long flags, | |||
1509 | #endif | 1509 | #endif |
1510 | ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) | | 1510 | ((pc & HARDIRQ_MASK) ? TRACE_FLAG_HARDIRQ : 0) | |
1511 | ((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) | | 1511 | ((pc & SOFTIRQ_MASK) ? TRACE_FLAG_SOFTIRQ : 0) | |
1512 | (need_resched() ? TRACE_FLAG_NEED_RESCHED : 0); | 1512 | (tif_need_resched() ? TRACE_FLAG_NEED_RESCHED : 0) | |
1513 | (test_preempt_need_resched() ? TRACE_FLAG_PREEMPT_RESCHED : 0); | ||
1513 | } | 1514 | } |
1514 | EXPORT_SYMBOL_GPL(tracing_generic_entry_update); | 1515 | EXPORT_SYMBOL_GPL(tracing_generic_entry_update); |
1515 | 1516 | ||
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h index 10c86fb7a2b4..73d08aa25b55 100644 --- a/kernel/trace/trace.h +++ b/kernel/trace/trace.h | |||
@@ -124,6 +124,7 @@ enum trace_flag_type { | |||
124 | TRACE_FLAG_NEED_RESCHED = 0x04, | 124 | TRACE_FLAG_NEED_RESCHED = 0x04, |
125 | TRACE_FLAG_HARDIRQ = 0x08, | 125 | TRACE_FLAG_HARDIRQ = 0x08, |
126 | TRACE_FLAG_SOFTIRQ = 0x10, | 126 | TRACE_FLAG_SOFTIRQ = 0x10, |
127 | TRACE_FLAG_PREEMPT_RESCHED = 0x20, | ||
127 | }; | 128 | }; |
128 | 129 | ||
129 | #define TRACE_BUF_SIZE 1024 | 130 | #define TRACE_BUF_SIZE 1024 |
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index 34e7cbac0c9c..ed32284fbe32 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c | |||
@@ -618,8 +618,23 @@ int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry) | |||
618 | (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : | 618 | (entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' : |
619 | (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' : | 619 | (entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' : |
620 | '.'; | 620 | '.'; |
621 | need_resched = | 621 | |
622 | (entry->flags & TRACE_FLAG_NEED_RESCHED) ? 'N' : '.'; | 622 | switch (entry->flags & (TRACE_FLAG_NEED_RESCHED | |
623 | TRACE_FLAG_PREEMPT_RESCHED)) { | ||
624 | case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_PREEMPT_RESCHED: | ||
625 | need_resched = 'N'; | ||
626 | break; | ||
627 | case TRACE_FLAG_NEED_RESCHED: | ||
628 | need_resched = 'n'; | ||
629 | break; | ||
630 | case TRACE_FLAG_PREEMPT_RESCHED: | ||
631 | need_resched = 'p'; | ||
632 | break; | ||
633 | default: | ||
634 | need_resched = '.'; | ||
635 | break; | ||
636 | } | ||
637 | |||
623 | hardsoft_irq = | 638 | hardsoft_irq = |
624 | (hardirq && softirq) ? 'H' : | 639 | (hardirq && softirq) ? 'H' : |
625 | hardirq ? 'h' : | 640 | hardirq ? 'h' : |