blob: 471177a93ea194a26e175549019abd5968ee7d59 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
%{
#ifndef TIMING_GETCYCLES
#define TIMING_GETCYCLES 0x01
#endif
#ifndef TIMING_GETTIMEOFDAY
#define TIMING_GETTIMEOFDAY 0x02
#endif
#ifndef TIMING_SCHEDCLOCK
#define TIMING_SCHEDCLOCK 0x03
#endif
#define MAX_TIMING_METHOD TIMING_SCHEDCLOCK
long timing_method = TIMING_GETTIMEOFDAY;
#ifndef _PFN_SCHEDCLOCK_TYPE
#define _PFN_SCHEDCLOCK_TYPE
typedef unsigned long long (* pfn_schedclock_type)(void);
#endif
pfn_schedclock_type pfn_schedclock = NULL;
%}
%{
#ifdef CONFIG_CPU_FREQ
static int __lket_time_cpufreq_callback(struct notifier_block *self,
unsigned long state, void *vfreqs);
struct notifier_block __lket_time_notifier = {
.notifier_call = __lket_time_cpufreq_callback,
};
#endif
%}
function set_timing_method(method:long)
%{
if(THIS->method == TIMING_SCHEDCLOCK) {
pfn_schedclock = (pfn_schedclock_type)kallsyms_lookup_name("sched_clock");
if(!pfn_schedclock) {
_stp_warn("Failed to lookup specified timing method sched_clock()\n");
return;
}
}
if(THIS->method > 0 && THIS->method <= MAX_TIMING_METHOD)
timing_method = THIS->method;
%}
function lket_init_time:long()
%{
int ret = 0;
#ifdef CONFIG_CPU_FREQ
if(timing_method == TIMING_GETCYCLES)
ret = cpufreq_register_notifier(&__lket_time_notifier,
CPUFREQ_TRANSITION_NOTIFIER);
#endif
THIS->__retvalue = ret;
%}
function lket_kill_time()
%{
#ifdef CONFIG_CPU_FREQ
if(timing_method == TIMING_GETCYCLES)
cpufreq_unregister_notifier(&__lket_time_notifier,
CPUFREQ_TRANSITION_NOTIFIER);
#endif
%}
|