Re: powerpc64 head -r344018 stuck sleeping problems: th->th_scale * tc_delta(th) overflows unsigned 64 bits sometimes [patched failed]
Konstantin Belousov <[email protected]>
| Newsgroups | gmane.os.freebsd.devel.ppc,gmane.os.freebsd.devel.hackers |
|---|---|
| Message-ID | <[email protected]> |
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 <[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 . 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) _______________________________________________ [email protected] mailing list https://lists.freebsd.org/mailman/listinfo/freebsd-ppc To unsubscribe, send any mail to "[email protected]"