powerpc64 head -r344018 stuck sleeping problems: th->th_scale * tc_delta(th) overflows unsigned 64 bits sometimes [patched failed]
Konstantin Belousov
kostikbel at gmail.com
Thu Mar 14 19:39:56 UTC 2019
On Thu, Mar 07, 2019 at 05:29:51PM -0800, Mark Millard wrote:
> 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)?
I think yes, there is no reason for current get_timecount() value
to have any arithmetic relation to th_offset_count. Look at tc_windup()
on how the th_offset_count is calculated. The final value is clamped
by the tc_counter_mask, so only lower bits are important (higher bits
are evacuated to th_offset or lost due to overflow if tc_windup()
was not called soon enough).
>
>
> The note:
>
> On 2019-Mar-7, at 14:22, Konstantin Belousov <kostikbel at gmail.com> 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 .
You are right, I fixed this in my repo.
>
> > + /* 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)
More information about the freebsd-ppc
mailing list