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

Reply via email to