10月版 カーネルのビルドエラーで責任者がクビに!?
上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2006/10/27
バグ発見の鍵は利用者の絶対数にあり
「ssh経由で/dev/zeroの中身を転送していると、時々データがおかしくなる」とBenjamin Herrenschmidtから報告がありました。最高速度で転送しているときには問題なく、sshで転送しているときだけ発生するそうです。この現象はpowerpc64アーキテクチャで発生するtg3ネットワークカードドライバの問題のようでした。しかし、さらに調査したところ、もっと一般的な問題が浮き彫りになりました。
tg3ドライバは、MMIO(memory-mapped I/O:メモリに割り当てしたI/O)を活用してCPUからネットワークカードへのデータ転送を実現しています。MMIOはメモリ空間にデバイスのレジスタ書き込みをマッピングして、「特定のメモリアドレスへの書き込み命令」を「デバイスのレジスタへの書き込み命令」として処理するというモデルです。
Linuxカーネル内で、実際にMMIOを利用して書き込みを行うwritel()関数が今回の問題を引き起こしていたようです。メモリに転送用のデータを書き込んだ後に、writel()でDMA転送を開始するように指示したところ、まだメモリに書き込み結果が反映されていない状態であるにもかかわらずDMA転送が開始され、書き込み前のデータがネットワーク経由で転送されたのです。
Linusによると、x86はMMIOと通常のメモリ書き込みの間で、書き込み順序を保証するアーキテクチャであるため問題が発現しない。しかし、powerpc64などのアーキテクチャでは明示的に同期を取らないと順序が保証されないため、問題を引き起こす可能性があるようです。
writel()の書き込み後処理にはメモリバリアがありますが、書き込み前処理にはメモリバリアがありません。メモリバリアをwritel()の書き込み前処理にも追加すれば、メモリ書き込みの順序の完全性が保証されます。しかし、writel()の書き込み前後処理両方にメモリバリアを追加するとパフォーマンスが犠牲になります。Benjamin Herrenschmidtは、「カーネル2.4のときにはpowerpcのwritel()に同期処理が入っていたが、2.6になってから同期処理を外しており、順次ドライバ側を直している」と報告しました。
「x86では正常に動作するが、powerpc64とia64でデバッグすると見つかるバグは、世の中に存在する利用者の絶対数から考えて、見つからない可能性が多い。テストのカバレッジを考えると問題だ」とDave Millerは指摘しました。
この問題を周知させるため、ドキュメントの準備・整理が行われました。しかし、それだけでは対応し切れないので「デフォルトのバージョンはwritel()の書き込み前後処理にメモリバリアを追加した低速版。writel()の書き込み後処理にのみメモリバリアを追加した高速版の2つを準備しよう」とJeff Garzikが提案しました。
責任者はクビ? stableビルドエラー騒動
Greg KHたちによる9月のリリースは、9月8日の2.6.17.12と2.6.17.13だけです。
2.6.17.13がリリースされたのは、「2.6.17.12がビルドできないというエラー」が発生したためです。Greg KHは2.6.17.13のリリースメールで、「We are very sorry for the mistakes that happened with the .12 release, and those responsible have been sacked.(.12リリースにミスがあり申し訳ありません。責任者はクビにしました)」と記載。冗談はともかく、-stableツリーに関しては、ビルドがきちんと通るよう最低限確認してからリリースするべきでしょう。
一方のAdrian Bunkは、ゆったりとしたペースながらも2.6.16系列のリリースを続けています。「2.6.16.30-pre1で新しいデバイスをサポートしたV4L/DVBドライバをマージする」というメールを出し、新しい機能を追加すべきか否かでGreg KHと議論が起きました。Adrian Bunkは「既存のドライバに影響がないならデバイスのサポートを追加するのは問題ない」と説明しましたが、2.4カーネルのメンテナンスをしているWilly Tarreauは「機能をできるだけ追加しない方が安定して維持しやすくなる」と反対しました。今後どう流れていくのか気になるところです。
- 2.6.16.29(9月2日)
・ネットワーク関連の修正
・VIAのIDEのPCI IDの追加
・ALSA の各種修正
・ext3:NFS経由で不正なファイルハンドルを与えられたときにext3_errorを発動しないように修正
・SCTPの各種問題の修正
など34パッチ
- 2.6.17.12(9月8日)
・sky2のバグ修正
・dmの修正
・VIAのIDEのPCI IDの追加
など36パッチ - 2.6.17.13(9月8日)
・idr_replace
・VIAのIDEのPCI IDの追加
以上、2パッチ
2/2 |
|
|
||||
|
連載 Linux Kernel Watch |
Linux Squareフォーラム Linuxカーネル関連記事 |
連載:Linux Kernel Watch(連載中) Linuxカーネル開発の現場ではさまざまな提案や議論が交わされています。その中からいくつかのトピックをピックアップしてお伝えします |
|
連載:Linuxファイルシステム技術解説 ファイルシステムにはそれぞれ特性がある。本連載では、基礎技術から各ファイルシステムの特徴、パフォーマンスを検証する |
|
特集:全貌を現したLinuxカーネル2.6[第1章] エンタープライズ向けに刷新されたカーネル・コア ついに全貌が明らかになったカーネル2.6。6月に正式リリースされる予定の次期安定版カーネルの改良点や新機能を詳しく解説する |
|
特集:/procによるLinuxチューニング[前編] /procで理解するOSの状態 Linuxの状態確認や挙動の変更で重要なのが/procファイルシステムである。/procの概念や/procを利用したOSの状態確認方法を解説する |
|
特集:仮想OS「User
Mode Linux」活用法 Linux上で仮想的なLinuxを動かすUMLの仕組みからインストール/管理方法やIPv6などに対応させるカーネル構築までを徹底解説 |
|
Linuxのカーネルメンテナは柔軟なシステム カーネルメンテナが語るコミュニティとIA-64 Linux IA-64 LinuxのカーネルメンテナであるBjorn Helgaas氏。同氏にLinuxカーネルの開発体制などについて伺った |
|
|
- 【 pidof 】コマンド――コマンド名からプロセスIDを探す (2017/7/27)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、コマンド名からプロセスIDを探す「pidof」コマンドです。 - Linuxの「ジョブコントロール」をマスターしよう (2017/7/21)
今回は、コマンドライン環境でのジョブコントロールを試してみましょう。X環境を持たないサーバ管理やリモート接続時に役立つ操作です - 【 pidstat 】コマンド――プロセスのリソース使用量を表示する (2017/7/21)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、プロセスごとのCPUの使用率やI/Oデバイスの使用状況を表示する「pidstat」コマンドです。 - 【 iostat 】コマンド――I/Oデバイスの使用状況を表示する (2017/7/20)
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、I/Oデバイスの使用状況を表示する「iostat」コマンドです。
|
|