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

Index
Linux Kernel Watch 10月版
 カーネルのビルドエラーで責任者がクビに!?
  Page 1
 2.6.19大規模マージ計画始動
 git-tar-treeの脆弱性にご用心
 強気のLinus「IRQ=0」を主張
 レジスタを利用 percpuの最新動向
Page 2
 バグ発見の鍵は利用者の絶対数にあり
 責任者はクビ? stableビルドエラー騒動

連載 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カーネルの開発体制などについて伺った

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間