Linux v0.1の残骸を一掃:35年越しの「春の大掃除」
Linuxカーネルの深部に、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)の周波数をもとにタイマー割り込みの間隔を制御していた。
しかしLinuxがx86以外のアーキテクチャに広がると、状況は変わった。コアコードを変更しないために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ファイルに散らばった残骸の規模を見ると、その慣性がどれほど強かったかがわかる。
地味で、大きい。だが誰かがやらなければ、永遠に終わらない類の仕事だ。
参照元
関連記事
- トーバルズ、Linux 7.0来週リリースへ rc7で最終確認
- Valve開発者、LinuxのVRAM管理を根本から修正
- 悪意あるUSBを検出するLinuxカーネルドライバが登場
- Linux 7.1、37年間続いたi486サポートに幕を下ろす
- Linux 7.0でPostgreSQL性能半減、修正困難か
- Gentooのエイプリルフールがガチだった件──36年越しのカーネルが動く
- BUS1がRustで復活──LinuxカーネルIPC再挑戦
- Metaが暴いた/proc/interruptsの隠れたボトルネック
- Linux 7.0-rc6直前、EXT4に異例の大量バグ修正が投入された
- Framework「パソコンは終わった」宣言の真意と次世代イベント