hugetlbfs の reservation は hugepage を preallocation の管理に使用される。
hugepage は使用前に free hugepage プールを作成し、page fault の際に実際にプロセスに割り当てられるが、preallocation というのはその前段階で mmap()
はしたが、まだ fault in はしていない状態を指す。
mmap()
に MAP_NORESERVE
フラグを渡すことによって reserve を回避することもできるが、その場合もし fault in までの間に他のプロセスによって hugepage を割り当てられてしまった場合、page fault に失敗して SEGSERV を受信してしまうことになる。
事前に reserve しておくことによって確実に fault in できるようにする、というのが reserve の基本的な役割と言える。
hugetlb はページサイズごと (x86 だと 2MB 以外に 1GB もサポートしている) のグローバル変数 hstate で管理されていて、その中の resv_huge_pages
が reserve カウントを表す。
さらに、hugetlbfs 上のファイルを mmap()
する場合は inode に resv_map
構造体を紐付けて reservation とオフセットの対応を管理している。