trace: increase caller depth for preempt/irqs disable events
preempt/irq disable events tracks and prints 4 callers (3 actual callers and current trace event caller), who disables irqs and preemption for longer duration. It may not be sufficient for all scenarios, so extend these events to track 5 callers and exclude current trace event caller. Change-Id: I464dd738a78d3a89fea62fcf4aaee9897bb03c37 Signed-off-by: Lingutla Chandrasekhar <clingutla@codeaurora.org>
This commit is contained in:
parent
94905802ae
commit
f92056088e
2 changed files with 33 additions and 23 deletions
|
@ -65,9 +65,10 @@ DEFINE_EVENT(preemptirq_template, preempt_enable,
|
|||
TRACE_EVENT(irqs_disable,
|
||||
|
||||
TP_PROTO(u64 delta, unsigned long caddr0, unsigned long caddr1,
|
||||
unsigned long caddr2, unsigned long caddr3),
|
||||
unsigned long caddr2, unsigned long caddr3,
|
||||
unsigned long caddr4),
|
||||
|
||||
TP_ARGS(delta, caddr0, caddr1, caddr2, caddr3),
|
||||
TP_ARGS(delta, caddr0, caddr1, caddr2, caddr3, caddr4),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u64, delta)
|
||||
|
@ -75,6 +76,7 @@ TRACE_EVENT(irqs_disable,
|
|||
__field(void*, caddr1)
|
||||
__field(void*, caddr2)
|
||||
__field(void*, caddr3)
|
||||
__field(void*, caddr4)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
|
@ -83,20 +85,22 @@ TRACE_EVENT(irqs_disable,
|
|||
__entry->caddr1 = (void *)caddr1;
|
||||
__entry->caddr2 = (void *)caddr2;
|
||||
__entry->caddr3 = (void *)caddr3;
|
||||
__entry->caddr4 = (void *)caddr4;
|
||||
),
|
||||
|
||||
TP_printk("delta=%llu(ns) Callers:(%ps<-%ps<-%ps<-%ps)", __entry->delta,
|
||||
__entry->caddr0, __entry->caddr1,
|
||||
__entry->caddr2, __entry->caddr3)
|
||||
TP_printk("delta=%llu(ns) Callers:(%ps<-%ps<-%ps<-%ps<-%ps)",
|
||||
__entry->delta, __entry->caddr0,
|
||||
__entry->caddr1, __entry->caddr2,
|
||||
__entry->caddr3, __entry->caddr4)
|
||||
);
|
||||
|
||||
TRACE_EVENT(sched_preempt_disable,
|
||||
|
||||
TP_PROTO(u64 delta, bool irqs_disabled,
|
||||
unsigned long caddr0, unsigned long caddr1,
|
||||
unsigned long caddr2, unsigned long caddr3),
|
||||
TP_PROTO(u64 delta, bool irqs_disabled, unsigned long caddr0,
|
||||
unsigned long caddr1, unsigned long caddr2,
|
||||
unsigned long caddr3, unsigned long caddr4),
|
||||
|
||||
TP_ARGS(delta, irqs_disabled, caddr0, caddr1, caddr2, caddr3),
|
||||
TP_ARGS(delta, irqs_disabled, caddr0, caddr1, caddr2, caddr3, caddr4),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u64, delta)
|
||||
|
@ -105,6 +109,7 @@ TRACE_EVENT(sched_preempt_disable,
|
|||
__field(void*, caddr1)
|
||||
__field(void*, caddr2)
|
||||
__field(void*, caddr3)
|
||||
__field(void*, caddr4)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
|
@ -114,12 +119,14 @@ TRACE_EVENT(sched_preempt_disable,
|
|||
__entry->caddr1 = (void *)caddr1;
|
||||
__entry->caddr2 = (void *)caddr2;
|
||||
__entry->caddr3 = (void *)caddr3;
|
||||
__entry->caddr4 = (void *)caddr4;
|
||||
),
|
||||
|
||||
TP_printk("delta=%llu(ns) irqs_d=%d Callers:(%ps<-%ps<-%ps<-%ps)",
|
||||
TP_printk("delta=%llu(ns) irqs_d=%d Callers:(%ps<-%ps<-%ps<-%ps<-%ps)",
|
||||
__entry->delta, __entry->irqs_disabled,
|
||||
__entry->caddr0, __entry->caddr1,
|
||||
__entry->caddr2, __entry->caddr3)
|
||||
__entry->caddr2, __entry->caddr3,
|
||||
__entry->caddr4)
|
||||
);
|
||||
|
||||
#endif /* _TRACE_PREEMPTIRQ_H */
|
||||
|
|
|
@ -617,7 +617,7 @@ unsigned int sysctl_irqsoff_tracing_threshold_ns = 1000000UL;
|
|||
|
||||
struct irqsoff_store {
|
||||
u64 ts;
|
||||
unsigned long caddr[4];
|
||||
unsigned long caddr[5];
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct irqsoff_store, the_irqsoff);
|
||||
|
@ -640,7 +640,8 @@ void tracer_hardirqs_on(unsigned long a0, unsigned long a1)
|
|||
if (!is_idle_task(current) &&
|
||||
delta > sysctl_irqsoff_tracing_threshold_ns)
|
||||
trace_irqs_disable(delta, is->caddr[0], is->caddr[1],
|
||||
is->caddr[2], is->caddr[3]);
|
||||
is->caddr[2], is->caddr[3],
|
||||
is->caddr[4]);
|
||||
is->ts = 0;
|
||||
lockdep_on();
|
||||
#endif /* CONFIG_PREEMPTIRQ_EVENTS */
|
||||
|
@ -658,10 +659,11 @@ void tracer_hardirqs_off(unsigned long a0, unsigned long a1)
|
|||
lockdep_off();
|
||||
is = &per_cpu(the_irqsoff, raw_smp_processor_id());
|
||||
is->ts = sched_clock();
|
||||
is->caddr[0] = CALLER_ADDR0;
|
||||
is->caddr[1] = CALLER_ADDR1;
|
||||
is->caddr[2] = CALLER_ADDR2;
|
||||
is->caddr[3] = CALLER_ADDR3;
|
||||
is->caddr[0] = CALLER_ADDR1;
|
||||
is->caddr[1] = CALLER_ADDR2;
|
||||
is->caddr[2] = CALLER_ADDR3;
|
||||
is->caddr[3] = CALLER_ADDR4;
|
||||
is->caddr[4] = CALLER_ADDR5;
|
||||
lockdep_on();
|
||||
#endif /* CONFIG_PREEMPTIRQ_EVENTS */
|
||||
|
||||
|
@ -712,7 +714,7 @@ unsigned int sysctl_preemptoff_tracing_threshold_ns = 1000000UL;
|
|||
|
||||
struct preempt_store {
|
||||
u64 ts;
|
||||
unsigned long caddr[4];
|
||||
unsigned long caddr[5];
|
||||
bool irqs_disabled;
|
||||
int pid;
|
||||
unsigned long ncsw;
|
||||
|
@ -750,7 +752,7 @@ void tracer_preempt_on(unsigned long a0, unsigned long a1)
|
|||
if (delta > sysctl_preemptoff_tracing_threshold_ns)
|
||||
trace_sched_preempt_disable(delta, ps->irqs_disabled,
|
||||
ps->caddr[0], ps->caddr[1],
|
||||
ps->caddr[2], ps->caddr[3]);
|
||||
ps->caddr[2], ps->caddr[3], ps->caddr[4]);
|
||||
ps->ts = 0;
|
||||
lockdep_on();
|
||||
#endif /* CONFIG_PREEMPTIRQ_EVENTS */
|
||||
|
@ -768,10 +770,11 @@ void tracer_preempt_off(unsigned long a0, unsigned long a1)
|
|||
lockdep_off();
|
||||
ps = &per_cpu(the_ps, raw_smp_processor_id());
|
||||
ps->ts = sched_clock();
|
||||
ps->caddr[0] = CALLER_ADDR0;
|
||||
ps->caddr[1] = CALLER_ADDR1;
|
||||
ps->caddr[2] = CALLER_ADDR2;
|
||||
ps->caddr[3] = CALLER_ADDR3;
|
||||
ps->caddr[0] = CALLER_ADDR1;
|
||||
ps->caddr[1] = CALLER_ADDR2;
|
||||
ps->caddr[2] = CALLER_ADDR3;
|
||||
ps->caddr[3] = CALLER_ADDR4;
|
||||
ps->caddr[4] = CALLER_ADDR5;
|
||||
ps->irqs_disabled = irqs_disabled();
|
||||
ps->pid = current->pid;
|
||||
ps->ncsw = current->nvcsw + current->nivcsw;
|
||||
|
|
Loading…
Reference in a new issue