Hi Jeremie, Yes, you are right. I modify the code which assumes if sysctl successes, the sysload.fscale should not be 0. So this patch only handles sysctl function failed case:
Index: machine.c =================================================================== RCS file: /cvs/src/usr.bin/top/machine.c,v retrieving revision 1.90 diff -u -p -r1.90 machine.c --- machine.c 14 May 2018 12:31:21 -0000 1.90 +++ machine.c 25 May 2018 01:12:20 -0000 @@ -282,8 +282,11 @@ get_system_info(struct system_info *si) } size = sizeof(sysload); - if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0) + if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0) { warn("sysctl failed"); + bzero(&sysload, sizeof(sysload)); + sysload.fscale = 1; + } infoloadp = si->load_avg; for (i = 0; i < 3; i++) *infoloadp++ = ((double) sysload.ldavg[i]) / sysload.fscale; Thanks! On 5/24/2018 7:54 PM, Jeremie Courreges-Anglas wrote: > On Tue, May 22 2018, Nan Xiao <n...@chinadtrace.org> wrote: >> Hi tech@, >> >> Below is the patch of resetting sysload if sysctl call failed in >> usr.bin/top/machine.c, otherwise the memory of sysload is undetermined. >> (The same process as uvmexp and bcstats). >> >> Index: machine.c >> =================================================================== >> RCS file: /cvs/src/usr.bin/top/machine.c,v >> retrieving revision 1.90 >> diff -u -p -r1.90 machine.c >> --- machine.c 14 May 2018 12:31:21 -0000 1.90 >> +++ machine.c 22 May 2018 09:49:39 -0000 >> @@ -282,8 +282,10 @@ get_system_info(struct system_info *si) >> } >> >> size = sizeof(sysload); >> - if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0) >> + if (sysctl(sysload_mib, 2, &sysload, &size, NULL, 0) < 0) { >> warn("sysctl failed"); >> + bzero(&sysload, sizeof(sysload)); >> + } >> infoloadp = si->load_avg; >> for (i = 0; i < 3; i++) >> *infoloadp++ = ((double) sysload.ldavg[i]) / sysload.fscale; > > This line of code should not run if sysload.fscale == 0. > -- Best Regards Nan Xiao