LinuxカーネルのIRQをめぐる大論争

今回は普段のカーネルハッキングの話題ではなく、IRQ論争勃発の特別レポートをお届けする。本題に入る前に、PC上のデバイスが、ハードウェア的にはプロセッサに対して、ソフトウェア的にはカーネルに対して、何らかの処理を要求すると、何が起こるかの一例を挙げておこう。デバイスは何らかの処理が必要なことをプロセッサに通知するために、適当な割り込み要求(Interrupt ReQuest、略してIRQ)をオンにする。カーネルは、この要求を満たすことで仕事を処理し、その後IRQを再びオフにする、といった具合だ。

最近、Linuxカーネルメーリングリスト(Linux Kernel Mailing List:LKML)では、デバイスそのものにIRQをオフにする制御を許可するかどうかについて、議論が盛り上がっている。クローズドソースのドライバをもっと容易にカーネルとやりとりできるようにしたいと考える人々は、この機能の実現を望んでいる。だがTorvalds氏は、断固としてこれに反対している。バイナリblob対GPLという図式の再来となるわけだが、両者の対立点は1つではない。この論争は、一部の人々にとっては技術的なものだが、他の人々にとっては思想的なものだ。そのため議論は、オープンソース/フリーソフトウェアのコミュニティにまで及んでいる。

SUSEのベテラン・カーネルハッカーであるGreg Kroah-Hartman氏が、あるパッチをカーネルのバージョン2.6.19に投稿したことで、論争に火が点いた。Torvalds氏が、このパッチを自らのカーネルに採用することを拒んだのだ。ただしこのパッチは、ここしばらくの間、Andrew Morton氏のカーネルツリーに入ったままになっている。

Torvalds氏は拒否の理由を次のように説明している。

どうか削除してもらいたい。

IRQの問題は決してユーザ空間に解決させてはならないのだ!

非常に簡単なことだ。IRQハンドラは完全にカーネル空間内に存在しなければならない。ユーザ空間を巻き込むなど、もってのほかである。

Linus(Torvalds氏)はその後の電子メールで展開した意見のなかで、次のように述べている。「こうしたことが行われることに不当に反対するわけではないが(すでにUSBデバイスではそれを許している)、そのためには、ドライバのオープンソース化を回避する方法を探している忌まわしい一部のベンダーではなく‘我々’の役に立つ、という確かな理由が存在しなければならない」

Torvalds氏がパッチを拒否し、そうした現実世界の実例を求めたことを踏まえて、Kroah-Hartman氏はLKML宛てに次のようなメッセージを送っている。

このところ、非常に多くの人々の関心を集めているのが、ユーザ空間の入出力ドライバのコアで、ある種のハードウェアを操作するコードをユーザ空間の各種ドライバに書けるようにするものです。

このUIOコアは現在動作していて、-mmリリースに含まれています。LKMLに最後にパッチが投稿されたときから書き直しが行われているため、かなりシンプルなコアになっています。また、必要な文書がすべて含まれているほか、ドライバのサンプルと、それらのドライバをテストするユーザ空間のプログラムのサンプルが2点ずつ用意されています。

しかし、このコアをカーネルツリーに入れるには、それを利用する「本物の」ドライバの開発が必要になります。したがって、このコアのカーネルツリーへのマージを求める誰もにとって、今こそが一歩踏み出してこうしたドライバインタフェースを必要とするハードウェア用にパッチを投稿するタイミングです。

そうしたドライバが登場しなければ、このインタフェースがカーネルツリーに受け入れられるチャンスは極めて小さくなるでしょう。

これ以降、この論争はバイナリblob対GPLという、より大きな問題に発展してしまった。その後、LKMLで起こった議論には、1年後には一切のバイナリblobの存在を許さない旨の通達を出すことによって、そうしたバイナリをカーネルからすべて除去しようという提案が含まれていた。1年あれば、バイナリblobの開発者もGPLに従うデバイスドライバを開発できるだろうという考えだ。そうしたblobの例が、クローズドソースのドライバとしてよく知られているNvidiaドライバである。これはNvidiaの3Dグラフィックカードの機能を最大限にLinuxユーザに提供するものだ。