Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755007AbbKMTyb (ORCPT ); Fri, 13 Nov 2015 14:54:31 -0500 Received: from mga01.intel.com ([192.55.52.88]:24041 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754901AbbKMTyG (ORCPT ); Fri, 13 Nov 2015 14:54:06 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,289,1444719600"; d="scan'208";a="684847572" From: Jacob Pan To: Peter Zijlstra , Ingo Molnar , Thomas Gleixner , John Stultz , LKML Cc: Arjan van de Ven , Srinivas Pandruvada , Len Brown , Rafael Wysocki , Eduardo Valentin , Paul Turner , Jacob Pan Subject: [PATCH 4/4] sched: add trace event for idle injection Date: Fri, 13 Nov 2015 11:53:07 -0800 Message-Id: <1447444387-23525-5-git-send-email-jacob.jun.pan@linux.intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1447444387-23525-1-git-send-email-jacob.jun.pan@linux.intel.com> References: <1447444387-23525-1-git-send-email-jacob.jun.pan@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2771 Lines: 94 Trace events for idle injection can be used to determine timer activities for checking synchronization. In addition they also helps to determine when the runqueue is throttled. Signed-off-by: Jacob Pan --- include/linux/sched.h | 5 +++++ include/trace/events/sched.h | 25 +++++++++++++++++++++++++ kernel/sched/fair.c | 3 +++ 3 files changed, 33 insertions(+) diff --git a/include/linux/sched.h b/include/linux/sched.h index ff551a3..99c79bf 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -3189,6 +3189,11 @@ extern int proc_sched_cfs_idle_inject_duration_handler(struct ctl_table *table, int write, void __user *buffer, size_t *length, loff_t *ppos); +enum cfs_idle_inject_action { + CFS_IDLE_INJECT_TIMER, /* timer sync point */ + CFS_IDLE_INJECT_FORCED, /* idle forced in rq */ + CFS_IDLE_INJECT_YIELD_SOFTIRQ /* yield to pending softirq */ +}; #endif #endif diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 539d6bc..52c11c1 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -566,6 +566,31 @@ TRACE_EVENT(sched_wake_idle_without_ipi, TP_printk("cpu=%d", __entry->cpu) ); + +#ifdef CONFIG_CFS_IDLE_INJECT +/* + * Tracepoint for idle injection + */ +TRACE_EVENT(sched_cfs_idle_inject, + + TP_PROTO(enum cfs_idle_inject_action action, int throttled), + + TP_ARGS(action, throttled), + + TP_STRUCT__entry( + __field(enum cfs_idle_inject_action, action) + __field(int, throttled) + ), + + TP_fast_assign( + __entry->action = action; + __entry->throttled = throttled; + ), + + TP_printk("action:%d throttled:%d", __entry->action, __entry->throttled) +); +#endif + #endif /* _TRACE_SCHED_H */ /* This part must be outside protection */ diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index a0cd777..20027eb 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -5248,8 +5248,10 @@ idle: if (in_forced_idle(cfs_rq)) { if (unlikely(local_softirq_pending())) { __unthrottle_cfs_rq(cfs_rq); + trace_sched_cfs_idle_inject(CFS_IDLE_INJECT_YIELD_SOFTIRQ, 1); goto again; } + trace_sched_cfs_idle_inject(CFS_IDLE_INJECT_FORCED, 1); return NULL; } /* @@ -8432,6 +8434,7 @@ static enum hrtimer_restart idle_inject_timer_fn(struct hrtimer *hrtimer) throttle_rq(cpu); } raw_cpu_write(idle_injected, !status); + trace_sched_cfs_idle_inject(CFS_IDLE_INJECT_TIMER, !status); return HRTIMER_RESTART; } -- 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/