トップ «前の日記(12/20/2009) 最新 次の日記(12/26/2009)» 編集

本 日 の h o g e

hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。

更新情報の取得には rdflirs を使ってもらえると嬉しいです.


12/23/2009 うーむ [長年日記]

tDiary 2617日目

[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 か.