プロセス毎のswap使用量を計測するパッチを読む その4
「プロセス毎のswap使用量を計測するパッチを読む その3」の続き。
copy_one_pte
copy_one_pte関数の続き。前回は、コピー対象のページがスワップエントリである場合、コピー元のスワップページの参照カウントをインクリメントする、というところまででした。今回も「コピー対象がスワップエントリである場合」というコンテキストです。
mm/memory.c
if (!is_migration_entry(entry)) rss[2]++; else if (is_write_migration_entry(entry) && is_cow_mapping(vm_flags)) { /* * COW mappings require pages in both parent * and child to be set to read. */ make_migration_entry_read(&entry); pte = swp_entry_to_pte(entry); set_pte_at(src_mm, addr, src_pte, pte); } } goto out_set_pte; }
インデントがおかしい部分が今回のpatchによって変更された部分になります。
is_migration_entry
「CONFIG_MIGRATION」がdefineされているかによって関数の内容が変わってます。
include/linux/swapops.h
#ifdef CONFIG_MIGRATION ... =>atic inline int is_migration_entry(swp_entry_t entry) { return unlikely(swp_type(entry) == SWP_MIGRATION_READ || swp_type(entry) == SWP_MIGRATION_WRITE); }
include/linux/swapops.h
#else #define make_migration_entry(page, write) swp_entry(0, 0) =>atic inline int is_migration_entry(swp_entry_t swp) { return 0; }
「CONFIG_MIGRATION」が分からなかったのでちょっとググってみたところ、以下のように記載されていました。
Allows the migration of the physical location of pages of processes while the virtual addresses are not changed. This is useful for example on NUMA systems to put pages nearer to the processors accessing the page.
http://cateee.net/lkddb/web-lkddb/MIGRATION.html
仮想アドレスを変更せずに物理ページの位置をマイグレーションできる、らしい。特殊用途向けなのかな。configをみたら定義されてなかったので、return 0;の実装が適用されているようです。
rss[2]++が実行され、mm_structに追加したswapの使用量のカウントが上がります。つまり、ページエントリをコピーする(copy_one_pte)際、それがスワップエントリであれば、コピー先のプロセスのスワップの使用量が加算されることになります。
参考文献:
Linuxカーネル2.6解読室 | |
ソフトバンククリエイティブ 2006-11-18 売り上げランキング : 63555 おすすめ平均 Linuxカーネル全般についてじっくり学べる これを理解できなくてもがっかりするな 細かい割りに、肝心な疑問点がわからない Amazonで詳しく見る by G-Tools |