From: KOSAKI Motohiro Date: Tue, 24 Jun 2014 02:17:36 +0000 (-0400) Subject: workaround for /proc/stat go backward X-Git-Tag: v11.1.1~13^2 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=1655f22d0c6d1f23fe3d167936ae54eb2a50cff1;p=sysstat workaround for /proc/stat go backward Since dyn-tick feature was introduced (at kernel 2.6.21), /proc/stat is unreliable and unstable. Stopped cpu can't provide reliable stat. kernel try to provide a maximum guess. But it is not 100% accurate. Unfortunately, the fields are unsigned. So, stepping backward can make overflow and some command (e.g. mpstat) show very big number. This patch provide a workaround. Signed-off-by: KOSAKI Motohiro --- diff --git a/common.c b/common.c index 0562993..e96c881 100644 --- a/common.c +++ b/common.c @@ -504,13 +504,23 @@ void get_HZ(void) double ll_sp_value(unsigned long long value1, unsigned long long value2, unsigned long long itv) { - return SP_VALUE(value1, value2, itv); + /* Workaround: dyn-tick kernel has a race issue and /proc/stat values + could be backward. */ + if (value2 < value1) + return 0; + else + return SP_VALUE(value1, value2, itv); } double ll_s_value(unsigned long long value1, unsigned long long value2, unsigned long long itv) { - return S_VALUE(value1, value2, itv); + /* Workaround: dyn-tick kernel has a race issue and /proc/stat values + could be backward. */ + if (value2 < value1) + return 0; + else + return S_VALUE(value1, value2, itv); } /*