私のシステムが「ページ割り当て失敗」を報告しました。
[some_app]: page allocation failure: order:4, mode:0x2040d0
このパターンが正確に何を表すのかを説明できる人はいますか?私の言葉は正しいですか?これは次のGFPフラグについてです:GFP_NOTRACK | GFP_COMP | GFP_WAIT | GFP_IO | GFP_FS
?
カーネルバージョンは3.10.0-693.21.1.el7.AV1.x86_64
。
答え1
フラグはファイルで定義されているように見え、<kernel source directory>/include/linux/gfp.h
少なくともカーネル4.9.105では、モード0x2040d0が次のようにマップされているようです。
GFP_NOTRACK | GFP_COMP | GFP_FS | GFP_IO | GFP_RECLAIMABLE
ただし、Google でフラグ定義を検索すると、一部のソースで 0x10 の値が GFP_RECLAIMABLE ではなく GFP_WAIT として定義され、ソースと一致するように見えます。
このLWN議論読んで役に立つかもしれませんが、私が見ることができる最も良い説明はファイルのコメントにありますinclude/linux/gfp.h
。
通常、これらのモードフラグはページアロケータの操作を変更します。
- GFP_NOTRACK:使用を避けてください
kmemcheck
。 - GFP_COMP:アドレス複合ページメタデータ
- GFP_FS:アロケータが必要な場合は、ページを回復するために低レベルのファイルシステムを呼び出すことができることを示します。このオプションがクリアされると、割り当てがロックを保持できるファイルシステムコードの一部であることを示します。たとえば、次のようになります。これはスワップファイルを使用する場合に重要です。
- GFP_IO:割り当て者がこの要求を満たすためにページを回復するために物理I / Oを開始できることを示します。
- " GFP_RECLAIMABLE: "[This] は、SLAB_RECLAIM_ACCOUNT を指定し、そのページを縮小器によって解放できるスラブ割り当てに使用されます。このフラグは、ファイルシステムのメモリ割り当てに使用されるようです。デフォルトでは、これは、この割り当てを解除または最小化するために必要なときに呼び出すことができるカーネル関数があることを意味しているようです。