Translated message

A translation of this page exists in English.

Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

カーネルログに "Page fault caused by firmware" エラーが表示される

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux 7
  • 具体的には、カーネルバージョン kernel-3.10.0-1160.31.1.el7 から kernel-3.10.0-1160.61.1.el7 の 1 つ前のバージョンまでが対象

Issue

  • カーネルログには、EFI ランタイムサービス、ファームウェアのバグ、長時間ブロックされた kworker スレッドなどに関するエラーと警告が表示されます。
  • Intel の imsm RAID コンテナーのアセンブルが mdadm エラーで失敗します。
  • efibootmgr などの EFI 関連のタスクがハングまたは失敗する場合があります。
  • 上記のエラーが記録され、kernel.hung_task_panic sysctl が有効になっている場合、しばらくするとシステムがパニックになることがあります。

Resolution

Root Cause

  • UEFI ランタイムサービスを呼び出すときにカーネルスイッチがスペースを処理する方法の更新により、UEFI ランタイムサービスが無効になり、kworker スレッドが無期限にハングする可能性があるバグが発生しました。
  • UEFI は、あらゆるオペレーティングシステムに役立つさまざまな機能を提供します。この機能は、オペレーティングシステムを適切に起動するために不可欠ですが、システムが完全に起動した後 (一般にランタイムと呼ばれます)、同じ機能が役立つ場合があります。
  • 関数の使用を容易にするコードパスは、上流の Linux カーネルで簡略化され、Red Hat Enterprise Linux にバックポートされました。
  • 簡略化により、カーネルが Translation Lookaside Buffer (TLB) フラッシュを管理する方法にバグが発生しました。これは、ソリューション RHEL7: kernel crashes in leave_mm() with a message "kernel BUG at arch/x86/mm/tlb.c:48!" に記載されています。
  • 上記の修正により、以前の問題は解決されましたが、エッジケースは解決されませんでした。エッジケースは、CPU のメモリーをマップするために使用される現在のメモリー管理構造体の状態の不整合が原因で発生しました。
  • 事実上、不整合により、EFI メモリーがマップされている間に、CPU が TLB 内の通常のメモリーの操作を試みることが可能になりました。これによりページフォールトがトリガーされ (メモリーのアドレスはありますが、実際にはそれを所有していません)、EFI はこのページフォールトから回復します。ただし、EFI がページフォールトを処理する方法が原因で、EFI ランタイムサービスが無効になり、UEFI への作業を管理する kworker スレッドが割り込み不能なスリープ (D) 状態でフリーズします。
  • この修正は、これらの操作を実行するときに CPU の TLB の状態を確立し、不整合を回避する状態によって適切にアクションを実行します。

