IDE(CompactFlash), usb-storage の上に ext2, ext3, jfs , xfs のいずれを使っても mount して実行属性のあるファイル実行すると落ちる。 2,3回リトライすると実行できる。 カーネルのconfigで、CPUキャッシュモードを write back から write through に変更すると不具合は起きない。 ただし write throughだとwrite backに比べてパフォーマンスが3割くらい落ちる。私の推測だが、block device からデータを読むときはデータとして扱うので dcache(データキャッシュ)に入る。これが write back モードだと dirty のまま dcache に残り(メインメモリに書き出されず)、次に命令として実行したときに icache(命令キャッシュ)はメインメモリからフィルするので dcacheとicacheの間のコヒーレンシが保っていないのが原因ではないだろうか。 sh-linuxのメーリングリストでpaulさんが2010/12/3にそれっぽいことを書いていた。それでどうやら最新カーネルでは直ったようなので、不具合がどこで起きているかまず調べた。
linux-2.6.15 大丈夫実績あり linux-2.6.24 大丈夫実績あり linux-2.6.32 発生する linux-2.6.37-rc3 発生する linux-2.6.37-rc4 発生する linux-2.6.37-rc5 大丈夫?というわけで linux-2.6.37-rc4 と -rc5 の間で直っている。
変更前 0(デフォルト) clean状態 1 PG_dcache_dirty状態 変更後 0(デフォルト) dirty状態 1 PG_dcache_clean状態デフォルトを dirtyとした。プログラム中の論理を反転。