1月版 Linusのクリスマスプレゼントが引き起こした問題


上川純一
日本ヒューレット・パッカード株式会社
コンサルティング・インテグレーション統括本部
2008/1/31

linux-kernelメーリングリスト(以下LKML)かいわいで起きるイベントを毎月お伝えする、Linux Kernel Watch。2007年12月のLKMLでどんなことが起きたのか見てみましょう。

Linusにとって「クリスマス休暇」とは

 Linusいわく、「クリスマス休暇は、くだらない『本当の仕事』から離れて、24時間カーネルハックに時間を割ける期間のことだよ、ねぇ」だそうです。

 Linusは12月21日に、クリスマスの休暇前のあいさつとして2.6.24-rc6をリリースしました。彼はその時点では楽観的で、リグレッションも減っているし、1月の上旬には2.6.24をリリースできるはずだといっていました。ただしそれには条件があって、「食べ過ぎで誰も何も作業できなかったということが起きなければ」だそうです。

編注:予告よりは若干遅れましたが、米国時間の1月24日に無事にバージョン2.6.24がリリースされました。

 Zhang YanminとKyle Martinはこのメールへの返事で、2.6.23カーネルに対してパッチがうまく適用できないことを報告しました。またこれとは別の現象として、どうやらdrivers/video/mbx/reg_bits.hの一連の定義が二重になされているようで、これもおかしいと報告されました。

/* DINTRS - Display Interrupt Status Register */
#define DINTRS_CUR_OR_S (1 << 18)
#define DINTRS_STR2_OR_S (1 << 17)
#define DINTRS_STR1_OR_S (1 << 16)
#define DINTRS_CUR_UR_S (1 << 6)
#define DINTRS_STR2_UR_S (1 << 5)
#define DINTRS_STR1_UR_S (1 << 4)
#define DINTRS_VEVENT1_S (1 << 3)
#define DINTRS_VEVENT0_S (1 << 2)
#define DINTRS_HBLNK1_S (1 << 1)
#define DINTRS_HBLNK0_S (1 << 0)

/* DINTRE - Display Interrupt Enable Register */
#define DINTRE_CUR_OR_EN (1 << 18)
#define DINTRE_STR2_OR_EN (1 << 17)
#define DINTRE_STR1_OR_EN (1 << 16)
#define DINTRE_CUR_UR_EN (1 << 6)
#define DINTRE_STR2_UR_EN (1 << 5)
#define DINTRE_STR1_UR_EN (1 << 4)
#define DINTRE_VEVENT1_EN (1 << 3)
#define DINTRE_VEVENT0_EN (1 << 2)
#define DINTRE_HBLNK1_EN (1 << 1)
#define DINTRE_HBLNK0_EN (1 << 0)
問題となった「drivers/video/mbx/reg_bits.h」の重複していた部分

 どうやらこれは、パッチがうまく適用されていないようだ……ということで、調査が進みました。どうも、git-diffで出力されるcontext diffのcontextが足りないようです。

 結果として、Linusはgit-diffの最適化に課題があったことを報告しました。

 git-annotateというツールでは、ソースコードのどの部分がどのパッチによって修正されたのかを確認することができます。2.6.24-rc6では、git-annotateを高速化するための一連の修正が行われました。その中で、高速化のためにgit-diffのcontextを少し省略するような処理を入れ込んでいたのですが、この影響で、パッチが十分にコンテキストを持たないという事態が発生したようです。

 この影響で、GNU patchなどでうまくパッチが適用できなかったり、不正に適用されたりする結果となりました。とはいえ、大きな被害が発生する前に迅速に問題が発見されて何よりです。

参考:
参考 Gitの修正パッチ
Re(-re)*fix trim_common_tail()
http://git.kernel.org/?p=git/git.git;a=commit;h=d2f82950a9226ae1102a7a97f03440a4bf8c6c09

Andrew Mortonからのプレゼントにも「ワナ」が

 一方、Andrew Mortonも活発に活動しており、12月13日に2.6.24-rc5-mm1をリリースしました。これには多くのフィードバックが返ってきたようです。

 その後、彼は休暇に入るということで、その前の12月23日に2.6.24-rc6-mm1をリリースしました。しかし、このリリースには1つ特徴的な問題が残っていました。何と、その時点でのgit-x86ツリーの問題により、i386アーキテクチャでは起動時にoopsしてしまうというのです。

 Ingo Molnarがすぐにこの投稿に反応し、十数時間後には「x86-fix-system-gate-related-crash.patch」という名前のパッチがhot-fixesディレクトリで公開されました。しかし、最も一般的に使われているアーキテクチャおよびバージョンでoopsするという問題だったため、多くの人が影響を受けたようです。

参考:
参考 Andrew Mortonの2.6.24-rc6-mm1リリース
http://www.kernel.org/pub/linux/kernel/people/akpm/patches/2.6/2.6.24-rc6/2.6.24-rc6-mm1/

ramdiskへの再挑戦:rdドライバを書き直す

 Nick Pigginは「[patch] rewrite rd」というメールでramdiskドライバ(rdドライバ)の書き換えを提案しました。

 ramdiskはメモリ上にブロックデバイスを作成するもので、昔は、一時的なファイルシステムであるinitrdなどのために利用されていました。しかし最近は、メモリ上でファイルシステムを使うのであればramfsやtmpfsなどを利用するのが主流で、initrdもinitramfsに移行してしまいました。この結果、ramdiskの存在感は薄くなっています。

 Nickはメールの中で、ramdiskドライバを書き直す理由をいくつか挙げました。その1つとして「ramdiskの設計は古く、一部dirty flagに依存する部分があったために、メモリ負荷が高い場合の挙動がおかしかった。そのため、10月ごろに発生したバグを修正した」ということを指摘していました。

 Nick Pigginは、そんなramdiskドライバを再設計することで、新しい風を吹き込もうとしたのです。

 Andrew Mortonは、既存のドライバではhighmemは使えないが、このバージョンでは使えるようになるということで、この提案を歓迎しました。

 さらに、Nick Pigginが何かもっと面白いことはできないものかと探していたところ、Christian Borntraegerがちらっと、「『XIP』(execute in place)を実装してみたらどうだろう」と提案しました。それを受けてNick Pigginは、早速、RD上にXIP機能を実装しました。

 通常、ファイルシステム上にある実行ファイルはメモリ空間に複製され、それから実行されます。しかし、すでにある実行ファイルがメモリ上にある場合でも、それを別のメモリ領域に複製することになるため、あまり効率が良くありません。

 それをそのまま実行できるようにする仕組みがXIPです。

編注:XIP(execute in place)については、
2005年6月版 ソースコード管理システムgitにライバル出現 も参照。

 XIPは、ディスクデバイスとファイルシステムの両方に追加機能を実装しなければ実現できない仕組みなので、現状では、s390以外ではほぼ使えなかったようです。しかしNick Pigginは各種パッチを投稿し、ext2/ramdiskで利用できるようにしました。そのうえ、いろいろと試してはバグを発見したことも喜々として報告しました。メモリ領域が潤沢にない場合には便利な機能かもしれませんね。

参考:
参考 Linux Kernelのramdiskブロックデバイスのソースコード
drivers/block/rd.c

1/2

Index
Linux Kernel Watch 1月版
 Linusのクリスマスプレゼントが引き起こした問題
Page 1
 Linusにとって「クリスマス休暇」とは
 Andrew Mortonからのプレゼントにも「ワナ」が
 ramdiskへの再挑戦:rdドライバを書き直す
  Page 2
 /dev/randomと/dev/urandomのエントロピー
 -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 記事ランキング

本日 月間