commit_charge()の処理

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()は処理が全然ないので今日はこれにて終了

Raspberry Piで学ぶ ROSロボット入門

Raspberry Piで学ぶ ROSロボット入門