Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9205608 authored by Lingutla Chandrasekhar's avatar Lingutla Chandrasekhar
Browse files

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: default avatarLingutla Chandrasekhar <clingutla@codeaurora.org>
parent 94905802
Loading
Loading
Loading
Loading
+18 −11
Original line number Diff line number Diff line
@@ -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 */
+15 −12
Original line number Diff line number Diff line
@@ -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;