Re: powerpc64 head -r344018 stuck sleeping problems: th->th_scale * tc_delta(th) overflows unsigned 64 bits sometimes [patched failed]
Mark Millard via freebsd-ppc <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.ppc,gmane.os.freebsd.devel.hackers |
|---|---|
| Message-ID | <[email protected]> |
A basic question and a small note.
Question's context for it tc->tc_get_timecount(tc) values:
In the powerpc64 context tc->tc_get_timecount(tc) is the lower
32 bits of the tbr, in my context having a 33,333,333 MHz or so
increment rate for a machine with a 2.5 GHz or so clock rate.
The truncated 32 bit tbr value wraps every 128 seconds or so.
2 sockets, 2 cores per socket, so 4 separate tbr values.
The question is . . .
In tc_delta's:
tc->tc_get_timecount(tc) - th->th_offset_count
is observing tc->tc_get_timecount(tc) < th->th_offset_count
ever supposed to be possible in correct operation, other than
tc->tc_get_timecount(tc) having wrapped around (and so being
newly 0 or "near" 0, no evidence of of having it having been
near 128 seconds or more for my context)?
The note:
On 2019-Mar-7, at 14:22, Konstantin Belousov <[email protected]> wrote:
> . . .
> +
> + if (__predict_false(delta < large_delta)) {
I thought that delta<large_delta was the non-overflow context
for scale*delta and that the overflow case for the multiplication
was when delta>=large_delta .
> + /* Avoid overflow for scale * delta. */
> + x = (scale >> 32) * delta;
> + bt->sec += x >> 32;
> + bintime_addx(bt, x << 32);
> + bintime_addx(bt, (scale & 0xffffffff) * delta);
> + } else {
> + bintime_addx(bt, scale * delta);
> + }
> . . .
===
Mark Millard
marklmi at yahoo.com
( dsl-only.net went
away in early 2018-Mar)
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-ppc
To unsubscribe, send any mail to "[email protected]"