Diagnostic Steps

  • システムがまだ動作している場合は、dmesg または journalctl -k を介してカーネルリングバッファーをチェックし、次のエラー/警告のいずれかを確認します。

    [   34.313537] WARNING: CPU: 58 PID: 2597 at arch/x86/platform/efi/quirks.c:489 efi_recover_from_page_fault+0x40/0x120
    [   34.313541] [Firmware Bug]: Page fault caused by firmware at PA: 0xfffffffeecb081e7
    [...]
    [   34.313584] CPU: 58 PID: 2597 Comm: kworker/u672:4 Not tainted 3.10.0-1160.36.2.el7.x86_64 #1
    [   34.313603] Workqueue: efi_rts_wq efi_call_rts
    [...]
    [   34.313787] efi: Froze efi_rts_wq and disabled EFI Runtime Services
    [...]
    [   34.313854] efi: EFI Runtime Services are disabled!
    
    • 以下は、問題が発生した dmesg からの例になります。

      [   11.004945] ------------[ cut here ]------------
      [   11.004961] WARNING: CPU: 38 PID: 5 at arch/x86/platform/efi/quirks.c:489 efi_recover_from_page_fault+0x40/0x120
      [   11.004964] [Firmware Bug]: Page fault caused by firmware at PA: 0xfffffffeeca13c7f
      [   11.004966] Modules linked in: wdat_wdt pcspkr ipmi_ssif joydev sg i2c_i801 lpc_ich mei_me mei ipmi_si ipmi_devintf ipmi_msghandler acpi_pad(+) acpi_power_meter(+) ip_tables xfs libcrc32c sd_mod crc_t10dif crct10dif_generic ast igb drm_kms_helper crct10dif_pclmul crct10dif_common crc32c_intel ptp syscopyarea pps_core sysfillrect sysimgblt dca fb_sys_fops nvme i2c_algo_bit ttm nvme_core drm ahci libahci megaraid_sas libata drm_panel_orientation_quirks nfit libnvdimm dm_mirror dm_region_hash dm_log dm_mod fuse
      [   11.005015] CPU: 38 PID: 5 Comm: kworker/u256:0 Not tainted 3.10.0-1160.36.2.el7.x86_64 #1
      [   11.005027] Workqueue: efi_rts_wq efi_call_rts
      [   11.005029] Call Trace:
      [   11.005039]  [<ffffffff84383559>] dump_stack+0x19/0x1b
      [   11.005047]  [<ffffffff83c9b258>] __warn+0xd8/0x100
      [   11.005053]  [<ffffffff83c9b2df>] warn_slowpath_fmt+0x5f/0x80
      [   11.005057]  [<ffffffff83c8c830>] efi_recover_from_page_fault+0x40/0x120
      [   11.005066]  [<ffffffff83c75c86>] no_context+0xb6/0x300
      [   11.005071]  [<ffffffff83c75fe2>] __bad_area_nosemaphore+0x112/0x220
      [   11.005076]  [<ffffffff83c76104>] bad_area_nosemaphore+0x14/0x20
      [   11.005083]  [<ffffffff84390750>] __do_page_fault+0x310/0x500
      [   11.005092]  [<ffffffff83ce8494>] ? find_busiest_group+0x144/0x990
      [   11.005096]  [<ffffffff84390975>] do_page_fault+0x35/0x90
      [   11.005100]  [<ffffffff8438c778>] page_fault+0x28/0x30
      [   11.005107]  [<ffffffff83c7df01>] ? switch_mm_irqs_off+0x21/0x290
      [   11.005111]  [<ffffffff83c7df01>] ? switch_mm_irqs_off+0x21/0x290
      [   11.005116]  [<ffffffff83c7dfe9>] ? switch_mm_irqs_off+0x109/0x290
      [   11.005120]  [<ffffffff83c7dff5>] ? switch_mm_irqs_off+0x115/0x290
      [   11.005123]  [<ffffffff83c7dff5>] ? switch_mm_irqs_off+0x115/0x290
      [   11.005127]  [<ffffffff83c7dfe9>] ? switch_mm_irqs_off+0x109/0x290
      [   11.005131]  [<ffffffff83c7dff5>] ? switch_mm_irqs_off+0x115/0x290
      [   11.005135]  [<ffffffff83c7dfe9>] ? switch_mm_irqs_off+0x109/0x290
      [   11.005139]  [<ffffffff83c7dfe9>] ? switch_mm_irqs_off+0x109/0x290
      [   11.005142]  [<ffffffff83c8daa8>] ? efi_call+0x58/0x90
      [   11.005147]  [<ffffffff83c8ce51>] ? efi_switch_mm+0x31/0x50
      [   11.005152]  [<ffffffff841d4139>] ? efi_call_rts+0x2f9/0x600
      [   11.005161]  [<ffffffff83cbde6f>] ? process_one_work+0x17f/0x440
      [   11.005167]  [<ffffffff83cbef86>] ? worker_thread+0x126/0x3c0
      [   11.005172]  [<ffffffff83cbee60>] ? manage_workers.isra.26+0x2a0/0x2a0
      [   11.005177]  [<ffffffff83cc5e41>] ? kthread+0xd1/0xe0
      [   11.005182]  [<ffffffff83cc5d70>] ? insert_kthread_work+0x40/0x40
      [   11.005188]  [<ffffffff84395df7>] ? ret_from_fork_nospec_begin+0x21/0x21
      [   11.005193]  [<ffffffff83cc5d70>] ? insert_kthread_work+0x40/0x40
      [   11.005196] ---[ end trace 32d18cdf2277bf49 ]---
      [   11.005209] efi: Froze efi_rts_wq and disabled EFI Runtime Services          <<----------
      [   11.006254] ------------[ cut here ]------------
      [   11.006265] WARNING: CPU: 38 PID: 1333 at lib/list_debug.c:53 __list_del_entry+0x63/0xd0
      [   11.006267] list_del corruption, ffffddf083ff0c20->next is LIST_POISON1 (dead000000000100)
      [   11.006295] efi: EFI Runtime Services are disabled!
      [   11.006269] Modules linked in: wdat_wdt pcspkr ipmi_ssif joydev sg i2c_i801 lpc_ich mei_me mei ipmi_si ipmi_devintf ipmi_msghandler acpi_pad(+) acpi_power_meter(+) ip_tables xfs libcrc32c sd_mod crc_t10dif crct10dif_generic ast igb drm_kms_helper crct10dif_pclmul crct10dif_common crc32c_intel ptp syscopyarea pps_core sysfillrect sysimgblt dca fb_sys_fops nvme i2c_algo_bit ttm nvme_core drm ahci libahci megaraid_sas libata drm_panel_orientation_quirks nfit libnvdimm dm_mirror dm_region_hash dm_log dm_mod fuse
      [   11.006309] CPU: 38 PID: 1333 Comm: systemd-journal Tainted: G        W      ------------   3.10.0-1160.36.2.el7.x86_64 #1
      [   11.006313] Call Trace:
      [   11.006317]  [<ffffffff84383559>] dump_stack+0x19/0x1b
      [   11.006322]  [<ffffffff83c9b258>] __warn+0xd8/0x100
      [   11.006328]  [<ffffffff83c9b2df>] warn_slowpath_fmt+0x5f/0x80
      [   11.006332]  [<ffffffff83ce4cfc>] ? dequeue_entity+0x11c/0x5c0
      [   11.006336]  [<ffffffff83fa6753>] __list_del_entry+0x63/0xd0
      [   11.006341]  [<ffffffff83fa67cd>] list_del+0xd/0x30
      [   11.006345]  [<ffffffff83c7c0a8>] pgd_free+0x58/0x90
      [   11.006349]  [<ffffffff83c97687>] __mmdrop+0x27/0xb0
      [   11.006355]  [<ffffffff83cd4bbd>] finish_task_switch+0x16d/0x1c0
      [   11.006362]  [<ffffffff84388e10>] __schedule+0x320/0x680
      [   11.006367]  [<ffffffff84389199>] schedule+0x29/0x70
      [   11.006371]  [<ffffffff843885dd>] schedule_hrtimeout_range_clock+0x12d/0x150
      [   11.006380]  [<ffffffff83e9d4b9>] ? ep_scan_ready_list.isra.7+0x1b9/0x1f0
      [   11.006385]  [<ffffffff84388613>] schedule_hrtimeout_range+0x13/0x20
      [   11.006389]  [<ffffffff83e9d74e>] ep_poll+0x23e/0x360
      [   11.006397]  [<ffffffff83e4c288>] ? do_truncate+0x88/0xc0
      [   11.006402]  [<ffffffff83e51498>] ? __sb_start_write+0x58/0x120
      [   11.006407]  [<ffffffff83cdadd0>] ? wake_up_state+0x20/0x20
      [   11.006412]  [<ffffffff83e9ec2d>] SyS_epoll_wait+0xed/0x120
      [   11.006420]  [<ffffffff84395f92>] system_call_fastpath+0x25/0x2a
      [   11.006423] ---[ end trace 32d18cdf2277bf4a ]---
      
  • システムが応答しない場合に、システムがクラッシュするように設定されている場合は、NMI を介して vmcore をキャプチャーし、NMI がシステムに送信されたときに vmcore を作成してみてください。

  • vmcore 内では、カーネルリングバッファーは log または dmesg でチェックできます。上記と同様のログについては、こちらを確認してください。

  • vmcore 内で、kworker スレッドが長時間ブロックされているかどうか、また、efi_call でブロックしているかどうかを確認します。

    crash> foreach UN ps -m
    [0 00:05:50.998] [UN]  PID: 2597   TASK: ffffa2bffa90b180  CPU: 58  COMMAND: "kworker/u672:4"
    
    • 以下は、上記の kworker スレッドのスタックです。

      efi_call+0x58
       efi_call_rts+0x2f9
        process_one_work+0x17f
         worker_thread+0x126
          kthread+0xd1
           ret_from_fork_nospec_begin+0x7
      

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments