msm: mpdcvs: add ftrace events

Add ftrace events at interesting points in the dcvs and mpdecision code.

Change-Id: I58e5f087c8f94286bf2a34dcfee258bdab4c8511
Signed-off-by: Abhijeet Dharmapurikar <adharmap@codeaurora.org>
This commit is contained in:
Abhijeet Dharmapurikar 2012-09-13 19:05:13 -07:00 committed by Stephen Boyd
parent 25da89de28
commit abc14e6869
4 changed files with 175 additions and 0 deletions

View file

@ -26,6 +26,7 @@
#include <asm/atomic.h>
#include <asm/page.h>
#include <mach/msm_dcvs.h>
#include <trace/events/mpdcvs_trace.h>
#define CORE_HANDLE_OFFSET (0xA0)
#define __err(f, ...) pr_err("MSM_DCVS: %s: " f, __func__, __VA_ARGS__)
@ -477,6 +478,7 @@ static enum hrtimer_restart msm_dcvs_core_slack_timer(struct hrtimer *timer)
struct dcvs_core, slack_timer);
uint32_t ret1;
trace_printk("dcvs: Slack timer fired for core=%s\n", core->core_name);
/**
* Timer expired, notify TZ
* Dont care about the third arg.
@ -954,6 +956,7 @@ int msm_dcvs_idle(int dcvs_core_id, enum msm_core_idle_state state,
if (ret < 0 && ret != -13)
__err("Error (%d) sending idle enter for %s\n",
ret, core->core_name);
trace_msm_dcvs_idle("idle_enter_exit", core->core_name, 1);
break;
case MSM_DCVS_IDLE_EXIT:
@ -963,6 +966,10 @@ int msm_dcvs_idle(int dcvs_core_id, enum msm_core_idle_state state,
__err("Error (%d) sending idle exit for %s\n",
ret, core->core_name);
start_slack_timer(core, timer_interval_us);
trace_msm_dcvs_idle("idle_enter_exit", core->core_name, 0);
trace_msm_dcvs_iowait("iowait", core->core_name, iowaited);
trace_msm_dcvs_slack_time("slack_timer_dcvs", core->core_name,
timer_interval_us);
break;
}

View file

@ -20,6 +20,7 @@
#include <mach/memory.h>
#include <mach/scm.h>
#include <mach/msm_dcvs_scm.h>
#include <trace/events/mpdcvs_trace.h>
#define DCVS_CMD_REGISTER_CORE 2
#define DCVS_CMD_SET_ALGO_PARAM 3
@ -225,6 +226,9 @@ int msm_dcvs_scm_event(uint32_t core_id,
ret = scm_call_atomic4_3(SCM_SVC_DCVS, DCVS_CMD_EVENT,
core_id, event_id, param0, param1, ret0, ret1);
trace_msm_dcvs_scm_event(core_id, (int)event_id, param0, param1,
*ret0, *ret1);
return ret;
}
EXPORT_SYMBOL(msm_dcvs_scm_event);

View file

@ -37,6 +37,8 @@
#include <asm/page.h>
#include <mach/msm_dcvs.h>
#include <mach/msm_dcvs_scm.h>
#define CREATE_TRACE_POINTS
#include <trace/events/mpdcvs_trace.h>
#define DEFAULT_RQ_AVG_POLL_MS (1)
@ -168,6 +170,8 @@ static enum hrtimer_restart msm_mpd_rq_avg_poll_timer(struct hrtimer *timer)
if (nr > num_present_hundreds)
nr = num_present_hundreds;
trace_msm_mp_runq("nr_running", nr);
if (ok_to_update_tz(nr, last_nr)) {
hrtimer_try_to_cancel(&msm_mpd.slack_timer);
msm_mpd.data.nr = nr;
@ -263,6 +267,8 @@ static int __ref msm_mpd_update_scm(enum msm_dcvs_scm_event event, int nr)
return ret;
}
trace_msm_mp_cpusonline("cpu_online_mp", req_cpu_mask);
trace_msm_mp_slacktime("slack_time_mp", slack_us);
msm_mpd.slack_us = slack_us;
atomic_set(&msm_mpd.algo_cpu_mask, req_cpu_mask);
msm_mpd.hpupdate = HPUPDATE_SCHEDULED;
@ -286,6 +292,8 @@ static enum hrtimer_restart msm_mpd_slack_timer(struct hrtimer *timer)
{
unsigned long flags;
trace_printk("mpd:slack_timer_fired!\n");
spin_lock_irqsave(&rq_avg_lock, flags);
if (msm_mpd.data.event == MSM_DCVS_SCM_RUNQ_UPDATE)
goto out;

View file

@ -0,0 +1,156 @@
/* Copyright (c) 2012, Free Software Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#undef TRACE_SYSTEM
#define TRACE_SYSTEM mpdcvs_trace
#if !defined(_TRACE_MPDCVS_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_MPDCVS_H
#include <linux/tracepoint.h>
DECLARE_EVENT_CLASS(msm_mp,
TP_PROTO(const char *name, int mp_val),
TP_ARGS(name, mp_val),
TP_STRUCT__entry(
__string(name, name)
__field(int, mp_val)
),
TP_fast_assign(
__assign_str(name, name);
__entry->mp_val = mp_val;
),
TP_printk("ev_name=%s ev_level=%d",
__get_str(name),
__entry->mp_val)
);
/* Core function of run_q */
DEFINE_EVENT(msm_mp, msm_mp_runq,
TP_PROTO(const char *name, int mp_val),
TP_ARGS(name, mp_val)
);
DEFINE_EVENT(msm_mp, msm_mp_cpusonline,
TP_PROTO(const char *name, int mp_val),
TP_ARGS(name, mp_val)
);
DEFINE_EVENT(msm_mp, msm_mp_slacktime,
TP_PROTO(const char *name, int mp_val),
TP_ARGS(name, mp_val)
);
DECLARE_EVENT_CLASS(msm_dcvs,
TP_PROTO(const char *name, const char *cpuid, int val),
TP_ARGS(name, cpuid, val),
TP_STRUCT__entry(
__string(name, name)
__string(cpuid, cpuid)
__field(int, val)
),
TP_fast_assign(
__assign_str(name, name);
__assign_str(cpuid, cpuid);
__entry->val = val;
),
TP_printk("ev_name=%s d_name=%s ev_level=%d",
__get_str(name),
__get_str(cpuid),
__entry->val)
);
/* Core function of dcvs */
DEFINE_EVENT(msm_dcvs, msm_dcvs_idle,
TP_PROTO(const char *name, const char *cpuid, int val),
TP_ARGS(name, cpuid, val)
);
DEFINE_EVENT(msm_dcvs, msm_dcvs_iowait,
TP_PROTO(const char *name, const char *cpuid, int val),
TP_ARGS(name, cpuid, val)
);
DEFINE_EVENT(msm_dcvs, msm_dcvs_slack_time,
TP_PROTO(const char *name, const char *cpuid, int val),
TP_ARGS(name, cpuid, val)
);
DECLARE_EVENT_CLASS(msm_dcvs_scm,
TP_PROTO(unsigned long cpuid, int ev_type, unsigned long param0,
unsigned long param1, unsigned long ret0, unsigned long ret1),
TP_ARGS(cpuid, ev_type, param0, param1, ret0, ret1),
TP_STRUCT__entry(
__field(unsigned long, cpuid)
__field(int, ev_type)
__field(unsigned long, param0)
__field(unsigned long, param1)
__field(unsigned long, ret0)
__field(unsigned long, ret1)
),
TP_fast_assign(
__entry->cpuid = cpuid;
__entry->ev_type = ev_type;
__entry->param0 = param0;
__entry->param1 = param1;
__entry->ret0 = ret0;
__entry->ret1 = ret1;
),
TP_printk("dev=%lu ev_type=%d ev_param0=%lu ev_param1=%lu ev_ret0=%lu ev_ret1=%lu",
__entry->cpuid,
__entry->ev_type,
__entry->param0,
__entry->param1,
__entry->ret0,
__entry->ret1)
);
DEFINE_EVENT(msm_dcvs_scm, msm_dcvs_scm_event,
TP_PROTO(unsigned long cpuid, int ev_type, unsigned long param0,
unsigned long param1, unsigned long ret0, unsigned long ret1),
TP_ARGS(cpuid, ev_type, param0, param1, ret0, ret1)
);
#endif /* _TRACE_MPDCVS_H */
/* This part must be outside protection */
#include <trace/define_trace.h>