From: Vyacheslav Cherkashin Date: Thu, 26 Sep 2013 13:02:25 +0000 (+0400) Subject: [IMPROVE] energy: calculation cpu time X-Git-Tag: Tizen_SDK_2.3~275 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=62dc49e111d6a3ed775be964405bd0c503995b4a;p=kernel%2Fswap-modules.git [IMPROVE] energy: calculation cpu time for system and idle Change-Id: Iff32fc56e8880ddd32a62be0be65f40705acf283 Signed-off-by: Vyacheslav Cherkashin --- diff --git a/energy/energy.c b/energy/energy.c index 83d4d9b..0de3233 100644 --- a/energy/energy.c +++ b/energy/energy.c @@ -37,10 +37,70 @@ #include +static u64 get_ntime(void) +{ + struct timespec ts; + getnstimeofday(&ts); + return timespec_to_ns(&ts); +} + + + + + +/* ============================================================================ + * = CPUS_TIME = + * ============================================================================ + */ +struct cpus_time { + u64 time_running[NR_CPUS]; + u64 time_entry[NR_CPUS]; +}; + +static void cpus_time_init(struct cpus_time *ct, u64 time) +{ + int cpu; + + for (cpu = 0; cpu < NR_CPUS; ++cpu) { + ct->time_running[cpu] = 0; + ct->time_entry[cpu] = time; + } +} + +static u64 cpus_time_get_running(struct cpus_time *ct, int cpu) +{ + return ct->time_running[cpu]; +} + +static void cpus_time_save_entry(struct cpus_time *ct, int cpu, u64 time) +{ + ct->time_entry[cpu] = time; +} + +static void cpus_time_update_running(struct cpus_time *ct, int cpu, u64 time) +{ + ct->time_running[cpu] += time - ct->time_entry[cpu]; +} + + +static struct cpus_time ct_idle; +static struct cpus_time ct_system; + +static void init_data_energy(void) +{ + u64 time = get_ntime(); + + cpus_time_init(&ct_idle, time); + cpus_time_init(&ct_system, time); +} + + + + + struct energy_data { /* for __switch_to */ - u64 time[NR_CPUS]; - u64 time_tmp[NR_CPUS]; + struct cpus_time ct; /* for sys_read */ atomic64_t sys_read_byte; @@ -58,7 +118,7 @@ static void *create_ed(void) ed = kmalloc(sizeof(*ed), GFP_ATOMIC); if (ed) { - memset(ed, 0, sizeof(*ed)); + cpus_time_init(&ed->ct, get_ntime()); atomic64_set(&ed->sys_read_byte, 0); atomic64_set(&ed->sys_write_byte, 0); } @@ -89,15 +149,6 @@ static void uninit_feature(void) feature_id = SSPT_FEATURE_ID_BAD; } -static u64 get_ntime(void) -{ - struct timespec ts; - - getnstimeofday(&ts); - - return (u64)ts.tv_sec * 1000*1000*1000 + ts.tv_nsec; -} - static struct energy_data *get_energy_data(struct task_struct *task) { void *data = NULL; @@ -154,32 +205,38 @@ static unsigned long get_arg0(struct pt_regs *regs) */ static int entry_handler_switch(struct kretprobe_instance *ri, struct pt_regs *regs) { + int cpu; + u64 time; + struct cpus_time* ct; struct energy_data *ed; - ed = get_energy_data(current); - if (ed) { - int cpu = task_cpu(current); + cpu = task_cpu(current); + time = get_ntime(); + ct = current->tgid ? &ct_system : &ct_idle; + cpus_time_update_running(ct, cpu, time); - if (ed->time_tmp[cpu]) { - ed->time[cpu] += get_ntime() - ed->time_tmp[cpu]; - ed->time_tmp[cpu] = 0; - } - } + ed = get_energy_data(current); + if (ed) + cpus_time_update_running(&ed->ct, cpu, time); return 0; } static int ret_handler_switch(struct kretprobe_instance *ri, struct pt_regs *regs) { + int cpu; + u64 time; + struct cpus_time* ct; struct energy_data *ed; - ed = get_energy_data(current); - if (ed) { - int cpu; + cpu = task_cpu(current); + time = get_ntime(); + ct = current->tgid ? &ct_system : &ct_idle; + cpus_time_save_entry(ct, cpu, time); - cpu = task_cpu(current); - ed->time_tmp[cpu] = get_ntime(); - } + ed = get_energy_data(current); + if (ed) + cpus_time_save_entry(&ed->ct, cpu, time); return 0; } @@ -306,6 +363,8 @@ int set_energy(void) { int ret = 0; + init_data_energy(); + ret = dbi_register_kretprobe(&sys_read_krp); if (ret) { printk("dbi_register_kretprobe(sys_read) result=%d!\n", ret);