From 617f2e7fe26a5a8c94f7d9fcea783d8c53c5ff1d Mon Sep 17 00:00:00 2001 From: Lingutla Chandrasekhar Date: Thu, 2 Jan 2020 15:58:01 +0530 Subject: [PATCH] sched: core: reset preemption/irqsoff disable timestamp Preempt/irqsoff tracer notes down preemption/irqs disabled timestamp and compares it with enable timestamp to report prolonged disabling callers at latency tracking. But they don't reset the time stamp at re-enable time. The time stamp could be stale and possible to report same latency multiple times or false positive. This could be possible when callsites uses notrace API (__preempt_) for preemption disable and tracable API (preempt_) for enable (ex: softirq). Fix it by resetting the preempt/irqsoff disable timestamp at re-enable time. Change-Id: I6790227998881922a9339869ce9ee2dab6202567 Signed-off-by: Lingutla Chandrasekhar --- kernel/sched/core.c | 1 + kernel/trace/trace_irqsoff.c | 1 + 2 files changed, 2 insertions(+) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index f68625ec8cf8..ddc508634516 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -3964,6 +3964,7 @@ static inline void preempt_latency_stop(int val) trace_sched_preempt_disable(delta, ps->irqs_disabled, ps->caddr[0], ps->caddr[1], ps->caddr[2], ps->caddr[3]); + ps->ts = 0; trace_preempt_on(CALLER_ADDR0, get_lock_parent_ip()); } } diff --git a/kernel/trace/trace_irqsoff.c b/kernel/trace/trace_irqsoff.c index fc002732c38c..741c94432797 100644 --- a/kernel/trace/trace_irqsoff.c +++ b/kernel/trace/trace_irqsoff.c @@ -640,6 +640,7 @@ void tracer_hardirqs_on(unsigned long a0, unsigned long a1) delta > sysctl_irqsoff_tracing_threshold_ns) trace_irqs_disable(delta, is->caddr[0], is->caddr[1], is->caddr[2], is->caddr[3]); + is->ts = 0; lockdep_on(); #endif /* CONFIG_PREEMPTIRQ_EVENTS */