From epeters@dualism.torrenal.com Fri Sep 3 01:20:50 1999 Return-Path: Received: from dualism.torrenal.com (dualism.torrenal.com [207.92.104.97]) by hub.freebsd.org (Postfix) with ESMTP id 82B9C14EA7 for ; Fri, 3 Sep 1999 01:20:32 -0700 (PDT) (envelope-from epeters@dualism.torrenal.com) Received: (from epeters@localhost) by dualism.torrenal.com (8.9.3/8.9.3) id CAA79205; Fri, 3 Sep 1999 02:19:01 -0600 (MDT) (envelope-from epeters) Message-Id: <199909030819.CAA79205@dualism.torrenal.com> Date: Fri, 3 Sep 1999 02:19:01 -0600 (MDT) From: Eric Peters Sender: epeters@dualism.torrenal.com Reply-To: epeters@207.92.104.97 To: FreeBSD-gnats-submit@freebsd.org Subject: [PATCH] top(1) sorts processes incorrectly X-Send-Pr-Version: 3.2 >Number: 13557 >Category: bin >Synopsis: [PATCH] top(1) sorts processes incorrectly >Confidential: no >Severity: non-critical >Priority: low >Responsible: mikeh >State: closed >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Fri Sep 3 01:30:01 PDT 1999 >Closed-Date: Mon Oct 1 22:30:59 PDT 2001 >Last-Modified: Mon Oct 01 22:31:14 PDT 2001 >Originator: Eric Peters >Release: FreeBSD 3.2-STABLE i386 >Organization: >Environment: FreeBSD 3.2-Stable built August 11th, 1999 SMP Pentium II 450x2 >Description: When running top(1) sorting by 'time' (top -otime) top(1) fails to sort correctly some processes that have accumulated excessive runtime. Turns out top(1) compares the time processes have run (proc.p_runtime) and stores the result in an interger. Not bad in itself, but p_runtime is a 64bit value. >How-To-Repeat: start a long-running process, such as #!/usr/bin/perl do{}while 1 (I am sure more productive examples abound.) Check 'top -otime' periodiocaly (about 8.5 hours in should work, but I suspect this may present itself earlier). >Fix: Apply the following patch. Although I can verify its sanity, the code involved has a smell of 'optimized' & I won't pretend knowing how this mangles it or how best to nudge things into good order. *** usr.bin/top/machine.c.orig Fri Sep 3 00:57:09 1999 --- usr.bin/top/machine.c Fri Sep 3 01:02:07 1999 *************** *** 743,749 **** (result = lresult > 0 ? 1 : lresult < 0 ? -1 : 0) == 0) #define ORDERKEY_CPTICKS \ ! if ((result = PP(p2, p_runtime) - PP(p1, p_runtime)) == 0) #define ORDERKEY_STATE \ if ((result = sorted_state[(unsigned char) PP(p2, p_stat)] - \ --- 743,750 ---- (result = lresult > 0 ? 1 : lresult < 0 ? -1 : 0) == 0) #define ORDERKEY_CPTICKS \ ! if (llresult = (long long) PP(p2, p_runtime) - (long long) PP(p1, p_runtime), \ ! (result = llresult > 0 ? 1 : llresult < 0 ? -1 : 0) == 0) #define ORDERKEY_STATE \ if ((result = sorted_state[(unsigned char) PP(p2, p_stat)] - \ *************** *** 775,780 **** --- 776,782 ---- register struct kinfo_proc *p2; register int result; register pctcpu lresult; + long long llresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; *************** *** 817,822 **** --- 819,825 ---- register struct kinfo_proc *p2; register int result; register pctcpu lresult; + long long llresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; *************** *** 846,851 **** --- 849,855 ---- register struct kinfo_proc *p2; register int result; register pctcpu lresult; + long long llresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; *************** *** 875,880 **** --- 879,885 ---- register struct kinfo_proc *p2; register int result; register pctcpu lresult; + long long llresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; *************** *** 904,909 **** --- 909,915 ---- register struct kinfo_proc *p2; register int result; register pctcpu lresult; + long long llresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; >Release-Note: >Audit-Trail: State-Changed-From-To: open->feedback State-Changed-By: mikeh State-Changed-When: Fri Jun 15 21:54:45 PDT 2001 State-Changed-Why: Can you report if this was fixed by rev 1.28 of machine.c? Responsible-Changed-From-To: freebsd-bugs->mikeh Responsible-Changed-By: mikeh Responsible-Changed-When: Fri Jun 15 21:54:45 PDT 2001 Responsible-Changed-Why: I'll handle feedback. http://www.FreeBSD.org/cgi/query-pr.cgi?pr=13557 State-Changed-From-To: feedback->closed State-Changed-By: mikeh State-Changed-When: Mon Oct 1 22:30:59 PDT 2001 State-Changed-Why: Feedback timeout. http://www.FreeBSD.org/cgi/query-pr.cgi?pr=13557 >Unformatted: