mem_cgroup_commit_charge()から呼ばれるcommit_charge()の処理のめも。
呼び出しはこうですね。mem_cgroup_commit_charge()で渡された引数がそのまま渡ります。
5522 void mem_cgroup_commit_charge(struct page *page, struct mem_cgroup *memcg, 5523 bool lrucare) ~~~略~~~ 5540 commit_charge(page, memcg, lrucare);
commit_charge()はmem_cgroup_commit_charge()と同じくmm/memcontrol.cにあります。処理自体は数行しかありません。
2419 static void commit_charge(struct page *page, struct mem_cgroup *memcg, 2420 bool lrucare) 2421 { 2422 int isolated; 2423 2424 VM_BUG_ON_PAGE(page->mem_cgroup, page); 2425
page->mem_cgroup変数が設定されているとエラーになります。commit_charge()はこの変数を設定するのが役割なので、先に設定されているということはバグということなんでしょう。
2426 /* 2427 * In some cases, SwapCache and FUSE(splice_buf->radixtree), the page 2428 * may already be on some other mem_cgroup's LRU. Take care of it. 2429 */ 2430 if (lrucare) 2431 lock_page_lru(page, &isolated); 2432
pageがすでにLRUリストにある場合はロックを取ってます。
2433 /* 2434 * Nobody should be changing or seriously looking at 2435 * page->mem_cgroup at this point: 2436 * 2437 * - the page is uncharged 2438 * 2439 * - the page is off-LRU 2440 * 2441 * - an anonymous fault has exclusive page access, except for 2442 * a locked page table 2443 * 2444 * - a page cache insertion, a swapin fault, or a migration 2445 * have the page locked 2446 */ 2447 page->mem_cgroup = memcg; 2448
ここでpage->mem_cgroupにmem_cgroup_commit_charge()を呼んだところが渡したmemcgの構造体をpage構造体に設定します。
2449 if (lrucare) 2450 unlock_page_lru(page, isolated); 2451 }
最後にロックを取っていた場合はアンロックします。
ここで設定したmem_cgroup構造体はinclude/linux/mm_types.hにあるpage構造体で以下のように定義されています。
169 #ifdef CONFIG_MEMCG 170 struct mem_cgroup *mem_cgroup; 171 #endif
commit_charge()は処理が全然ないので今日はこれにて終了
- 作者: 上田隆一
- 出版社/メーカー: 日経BP社
- 発売日: 2017/04/11
- メディア: Kindle版
- この商品を含むブログを見る