From: Vitaliy Cherepanov Date: Thu, 10 Jul 2014 09:09:44 +0000 (+0400) Subject: [PROTO] MSG_SYSTEM: disk rw sectors changed to rw bytes X-Git-Tag: Tizen_SDK_2.3~46 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b09e8ec62d3363fc467f4c0d24f34803ed5c06f0;p=platform%2Fcore%2Fsystem%2Fswap-manager.git [PROTO] MSG_SYSTEM: disk rw sectors changed to rw bytes Change-Id: Ie36ddd41560034174f08dde5cf683af6aa1afc72 Signed-off-by: Vitaliy Cherepanov --- diff --git a/daemon/da_protocol.h b/daemon/da_protocol.h index 441bfc7..77ee743 100644 --- a/daemon/da_protocol.h +++ b/daemon/da_protocol.h @@ -325,9 +325,9 @@ struct system_info_t { // system_disk uint32_t total_used_drive; uint32_t disk_reads; - uint32_t disk_sectors_read; + uint32_t disk_bytes_read; uint32_t disk_writes; - uint32_t disk_sectors_write; + uint32_t disk_bytes_write; // system_network uint32_t network_send_size; diff --git a/daemon/sys_stat.c b/daemon/sys_stat.c index 723a291..f4c3331 100644 --- a/daemon/sys_stat.c +++ b/daemon/sys_stat.c @@ -1437,20 +1437,61 @@ static void peek_network_stat_diff(uint32_t *recv, uint32_t *send) } +/* function + * info: get sector size by partition name + * params: + * char *partition_name - partition name to get sector size + * return + * uint32_t - partition sector size + * */ +static uint32_t get_partition_sector_size(char *partition_name) +{ + char buf[MAX_FILENAME]; + FILE *f = NULL; + uint32_t res = 0; + + /* prepare partition sector size file name */ + sprintf(buf, "/sys/block/%s/queue/hw_sector_size", partition_name); + f = fopen(buf, "r"); + + /* check file */ + if (f != NULL) { + /* reset error code */ + errno = 0; + /* scan partition sector size */ + fscanf(f, "%d", &res); + /* check errors */ + int errsv = errno; + if (errsv) { + LOGE("scan file <%s> error: %s\n", buf, + strerror(errsv)); + res = 0; + } + /* close source file */ + fclose(f); + } else + LOGE("cannot get size for partition <%s> from file <%s>\n", + partition_name, buf); + + /* return result value */ + return res; +} + static void init_disk_stat(void) { manager.fd.diskstats = fopen("/proc/diskstats", "r"); } -static void get_disk_stat(uint32_t *reads, uint32_t *sec_reads, - uint32_t *writes, uint32_t *sec_writes) +static void get_disk_stat(uint32_t *reads, uint32_t *bytes_reads, + uint32_t *writes, uint32_t *bytes_writes) { enum { partition_name_maxlength = 128 }; FILE *fp = manager.fd.diskstats; char master_partition[partition_name_maxlength] = { 0 }; + uint32_t sector_size = 0; *reads = *writes = 0; - *sec_reads = *sec_writes = 0; + *bytes_reads = *bytes_writes = 0; if (fp == NULL) return; @@ -1486,34 +1527,33 @@ static void get_disk_stat(uint32_t *reads, uint32_t *sec_reads, memcpy(master_partition, partition, partition_name_maxlength); - // FIXME rw size is in sectors - // actualy different disks - different partition sector size (?) - // maybe need convert to bytes like this: - //*read += pread * sec_size; - //*write += pwrite * sec_size; + + /* get sector size */ + sector_size = get_partition_sector_size(partition); *reads += (uint32_t)preads; *writes += (uint32_t)pwrites; - *sec_reads += (uint32_t)psec_read; - *sec_writes += (uint32_t)psec_write; + /* calculate read and write bytes data */ + *bytes_reads += (uint32_t)psec_read * sector_size; + *bytes_writes += (uint32_t)psec_write * sector_size; } } } -static void peek_disk_stat_diff(uint32_t *reads, uint32_t *sec_reads, - uint32_t *writes, uint32_t *sec_writes) +static void peek_disk_stat_diff(uint32_t *reads, uint32_t *bytes_reads, + uint32_t *writes, uint32_t *bytes_writes) { static uint32_t reads_old; - static uint32_t sec_reads_old; + static uint32_t bytes_reads_old; static uint32_t writes_old; - static uint32_t sec_writes_old; + static uint32_t bytes_writes_old; uint32_t tmp; //get cur values - get_disk_stat(reads, sec_reads, writes, sec_writes); + get_disk_stat(reads, bytes_reads, writes, bytes_writes); tmp = *reads; *reads = val_diff(tmp, reads_old); @@ -1523,13 +1563,13 @@ static void peek_disk_stat_diff(uint32_t *reads, uint32_t *sec_reads, *writes = val_diff(tmp, writes_old); writes_old = tmp; - tmp = *sec_reads; - *sec_reads = val_diff(tmp, sec_reads_old); - sec_reads_old = tmp; + tmp = *bytes_reads; + *bytes_reads = val_diff(tmp, bytes_reads_old); + bytes_reads_old = tmp; - tmp = *sec_writes; - *sec_writes = val_diff(tmp, sec_writes_old); - sec_writes_old = tmp; + tmp = *bytes_writes; + *bytes_writes = val_diff(tmp, bytes_writes_old); + bytes_writes_old = tmp; } @@ -1857,9 +1897,9 @@ int get_system_info(struct system_info_t *sys_info) if (IS_OPT_SET(FL_SYSTEM_DISK)) { sys_info->total_used_drive = get_total_used_drive(); peek_disk_stat_diff(&sys_info->disk_reads, - &sys_info->disk_sectors_read, + &sys_info->disk_bytes_read, &sys_info->disk_writes, - &sys_info->disk_sectors_write); + &sys_info->disk_bytes_write); } if (IS_OPT_SET(FL_SYSTEM_NETWORK)) @@ -2051,10 +2091,10 @@ int fill_target_info(struct target_info_t *target_info) int sys_stat_prepare(void) { - uint32_t reads, writes, sec_reads, sec_writes; + uint32_t reads, writes, bytes_reads, bytes_writes; uint32_t recv, send; - peek_disk_stat_diff(&reads, &writes, &sec_reads, &sec_writes); + peek_disk_stat_diff(&reads, &writes, &bytes_reads, &bytes_writes); peek_network_stat_diff(&recv, &send); return 0; @@ -2186,9 +2226,9 @@ struct msg_data_t *pack_system_info(struct system_info_t *sys_info) pack_int32(p, sys_info->total_used_drive); pack_int32(p, sys_info->disk_reads); - pack_int32(p, sys_info->disk_sectors_read); + pack_int32(p, sys_info->disk_bytes_read); pack_int32(p, sys_info->disk_writes); - pack_int32(p, sys_info->disk_sectors_write); + pack_int32(p, sys_info->disk_bytes_write); pack_int32(p, sys_info->network_send_size); pack_int32(p, sys_info->network_receive_size);