GPU切替テスト障害ポストモーテム

概要

2026-09-13、MacBookPro11,5上のOmarchyで、vga_switcheroo を使ってAMD dGPUからIntel iGPUへ一時的に切り替える試験を実施した。iGPUへの切替とAMD dGPUの停止には成功したが、90秒後の自動復旧でAMD dGPUを再開できなかった。画面表示とsystemd関連処理が停止し、最終的に電源ボタン長押しによる再起動が必要になった。

再起動後はAMD dGPUが表示担当へ戻り、systemd、SDDM、Hyprlandは正常に稼働した。失敗中のsystemd unitとファイルシステム破損を示すログはなかった。OSの再インストールは不要だった。

この障害を受け、現在のカーネルと amdgpu の組み合わせでは、稼働中の vga_switcheroo によるGPU往復切替を使用しない。今後iGPU運用を検討する場合は、起動前に表示担当を選ぶ方式を別途調査する。

関連する事前調査は OmarchyでのiGPUとdGPU運用の検討 を参照。

影響

  • 内蔵画面が暗転したまま復旧しなかった
  • SDDMは起動を試みたが、Wayland compositorが繰り返しタイムアウトした
  • GPU状態の読み取り、復旧スクリプト、systemctl status が応答しなくなった
  • pam_systemd_home がsystemdのユーザー情報を取得できず、SSH経由の新しいsudo認証も停止した
  • SSH接続と基本的なユーザープロセスは動作していた
  • 約17分後、電源ボタン長押しで再起動した

対象環境

  • 機種: Apple MacBookPro11,5
  • OS: Omarchy 4.0.3-1
  • Kernel: 7.2.3-arch1-3
  • iGPU: Intel Iris Pro 5200、i915
  • dGPU: AMD Radeon R9 M370X、amdgpu
  • GPU切替: apple_gmuxvga_switcheroo
  • Display manager: SDDM
  • Wayland compositor: Hyprland

時系列

時刻 事象
10:53 最初の手動切替を試行。AMD HDMI音声をWirePlumberが使用しており、client 101 refused switch で拒否された
10:54 予約した自動復旧が動作し、AMD表示とHyprlandへ正常に戻った
11:04:23 改良したテストスクリプトをTTYから実行。SDDMとWirePlumberを停止し、AMD音声デバイスが解放されたことを確認した
11:04:23 IGD を書き込み。AMD音声が無効になり、amdgpu ... switched off を記録した
11:04:27 vga_switcheroo の状態確認が正常終了した
11:06:16 90秒後の復旧処理が DIS を書き込み、AMD dGPUの再開を開始した
11:06:16 AMD GPUをD3hotおよびD3coldからD0へ遷移できず、デバイスへアクセスできないと記録した
11:06:36 AtomBIOS処理が20秒以上ループし、amdgpu asic init failed となった
11:06:38 ring gfx test failed (-110)amdgpu_device_ip_resume failed (-110) を記録した
11:06:38 SDDMを起動したが、GPU復旧前だったため画面表示は戻らなかった
11:06:41 AMD GPU resetが -22 で失敗し、GPU Recovery Failed を記録した
11:10以降 AMD reset workqueueが122秒、245秒、368秒、491秒、614秒以上停止していると繰り返し報告された
11:21頃 電源ボタン長押し後に再起動した
11:21以降 AMD dGPUを表示担当として正常起動。失敗中のsystemd unitは0件だった

技術的な原因

直接の失敗は、停止したAMD dGPUを vga_switcheroo で再開するときに、PCI電源状態をD3coldからD0へ戻せなかったことである。amdgpu はその後AtomBIOSによる初期化、graphics ringの検査、GPU resetを順に試みたが、いずれも完了しなかった。

Unable to change power state from D3cold to D0, device inaccessible
atombios stuck in loop for more than 20secs
amdgpu asic init failed
ring gfx test failed (-110)
amdgpu_device_ip_resume failed (-110)
GPU Recovery Failed: -22

ログから確定できるのは、AMD dGPUの電源再開と再初期化が失敗したことまでである。R9 M370X固有の制約、amdgpu、Apple gmux、Kernel 7.2.3のどの実装が根本原因かは特定していない。

被害を拡大した条件

復旧処理が同じ切替機構に依存していた

自動復旧は、90秒後に同じ vga_switcherooDIS を書き込む設計だった。iGPU切替に失敗する場合には有効だが、dGPUの再開処理自体が停止すると復旧処理も停止する。障害箇所と復旧経路が分離されていなかった。

書き込み完了を復旧成功として扱った

復旧スクリプトは DIS の書き込み後にSDDMを起動したが、AMD GPUがD0へ戻り描画できることを確認していなかった。実際にはAMDの初期化が失敗したままSDDMが起動し、Wayland compositorの起動失敗を繰り返した。

SSHからの管理操作にもsystemdとPAMを使用した

SSH自体は動作していたが、systemd側の処理停止が pam_systemd_home に波及した。新しいsudo認証は Transport endpoint is not connected となり、GPU状態の読み取りやSysRqによる再起動をroot権限で実行できなかった。

機能した対策

  • 最初の試行ではWirePlumberがAMD音声デバイスを保持していることをカーネルが検出し、切替を拒否した
  • 二回目の試行では、SDDMとWirePlumberを停止することでiGPU切替まで到達できた
  • SSH接続が残っていたため、カーネルログと停止プロセスを確認できた
  • 強制再起動後、EFIの表示設定はAMDのまま維持され、通常構成へ戻った
  • 再起動後の確認では、systemd、SDDM、Hyprland、両GPUドライバに継続障害がなかった

再発防止策

決定済み

  • Kernel 7.2.3と amdgpu で、稼働中に IGDDIS を往復する試験は行わない
  • ~/gpu-switch-test/run-test.shswitch-integrated.shrestore-discrete.sh は再実行しない
  • iGPU運用の次の候補は、EFIまたはブート時に表示担当を選び、起動後にdGPUを再開しない方式に限定して調査する

未実施

  • 危険なGPU切替スクリプトを実行不能にする
  • ブート時iGPU選択の復旧手順を、実機変更前に設計する
  • 外部ディスプレイ、別の起動エントリ、SSH以外のroot復旧経路を準備する
  • Kernelまたは amdgpu の既知問題と、R9 M370Xで安全に使える構成を調査する

今回得られた判断材料

iGPUへの切替は成功したため、Intel GPU、gmux、内蔵パネル切替の存在は確認できた。一方、AMD dGPUを停止したあと同じブート内で再開する操作は、この環境ではシステム停止につながる。

したがって、今後検討する「通常はiGPU、必要時だけdGPU」という運用は、macOSのような実行中の往復切替を前提にできない。iGPU固定、または再起動を境界とするGPU選択として設計し直す必要がある。

参照