June 2008

ほほー

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


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;
}


Matz を説得する方法のスライドがすばらしい件

http://d.hatena.ne.jp/tokuhirom/20080629/1214717545


からリンクされている、akrさんの資料がすばらしい。
なんで直接リンクせずにこっちに貼るかというと、文中の

「貴様の問題などどうでもいい」


がいい味だしてるから

ここ1週間ぐらいずっと悩んでいる気がする。

わかっていること
・Activeなリストにつながっているのに、!PageActive() なことがある
・LRUにつながってるのに、!PageLRU() なことがある
・putback_lru_page() rework をはずすとおきない
・putback_lru_page() rework に後から入れた追加修正をはずしても起きる。
よって、根本的になにか見落としてる可能性が高い
・memcgのreclaimは無罪(CONFIG=Nでも再現するから)

http://www.rubyist.net/~matz/20080620.html


なぜか名言まみれ。

更新します。更新するまでがRubyKaigiです



といいつつ

RubyKaigi'08は(自分の中で)永遠に不滅です



とか。
「これはすごい」x10ぐらいタグをつけたい。

こう、まるでプログラミングしていて、人の作ったルーチンがものすごく汎用的に使えることに
気づいてしまった時のよろこびというか。

↑このページのトップヘ