--- proc/sysinfo.c +++ proc/sysinfo.c 2012-06-04 09:45:53.448364904 +0000 @@ -676,8 +676,16 @@ nextline: if(kb_inactive==~0UL){ kb_inactive = kb_inact_dirty + kb_inact_clean + kb_inact_laundry; } - kb_swap_used = kb_swap_total - kb_swap_free; - kb_main_used = kb_main_total - kb_main_free; + if (kb_swap_total > kb_swap_free) { + kb_swap_used = kb_swap_total - kb_swap_free; + } else { + kb_swap_used = 0; + } + if (kb_main_total > kb_main_free) { + kb_main_used = kb_main_total - kb_main_free; + } else { + kb_main_used = 0; + } kb_main_cached += kb_swap_reclaimable + kb_swap_cached + kb_nfs_unstable; } --- free.c +++ free.c 2012-06-04 09:50:26.588010539 +0000 @@ -310,24 +310,44 @@ int main(int argc, char **argv) * to print the high info, even if it is zero. */ if (flags & FREE_LOHI) { + unsigned long kb_low_used; + unsigned long kb_high_used; + + if (kb_low_total > kb_low_free) + kb_low_used = kb_low_total - kb_low_free; + else + kb_low_used = 0; + + if (kb_high_total > kb_high_free) + kb_high_used = kb_high_total - kb_high_free; + else + kb_high_used = 0; + printf("%-7s", _("Low:")); printf(" %10s", scale_size(kb_low_total, flags, args)); - printf(" %10s", scale_size(kb_low_total - kb_low_free, flags, args)); + printf(" %10s", scale_size(kb_low_used, flags, args)); printf(" %10s", scale_size(kb_low_free, flags, args)); printf("\n"); printf("%-7s", _("High:")); printf(" %10s", scale_size(kb_high_total, flags, args)); - printf(" %10s", scale_size(kb_high_total - kb_high_free, flags, args)); + printf(" %10s", scale_size(kb_high_used, flags, args)); printf(" %10s", scale_size(kb_high_free, flags, args)); printf("\n"); } if (!(flags & FREE_OLDFMT)) { unsigned KLONG buffers_plus_cached = kb_main_buffers + kb_main_cached; + unsigned long kb_used_minus_bufcache; + + if (kb_main_used > buffers_plus_cached) + kb_used_minus_bufcache = kb_main_used - buffers_plus_cached; + else + kb_used_minus_bufcache = 0; + printf(_("-/+ buffers/cache:")); printf(" %10s", - scale_size(kb_main_used - buffers_plus_cached, flags, args)); + scale_size(kb_used_minus_bufcache, flags, args)); printf(" %10s", scale_size(kb_main_free + buffers_plus_cached, flags, args)); printf("\n");