From: Vyacheslav Cherkashin Date: Fri, 27 Sep 2013 09:03:07 +0000 (+0400) Subject: [IMPROVE] energy: calculation R/W for system X-Git-Tag: Tizen_SDK_2.3~273 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=541c31c14e44a60ecb85a5faeea7fbb82b28b2ac;p=kernel%2Fswap-modules.git [IMPROVE] energy: calculation R/W for system Change-Id: I09d9194d7bbe55eccf33fdf91a44f3b5614d63b3 Signed-off-by: Vyacheslav Cherkashin --- diff --git a/energy/energy.c b/energy/energy.c index 0de3233..2bed6fd 100644 --- a/energy/energy.c +++ b/energy/energy.c @@ -83,13 +83,19 @@ static void cpus_time_update_running(struct cpus_time *ct, int cpu, u64 time) } +static atomic64_t sys_read_byte; +static atomic64_t sys_write_byte; static struct cpus_time ct_idle; static struct cpus_time ct_system; static void init_data_energy(void) { - u64 time = get_ntime(); + u64 time; + + atomic64_set(&sys_read_byte, 0); + atomic64_set(&sys_write_byte, 0); + time = get_ntime(); cpus_time_init(&ct_idle, time); cpus_time_init(&ct_system, time); } @@ -184,6 +190,25 @@ static int check_ftype(int fd) return ret; } +static int check_file(int fd) +{ + struct file *file; + + file = fget(fd); + if (file) { + int magic = 0; + if (file->f_dentry && file->f_dentry->d_sb) + magic = file->f_dentry->d_sb->s_magic; + + fput(file); + + if (check_fs(magic) && check_ftype(fd)) + return 1; + } + + return 0; +} + static unsigned long get_arg0(struct pt_regs *regs) { #if defined(CONFIG_ARM) @@ -267,43 +292,24 @@ static int entry_handler_sys_read(struct kretprobe_instance *ri, struct pt_regs return 0; } -static struct energy_data *get_and_check_energy_data(int fd) -{ - struct energy_data *ed; - ed = get_energy_data(current); - if (ed) { - struct file *file; - - file = fget(fd); - if (file) { - int magic = 0; - if (file->f_dentry && file->f_dentry->d_sb) - magic = file->f_dentry->d_sb->s_magic; - - fput(file); - - if (check_fs(magic) && check_ftype(fd)) - return ed; - } - } - - return NULL; -} - static int ret_handler_sys_read(struct kretprobe_instance *ri, struct pt_regs *regs) { int ret = regs_return_value(regs); if (ret > 0) { - struct energy_data *ed; struct sys_read_data *srd; srd = (struct sys_read_data *)ri->data; - ed = get_and_check_energy_data(srd->fd); + if (check_file(srd->fd)) { + struct energy_data *ed; - if (ed) - atomic64_add(ret, &ed->sys_read_byte); + ed = get_energy_data(current); + if (ed) + atomic64_add(ret, &ed->sys_read_byte); + + atomic64_add(ret, &sys_read_byte); + } } return 0; @@ -337,13 +343,18 @@ static int ret_handler_sys_write(struct kretprobe_instance *ri, struct pt_regs * int ret = regs_return_value(regs); if (ret > 0) { - struct energy_data *ed; struct sys_read_data *srd; srd = (struct sys_read_data *)ri->data; - ed = get_and_check_energy_data(srd->fd); - if (ed) - atomic64_add(ret, &ed->sys_write_byte); + if (check_file(srd->fd)) { + struct energy_data *ed; + + ed = get_energy_data(current); + if (ed) + atomic64_add(ret, &ed->sys_write_byte); + + atomic64_add(ret, &sys_write_byte); + } } return 0;