On Tue, Jul 19, 2011 at 5:36 PM, Johannes Weiner <hannes@xxxxxxxxxxx> wrote: > On Tue, Jul 19, 2011 at 03:47:43PM -0700, Ying Han wrote: >> On Tue, May 31, 2011 at 11:25 PM, Johannes Weiner <hannes@xxxxxxxxxxx>wrote: >> >> > Once the per-memcg lru lists are exclusive, the unevictable page >> > rescue scanner can no longer work on the global zone lru lists. >> > >> > This converts it to go through all memcgs and scan their respective >> > unevictable lists instead. >> > >> > Signed-off-by: Johannes Weiner <hannes@xxxxxxxxxxx> >> > --- >> > include/linux/memcontrol.h | 2 + >> > mm/memcontrol.c | 11 +++++++++ >> > mm/vmscan.c | 53 >> > +++++++++++++++++++++++++++---------------- >> > 3 files changed, 46 insertions(+), 20 deletions(-) >> > >> > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h >> > index cb02c00..56c1def 100644 >> > --- a/include/linux/memcontrol.h >> > +++ b/include/linux/memcontrol.h >> > @@ -60,6 +60,8 @@ extern void mem_cgroup_cancel_charge_swapin(struct >> > mem_cgroup *ptr); >> > >> > extern int mem_cgroup_cache_charge(struct page *page, struct mm_struct >> > *mm, >> > gfp_t gfp_mask); >> > +struct page *mem_cgroup_lru_to_page(struct zone *, struct mem_cgroup *, >> > + enum lru_list); >> > >> >> Did we miss a #ifdef case for this function? I got compile error by >> disabling memcg. > > I assume it's because the call to it is not optimized away properly in > the disabled case. I'll have it fixed in the next round, thanks for > letting me know. > Hi Johannes: This is the change for the hierarchy_walk() sent on the other patch, also including a fix. Please consider to fold in your patch: Fix the hierarchy_walk() in the unevictable page rescue scanner the patch including changes 1. adjust the change in hierarchy_walk() which needs to hold the reference to the first mem_cgroup. 2. add stop_hierarchy_walk() at the end which is missed on the original patch. Signed-off-by: Ying Han <yinghan@xxxxxxxxxx> Change-Id: I72fb5d351faf0f111c8c99edd90b6cfee6281d3f --- mm/memcontrol.c | 3 +++ mm/vmscan.c | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 9bcd429..426092b 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -1514,6 +1514,9 @@ void mem_cgroup_stop_hierarchy_walk(struct mem_cgroup *target, >------>------->------->------- struct mem_cgroup *first, >------>------->------->------- struct mem_cgroup *mem) { +>------if (!target) +>------>-------target = root_mem_cgroup; + >------if (mem && mem != target) >------>-------css_put(&mem->css); · diff --git a/mm/vmscan.c b/mm/vmscan.c index 290998e..fd9593b 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4110,9 +4110,9 @@ static struct page *lru_tailpage(struct zone *zone, struct mem_cgroup *mem, #define SCAN_UNEVICTABLE_BATCH_SIZE 16UL /* arbitrary lock hold batch size */ static void scan_zone_unevictable_pages(struct zone *zone) { ->------struct mem_cgroup *first, *mem = NULL; +>------struct mem_cgroup *first, *mem; · ->------first = mem = mem_cgroup_hierarchy_walk(NULL, mem); +>------first = mem = mem_cgroup_hierarchy_walk(NULL, NULL, NULL); >------do { >------>-------unsigned long nr_to_scan; · @@ -4139,8 +4139,9 @@ static void scan_zone_unevictable_pages(struct zone *zone) >------>------->-------spin_unlock_irq(&zone->lru_lock); >------>------->-------nr_to_scan -= batch_size; >------>-------} ->------>-------mem = mem_cgroup_hierarchy_walk(NULL, mem); +>------>-------mem = mem_cgroup_hierarchy_walk(NULL, first, mem); >------} while (mem != first); +>------mem_cgroup_stop_hierarchy_walk(NULL, first, mem); } --Ying -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href