kern/83192:

Bruce Evans bde at zeta.org.au
Sun Jul 10 01:10:23 GMT 2005


The following reply was made to PR kern/83192; it has been noted by GNATS.

From: Bruce Evans <bde at zeta.org.au>
To: Maciej Zawadzinski <mzawadzinski at gmail.com>
Cc: freebsd-gnats-submit at FreeBSD.org, freebsd-bugs at FreeBSD.org
Subject: Re: kern/83192: 
Date: Sun, 10 Jul 2005 11:05:00 +1000 (EST)

 On Sat, 9 Jul 2005, Maciej Zawadzinski wrote:
 
 >> Fix:
 > --- kern_synch.c.orig	Fri Jul  8 22:07:20 2005
 > +++ kern_synch.c	Fri Jul  8 22:07:47 2005
 > @@ -322,7 +322,7 @@
 > 	 * over max, arrange to kill the process in ast().
 > 	 */
 > 	if (p->p_cpulimit != RLIM_INFINITY &&
 > -	    p->p_runtime.sec > p->p_cpulimit) {
 > +	    p->p_runtime.sec >= p->p_cpulimit) {
 > 		p->p_sflag |= PS_XCPU;
 > 		td->td_flags |= TDF_ASTPENDING;
 > 	}
 
 This seems to be correct, except it changes the code back to not matching
 the comment.  p->p_cpulimit a max, not a limit despite its name, since
 it is an alias for the corresponding rlimit which is also a max, not a
 limit despite _its_ name.  Doing something when a max is reached but
 not exceeded is normally wrong, but here we know that when the max in
 seconds is reached, the max in a significantly higher resolution is
 exceeded.
 
 The bug was smaller (< 1 usec, thus not observable) when it was
 originally implemented in rev.1.58 of kern_synch.c, since p_cpulimit
 was in microseconds then.  Then the comparision of seconds still used
 ">=", but was only reached if the comparison of microseconds gave ">".
 
 Related bug: sys/resource.h says that RLIMIT_CPU gives the "cpu time in
 milliseconds", but it actually gives the _maximum_ CPU time in _seconds_.
 The man page and POSIX agree that it is in seconds but don't say if the
 comparison must or can be done at a higher resolution.
 
 Bruce


More information about the freebsd-bugs mailing list