From e8f793f620f40eff540b2b49ecab00c0b9de3fc5 Mon Sep 17 00:00:00 2001 From: James Simmons Date: Mon, 18 Nov 2019 15:26:39 -0500 Subject: [PATCH 1/1] LU-6174 obd: perform proper division Lustre stats have two files lc_sum and lc_count which are both s64 so using do_div() is completely wrong. Use div64_s64() instead. Change-Id: Ie694c1c6bf79979bff3eae0de9791c81c355ea30 Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/36751 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Shaun Tancheff Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin --- lustre/obdclass/lprocfs_status.c | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/lustre/obdclass/lprocfs_status.c b/lustre/obdclass/lprocfs_status.c index 9763b8d1..9d6c8c2 100644 --- a/lustre/obdclass/lprocfs_status.c +++ b/lustre/obdclass/lprocfs_status.c @@ -988,12 +988,9 @@ int lprocfs_import_seq_show(struct seq_file *m, void *data) header = &obd->obd_svc_stats->ls_cnt_header[PTLRPC_REQWAIT_CNTR]; lprocfs_stats_collect(obd->obd_svc_stats, PTLRPC_REQWAIT_CNTR, &ret); - if (ret.lc_count != 0) { - /* first argument to do_div MUST be __u64 */ - __u64 sum = ret.lc_sum; - do_div(sum, ret.lc_count); - ret.lc_sum = sum; - } else + if (ret.lc_count != 0) + ret.lc_sum = div64_s64(ret.lc_sum, ret.lc_count); + else ret.lc_sum = 0; seq_printf(m, " rpcs:\n" " inflight: %u\n" @@ -1032,10 +1029,7 @@ int lprocfs_import_seq_show(struct seq_file *m, void *data) PTLRPC_LAST_CNTR + BRW_READ_BYTES + rw, &ret); if (ret.lc_sum > 0 && ret.lc_count > 0) { - /* first argument to do_div MUST be __u64 */ - __u64 sum = ret.lc_sum; - do_div(sum, ret.lc_count); - ret.lc_sum = sum; + ret.lc_sum = div64_s64(ret.lc_sum, ret.lc_count); seq_printf(m, " %s_data_averages:\n" " bytes_per_rpc: %llu\n", rw ? "write" : "read", @@ -1046,10 +1040,7 @@ int lprocfs_import_seq_show(struct seq_file *m, void *data) header = &obd->obd_svc_stats->ls_cnt_header[j]; lprocfs_stats_collect(obd->obd_svc_stats, j, &ret); if (ret.lc_sum > 0 && ret.lc_count != 0) { - /* first argument to do_div MUST be __u64 */ - __u64 sum = ret.lc_sum; - do_div(sum, ret.lc_count); - ret.lc_sum = sum; + ret.lc_sum = div64_s64(ret.lc_sum, ret.lc_count); seq_printf(m, " %s_per_rpc: %llu\n", header->lc_units, ret.lc_sum); j = (int)ret.lc_sum; -- 1.8.3.1