I believe that spl() protection is required here, in fact, that it should
be extended to cover the read of p->p_runtime as well. These are all 64
bit integers, so on IA32, the worst case is two consecutive off-by one
reads during overflow - i.e reading 0xffffffff 0x00000002 instead of
0x00000000 0x00000002. That is a rather significant difference, and since
the numbers used in computation here become part of a kassert() later, a
rather dangerous one. Alternatively, a 64 bit atomic read could be used.
On FreeBSD-current, this entire operation is protected by a mutex, which
looks safe to me, but in 4.1, this looks like a bug:
void
calcru(p, up, sp, ip)
struct proc *p;
struct timeval *up;
struct timeval *sp;
struct timeval *ip;
{
/* {user, system, interrupt, total} {ticks, usec}; previous tu: */
u_int64_t ut, uu, st, su, it, iu, tt, tu, ptu;
int s;
struct timeval tv;
/* XXX: why spl-protect ? worst case is an off-by-one report */
s = splstatclock();
ut = p->p_uticks;
st = p->p_sticks;
it = p->p_iticks;
splx(s);
tt = ut + st + it;
if (tt == 0) {
st = 1;
tt = 1;
}
tu = p->p_runtime;
"A plague upon all your houses" - last words of Waldo Semon
To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message