From: Jaromir Capik Date: Sat, 28 Jul 2012 07:50:00 +0000 (+1000) Subject: vmstat si and so fields zero with -S mM 1 X-Git-Tag: v3.3.4~49 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=00d7d4e37abdf918b62d266086cfe26f61574c2f;p=procps-ng vmstat si and so fields zero with -S mM 1 'si' and 'so' values depend on the result of the unitConvert function where the output is a fixed-point size of kb_per_page after the conversion. It gives 4 for kB units and 0 for MB units. This also causes problems when switching between 'K' and 'k' since the output value is 4 in both cases and the result for 'k' and 'K' then doesn't differ ... I swapped the conversion with multiplication in order to make the number higher so it doesn't lose precision. Since the unitConvert now accepts long instead of int, I had to change the input type from int to long. Signed-off-by: Craig Small --- diff --git a/vmstat.c b/vmstat.c index 669a263f..93f620d1 100644 --- a/vmstat.c +++ b/vmstat.c @@ -220,7 +220,7 @@ static void new_header(void) _("wa")); } -static unsigned long unitConvert(unsigned int size) +static unsigned long unitConvert(unsigned long size) { float cvSize; cvSize = (float)size / dataUnit * ((statMode == SLABSTAT) ? 1 : 1024); @@ -264,8 +264,8 @@ static void new_format(void) unitConvert(kb_swap_used), unitConvert(kb_main_free), unitConvert(a_option?kb_inactive:kb_main_buffers), unitConvert(a_option?kb_active:kb_main_cached), - (unsigned)( (*pswpin * unitConvert(kb_per_page) * hz + divo2) / Div ), - (unsigned)( (*pswpout * unitConvert(kb_per_page) * hz + divo2) / Div ), + (unsigned)( (unitConvert(*pswpin * kb_per_page) * hz + divo2) / Div ), + (unsigned)( (unitConvert(*pswpout * kb_per_page) * hz + divo2) / Div ), (unsigned)( (*pgpgin * hz + divo2) / Div ), (unsigned)( (*pgpgout * hz + divo2) / Div ), (unsigned)( (*intr * hz + divo2) / Div ), @@ -320,9 +320,9 @@ static void new_format(void) unitConvert(a_option?kb_inactive:kb_main_buffers), unitConvert(a_option?kb_active:kb_main_cached), /*si */ - (unsigned)( ( (pswpin [tog] - pswpin [!tog])*unitConvert(kb_per_page)+sleep_half )/sleep_time ), + (unsigned)( ( unitConvert((pswpin [tog] - pswpin [!tog])*kb_per_page)+sleep_half )/sleep_time ), /* so */ - (unsigned)( ( (pswpout[tog] - pswpout[!tog])*unitConvert(kb_per_page)+sleep_half )/sleep_time ), + (unsigned)( ( unitConvert((pswpout[tog] - pswpout[!tog])*kb_per_page)+sleep_half )/sleep_time ), /* bi */ (unsigned)( ( pgpgin [tog] - pgpgin [!tog] +sleep_half )/sleep_time ), /* bo */