hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
12/23/2009 うーむ [長年日記]
■ [Linux] rdtsc とか
随分古い話で,2.6.26 にて修正されているそうだけど.
> This seems to be occurring when the clock source goes slightly
> backwards for a single call. In
> kernel/time/timekeeping.c:__get_nsec_offset(), we have this:
> cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
>
> So a small decrease in time here will (this is all unsigned
> arithmetic) give us a very large cycle_delta. cyc2ns() then multiplies
> this by some value, then right shifts by 22. The resulting value (in
> nanoseconds) is approximately 4398 seconds; this gets added on to the
> xtime value, giving us our jump into the future. The next call to
> gettimeofday() returns to normal as we don't have this huge nanosecond
> offset.
[Re: gettimeofday() jumping into the futureより引用]
これは結局 rdtsc した結果が前回よりも小さかったら delta が巨大になっちゃうよねって話か. gettimeofday() は delta をもにょもにょした値を xtime に加算して返すので,とんでもない値が返ってくる可能性があると.
tsc がオーバーフローしたりマルチコアで tsc sync がうまくいってない場合に起こり得る?
さらっとコード読んでみたら,2.6.28 くらいまで上の cycle_now が次の cycle_last そのものではなくて,cycle_last は加算がされていくだけくさい.cycle_last がオーバーフローした場合も delta が巨大化するんじゃねとも思った.
けど 64bit unsigned がオーバーフローするには 4GHz でも約 150 年? ありえん. やっぱ d8bb6f4c1670c8324e4135c61ef07486f7f17379 の通り tsc sync か.