Linux v0.1の残骸を一掃:35年越しの「春の大掃除」

Linuxカーネルの深部に、35年前のコードがまだ息をしていた。それを掘り起こした開発者が、ようやくシャベルを手に取った。

Linux v0.1の残骸を一掃:35年越しの「春の大掃除」

Linuxカーネルの深部に、35年前のコードがまだ息をしていた。それを掘り起こした開発者が、ようやくシャベルを手に取った。


v0.1から生き延びた「化石」が消える

Linuxカーネルのタイムキーピング基盤に、Linux v0.1時代のコード残骸がいまだに残っている。タイマーサブシステムのメンテナであるトーマス・グライクスナーが2026年4月10日に投稿した38件のパッチシリーズは、その事実を突きつけた。

対象は3つ。LATCH、CLOCK_TICK_RATE、そしてget_cycles()。いずれもLinuxカーネルの時刻管理に関わる定義や関数で、かつてはシステムの心臓部だった。だが今は、意味を失ったまま放置された「歴史的遺物」にすぎない。

グライクスナーはカーネルのx86アーキテクチャ、割り込みサブシステム、タイマーサブシステムを統括するメンテナであり、リアルタイムプリエンプション(PREEMPT_RT)プロジェクトの責任者でもある。

パッチシリーズ全体で146ファイルに手が入り、622行が追加され796行が削除される。差し引き174行の純減。コードが減るパッチは、たいてい良いパッチだ。

LATCHという名の時間旅行

最も古い残骸がLATCHだ。この定義はLinux 0.1にまでさかのぼる。当初はx86のPIT(Programmable Interval Timer)の周波数をもとにタイマー割り込みの間隔を制御していた。

しかしLinuxx86以外のアーキテクチャに広がると、状況は変わった。コアコードを変更しないためにCLOCK_TICK_RATEという別の定義が導入され、LATCHはそれに依存する形で「柔軟」にされた。問題は、その柔軟性がとっくに不要になっていたことだ。

20年以上前にタイマーとタイムキーピングのインフラが全面的に書き直され、LATCHもCLOCK_TICK_RATEも実質的な役割を終えた。それでもコードは残り続けた。arch/x86/kernel/apm_32.cには、1995年12月のLinux 1.3.46にさかのぼるファイルがまだ存在しているという。

LATCHの定義はLinux 0.1から今日まで生き延びてきた。だが「正しい理由」で生き残ったわけではない、とグライクスナーは指摘する。

誰も触らなかったから消えなかった。それだけの話だ。

get_cycles()の皮肉な運命

3つ目のターゲットであるget_cycles()には、もう少し複雑な歴史がある。

この関数はLinux 2.1.133pre4(1998年12月)で導入された。当時登場したばかりのTSC(Time Stamp Counter)を利用するためだったが、導入直後から問題を起こした。TSCを持つCPUを搭載したi386 SMP環境以外では、ほぼすべてを壊したのだ。数日以内に空のスタブとifdefで応急処置が施された。

グライクスナーが面白がっているのは命名の矛盾だ。TSCは「Time Stamp Counter」の略だが、名付け親は意図的に「Cycle Counter」とは呼ばなかった。にもかかわらず、実際にはCPUコアと同じ固定周波数で動いていた。名前と実態が最初からずれていたのだ。

その後、CPUが省電力のために周波数を動的に変えるようになると、TSCは「可変周波数の乱数生成器」と化した。さらに時代が進み、CPU設計者が「TSCはCPUの公称周波数で一定に動作する」と定め、ようやく信頼できるタイムキーピングに使えるようになった。

get_cycles()は名前こそ「CPUサイクルへのアクセス」を示唆するが、実際にはほとんどのアーキテクチャで未実装のカウンターに対して0を返すだけだった。

2004年から2005年にかけてタイムキーピングサブシステムが全面改修され、get_cycles()はほぼ不要になった。だが「一部の人」にとっては消したくない存在だったらしく、todoリストに載りながらも放置されてきた。

デバッグやテストコードでの利用が細々と続いた。BogoMIPSの「友達に自慢する」printk出力に至っては、get_bogo_cycles()に改名すべきだったとグライクスナーは皮肉る。「本当の解決策は、bogosityの増殖をやめて全部まとめて取り除くことだ」と。

大掃除の中身

パッチシリーズは8つのステップで構成されている。ヘッダ依存関係の整理、LATCHの削除、CLOCK_TICK_RATEの削除、cycles_tの統合、get_cycles()の利用箇所のクリーンアップ、random_get_entropy()の分離、asm/timex.hの除去と、段階的に進む。

影響範囲は広い。ARM、ARM64、MIPS、PowerPC、RISC-V、s390、SPARC、x86など主要アーキテクチャのすべてに変更が及ぶ。暗号サブシステムやネットワークドライバ(arcnet)にも手が入る。

ヘッダ依存関係の掃除では、見過ごされていた問題も発掘された。ARM64やMIPSがasm/timex.hへの暗黙の依存でコンパイルを通していたという、ビルドシステムの「奇跡」が明るみに出た。壊れていなかったから気づかなかっただけで、構造としては綱渡りだった。

このシリーズはv7.0-rc7に適用可能で、-nextブランチとのコンフリクトもわずかだとされている。hexagonとnios2を除く全アーキテクチャでコンパイルテストを通過済みだ。

なぜ今なのか

Linux 7.0の安定版リリースが2026年4月12日もしくは19日に迫っている。このパッチシリーズ自体はLinux 7.1のマージウィンドウに向けたものだろう。グライクスナーが先月のHRTICK最適化パッチ(48件)に続いてタイマー周辺の大規模整理を進めている流れの一環だ。

35年分のコード残骸を一掃するのに、技術的な障壁はほとんどない。あったのは「誰かがやるまで誰もやらない」という慣性だけだ。146ファイルに散らばった残骸の規模を見ると、その慣性がどれほど強かったかがわかる。

地味で、大きい。だが誰かがやらなければ、永遠に終わらない類の仕事だ。


参照元

関連記事