TenForward

技術ブログ。はてなダイアリーから移転しました

6.14 カーネルで cgroup に追加された dmem コントローラー

6.14 カーネルで、cgroup に久々に新しいコントローラーが追加されました。

追加されたのはデバイスモリーコントローラー = "dmem" コントローラーです。

バイスのメモリー領域を cgroup で管理するためのコントローラーです。現時点では(?)、GPU のメモリーと、GPU ドライバーが割り当てた CPU メモリーが cgroup に計上されて、制限がかかるようです。

将来的に GPU 以外でも使うかも? ってことで汎用的な名前になってるのでしょうか?(しらんけど)

6.14 カーネルで dmem コントローラーを有効にしてカーネルをビルドすると、次のように cgroup.controllers ファイルに dmem という文字列が現れます。そして、root cgroup には、dmem.capacitydmem.current という 2 つのファイルが現れます。

$ cat /sys/fs/cgroup/cgroup.controllers 
cpuset cpu io memory hugetlb pids rdma misc dmem
$ ( cd /sys/fs/cgroup && ls dmem.* )
dmem.capacity  dmem.current

cgroup を作成し、子 cgroup で dmem コントローラーを使えるようにすると、子 cgroup にも dmem. で始まるファイルが出現します。

$ sudo mkdir /sys/fs/cgroup/test01
$ echo "+dmem" | sudo tee /sys/fs/cgroup/cgroup.subtree_control 
+dmem
$ cat /sys/fs/cgroup/cgroup.subtree_control 
dmem
$ cat /sys/fs/cgroup/test01/cgroup.controllers 
dmem
$ ( cd /sys/fs/cgroup/test01/ && ls dmem.* )
dmem.current  dmem.low  dmem.max  dmem.min

. dmem コントローラーのインターフェースファイル

ファイル名 機能 操作
dmem.capacity バイスモリーの最大容量が記載される。root cgroup のみに存在 読み取り専用
dmem.current 現在のリソース利用状況が記載される 読み取り専用
dmem.max memory.max と同じ 読み書き
dmem.min memory.min と同じ 読み書き
dmem.low memory.low と同じ 読み書き

dmem.currentカーネル付属文書では「root 以外のすべての cgroup」と書いてあるけど、root cgroup にもいますね。

パッチ

私の手元には dmem コントローラーを使える環境がない(出現したファイルすべての中身が空)ので、パッチを見てみましょう。ここからは素人の考察ですので、間違えてる可能性大です。

7 つのパッチから構成されており、"0/7" はこちらです。

こちらのパッチが、dmem コントローラーそのものでしょうか。これらの関数を使うと、dmem コントローラーの制限が効くようになるようですね。

dmm コントローラー用のヘルパーが、次のパッチで drm に追加されています。

リソース制御は TTM で処理するため、TTM に色々処理が追加されています。TTM は、専用メモリーを備えたアクセラレーターデバイス用のメモリーマネージャーらしいです。ここで実際のリソース制限とかがかかるんでしょうかね。

現時点では Intel の Xe ドライバーでのみ実装されているようです。そのパッチを見ると、ドライバーへの変更は少ししかありません。ここで実際のメモリーを登録する感じですかね。

drm と ttm でリソース制御の部分は吸収されて、各ドライバーは登録だけすれば良い感じでしょうか。今後、他のドライバーにも実装されていくのでしょうね。

また、手元で試せるようになったら試してみたいですね。どうやって試すのかしらんけどw

参考