プロフィール

kosaki

Author:kosaki
連絡先はコチラ

ブログ検索
最近の記事
最近のコメント
最近のトラックバック
リンク
カテゴリー
月別アーカイブ
RSSフィード
FC2ブログランキング

スポンサーサイト このエントリーをはてなブックマークに追加

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | 【--------(--) --:--:--】 | Trackback(-) | Comments(-)

memcgのLRUリストはPageLRUがOFFのときもリストにつながってる このエントリーをはてなブックマークに追加

ほほー

ま、今追っているバグとは全然リンクしないんだが。


unsigned long mem_cgroup_isolate_pages(unsigned long nr_to_scan,
struct list_head *dst,
unsigned long *scanned, int order,
int mode, struct zone *z,
struct mem_cgroup *mem_cont,
int active, int file)
{
unsigned long nr_taken = 0;
struct page *page;
unsigned long scan;
LIST_HEAD(pc_list);
struct list_head *src;
struct page_cgroup *pc, *tmp;
int nid = z->zone_pgdat->node_id;
int zid = zone_idx(z);
struct mem_cgroup_per_zone *mz;
int lru = LRU_FILE * !!file + !!active;

BUG_ON(!mem_cont);
mz = mem_cgroup_zoneinfo(mem_cont, nid, zid);
src = &mz->lists[lru];
spin_lock(&mz->lru_lock);
scan = 0;
list_for_each_entry_safe_reverse(pc, tmp, src, lru) {
if (scan >= nr_to_scan)
break;
page = pc->page;

// ★ PageLRUがOFFの時は別の人にisolateされているので抜ける
if (unlikely(!PageLRU(page)))
continue;

/*
* TODO: play better with lumpy reclaim, grabbing anything.
*/
if (PageUnevictable(page) ||
(PageActive(page) && !active) ||
(!PageActive(page) && active)) {
__mem_cgroup_move_lists(pc, page_lru(page));
continue;
}

scan++;
list_move(&pc->lru, &pc_list);

if (__isolate_lru_page(page, mode, file) == 0) {
list_move(&page->lru, dst);
nr_taken++;
}
}

list_splice(&pc_list, src); //★isolateしたかどうかに関わらずリストに戻す
spin_unlock(&mz->lru_lock);

*scanned = scan;
return nr_taken;
}

関連記事


linux | 【2008-06-29(Sun) 18:47:22】 | Trackback:(0) | Comments:(2)
コメント

これはもともと、PageLRU になるまえに memcg のリストにつないでいるから
isolate_pages() のほうで !PageLRU をみて対処するような構造になっているのだよ
はっはっは・・・汚い?
2008-06-29 日 22:03:49 | URL | KAME #- [ 編集]

汚くないけど、普通、global lruと一緒だろという先入観を持ってコードを読んでいたのでびびったっす
2008-06-30 月 00:10:32 | URL | kosaki #- [ 編集]
  1. 無料アクセス解析
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。