On Thu, Apr 14, 2011 at 5:34 PM, KAMEZAWA Hiroyuki < kamezawa.hiroyu@jp.fujitsu.com> wrote: > On Thu, 14 Apr 2011 15:54:23 -0700 > Ying Han wrote: > > > Add the kswapd_mem field in kswapd descriptor which links the kswapd > > kernel thread to a memcg. The per-memcg kswapd is sleeping in the wait > > queue headed at kswapd_wait field of the kswapd descriptor. > > > > The kswapd() function is now shared between global and per-memcg kswapd. > It > > is passed in with the kswapd descriptor which contains the information of > > either node or memcg. Then the new function balance_mem_cgroup_pgdat is > > invoked if it is per-mem kswapd thread, and the implementation of the > function > > is on the following patch. > > > > changelog v4..v3: > > 1. fix up the kswapd_run and kswapd_stop for online_pages() and > offline_pages. > > 2. drop the PF_MEMALLOC flag for memcg kswapd for now per KAMAZAWA's > request. > > > > changelog v3..v2: > > 1. split off from the initial patch which includes all changes of the > following > > three patches. > > > > Signed-off-by: Ying Han > > > > --- > > include/linux/memcontrol.h | 5 ++ > > include/linux/swap.h | 5 +- > > mm/memcontrol.c | 29 ++++++++ > > mm/memory_hotplug.c | 4 +- > > mm/vmscan.c | 157 > ++++++++++++++++++++++++++++++-------------- > > 5 files changed, 147 insertions(+), 53 deletions(-) > > > > diff --git a/include/linux/memcontrol.h b/include/linux/memcontrol.h > > index 3ece36d..f7ffd1f 100644 > > --- a/include/linux/memcontrol.h > > +++ b/include/linux/memcontrol.h > > @@ -24,6 +24,7 @@ struct mem_cgroup; > > struct page_cgroup; > > struct page; > > struct mm_struct; > > +struct kswapd; > > > > /* Stats that can be updated by kernel. */ > > enum mem_cgroup_page_stat_item { > > @@ -83,6 +84,10 @@ int task_in_mem_cgroup(struct task_struct *task, const > struct mem_cgroup *mem); > > extern struct mem_cgroup *try_get_mem_cgroup_from_page(struct page > *page); > > extern struct mem_cgroup *mem_cgroup_from_task(struct task_struct *p); > > extern int mem_cgroup_watermark_ok(struct mem_cgroup *mem, int > charge_flags); > > +extern int mem_cgroup_init_kswapd(struct mem_cgroup *mem, > > + struct kswapd *kswapd_p); > > +extern void mem_cgroup_clear_kswapd(struct mem_cgroup *mem); > > +extern wait_queue_head_t *mem_cgroup_kswapd_wait(struct mem_cgroup > *mem); > > > > static inline > > int mm_match_cgroup(const struct mm_struct *mm, const struct mem_cgroup > *cgroup) > > diff --git a/include/linux/swap.h b/include/linux/swap.h > > index f43d406..17e0511 100644 > > --- a/include/linux/swap.h > > +++ b/include/linux/swap.h > > @@ -30,6 +30,7 @@ struct kswapd { > > struct task_struct *kswapd_task; > > wait_queue_head_t kswapd_wait; > > pg_data_t *kswapd_pgdat; > > + struct mem_cgroup *kswapd_mem; > > }; > > > > int kswapd(void *p); > > @@ -303,8 +304,8 @@ static inline void > scan_unevictable_unregister_node(struct node *node) > > } > > #endif > > > > -extern int kswapd_run(int nid); > > -extern void kswapd_stop(int nid); > > +extern int kswapd_run(int nid, struct mem_cgroup *mem); > > +extern void kswapd_stop(int nid, struct mem_cgroup *mem); > > > > #ifdef CONFIG_MMU > > /* linux/mm/shmem.c */ > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > > index 685645c..c4e1904 100644 > > --- a/mm/memcontrol.c > > +++ b/mm/memcontrol.c > > @@ -278,6 +278,8 @@ struct mem_cgroup { > > */ > > u64 high_wmark_distance; > > u64 low_wmark_distance; > > + > > + wait_queue_head_t *kswapd_wait; > > }; > > I think mem_cgroup can include 'struct kswapd' itself and don't need to > alloc it dynamically. > > Other parts seems ok to me. > The same for the previous post. I would like to keep the implementation for the first version if not one is strongly better than the other. Hope that works. --Ying > > Thanks, > -Kame > >