* [PATCH -mmotm 0/2] memcg: move charge of file cache/shmem @ 2010-03-29 3:02 Daisuke Nishimura 2010-03-29 3:03 ` [PATCH -mmotm 1/2] memcg move charge of file cache at task migration Daisuke Nishimura 2010-03-29 3:03 ` [PATCH -mmotm 2/2] memcg move charge of shmem " Daisuke Nishimura 0 siblings, 2 replies; 21+ messages in thread From: Daisuke Nishimura @ 2010-03-29 3:02 UTC (permalink / raw) To: linux-mm Cc: Andrew Morton, Balbir Singh, KAMEZAWA Hiroyuki, Daisuke Nishimura These are patches based on mmotm-2010-03-24-14-48 to support moving charges of file cache/shmem at task migration. [1/2] memcg move charge of file cache at task migration [2/2] memcg move charge of shmem at task migration I think they are rather small and simple than expected. Any comments are welcome. Thanks, Daisuke Nishimura. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH -mmotm 1/2] memcg move charge of file cache at task migration 2010-03-29 3:02 [PATCH -mmotm 0/2] memcg: move charge of file cache/shmem Daisuke Nishimura @ 2010-03-29 3:03 ` Daisuke Nishimura 2010-03-29 4:15 ` KAMEZAWA Hiroyuki 2010-03-29 3:03 ` [PATCH -mmotm 2/2] memcg move charge of shmem " Daisuke Nishimura 1 sibling, 1 reply; 21+ messages in thread From: Daisuke Nishimura @ 2010-03-29 3:03 UTC (permalink / raw) To: linux-mm Cc: Andrew Morton, Balbir Singh, KAMEZAWA Hiroyuki, Daisuke Nishimura This patch adds support for moving charge of file cache. It's enabled by setting bit 1 of <target cgroup>/memory.move_charge_at_immigrate. Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> --- Documentation/cgroups/memory.txt | 6 ++++-- mm/memcontrol.c | 14 +++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt index 1b5bd04..f53d220 100644 --- a/Documentation/cgroups/memory.txt +++ b/Documentation/cgroups/memory.txt @@ -461,10 +461,12 @@ charges should be moved. 0 | A charge of an anonymous page(or swap of it) used by the target task. | Those pages and swaps must be used only by the target task. You must | enable Swap Extension(see 2.4) to enable move of swap charges. + -----+------------------------------------------------------------------------ + 1 | A charge of file cache mmap'ed by the target task. Those pages must be + | mmap'ed only by the target task. Note: Those pages and swaps must be charged to the old cgroup. -Note: More type of pages(e.g. file cache, shmem,) will be supported by other - bits in future. +Note: More type of pages(e.g. shmem) will be supported by other bits in future. 8.3 TODO diff --git a/mm/memcontrol.c b/mm/memcontrol.c index f6c9d42..66d2704 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -250,6 +250,7 @@ struct mem_cgroup { */ enum move_type { MOVE_CHARGE_TYPE_ANON, /* private anonymous page and swap of it */ + MOVE_CHARGE_TYPE_FILE, /* private file caches */ NR_MOVE_TYPE, }; @@ -4192,6 +4193,8 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, int usage_count = 0; bool move_anon = test_bit(MOVE_CHARGE_TYPE_ANON, &mc.to->move_charge_at_immigrate); + bool move_file = test_bit(MOVE_CHARGE_TYPE_FILE, + &mc.to->move_charge_at_immigrate); if (!pte_present(ptent)) { /* TODO: handle swap of shmes/tmpfs */ @@ -4208,10 +4211,15 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, if (!page || !page_mapped(page)) return 0; /* - * TODO: We don't move charges of file(including shmem/tmpfs) - * pages for now. + * TODO: We don't move charges of shmem/tmpfs pages for now. */ - if (!move_anon || !PageAnon(page)) + if (PageAnon(page)) { + if (!move_anon) + return 0; + } else if (page_is_file_cache(page)) { + if (!move_file) + return 0; + } else return 0; if (!get_page_unless_zero(page)) return 0; -- 1.6.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH -mmotm 1/2] memcg move charge of file cache at task migration 2010-03-29 3:03 ` [PATCH -mmotm 1/2] memcg move charge of file cache at task migration Daisuke Nishimura @ 2010-03-29 4:15 ` KAMEZAWA Hiroyuki 2010-03-30 1:32 ` [PATCH(v2) " Daisuke Nishimura 0 siblings, 1 reply; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-29 4:15 UTC (permalink / raw) To: Daisuke Nishimura; +Cc: linux-mm, Andrew Morton, Balbir Singh On Mon, 29 Mar 2010 12:03:21 +0900 Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > This patch adds support for moving charge of file cache. It's enabled by setting > bit 1 of <target cgroup>/memory.move_charge_at_immigrate. > > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > --- > Documentation/cgroups/memory.txt | 6 ++++-- > mm/memcontrol.c | 14 +++++++++++--- > 2 files changed, 15 insertions(+), 5 deletions(-) > > diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt > index 1b5bd04..f53d220 100644 > --- a/Documentation/cgroups/memory.txt > +++ b/Documentation/cgroups/memory.txt > @@ -461,10 +461,12 @@ charges should be moved. > 0 | A charge of an anonymous page(or swap of it) used by the target task. > | Those pages and swaps must be used only by the target task. You must > | enable Swap Extension(see 2.4) to enable move of swap charges. > + -----+------------------------------------------------------------------------ > + 1 | A charge of file cache mmap'ed by the target task. Those pages must be > + | mmap'ed only by the target task. Hmm..my English is not good but.. == A charge of a page cache mapped by the target task. Pages mapped by multiple processes will not be moved. This "page cache" doesn't include tmpfs. == Hmm, "a page mapped only by target task but belongs to other cgroup" will be moved ? The answer is "NO.". The code itself seems to work well. So, could you update Documentation ? Thanks, -Kame > > Note: Those pages and swaps must be charged to the old cgroup. > -Note: More type of pages(e.g. file cache, shmem,) will be supported by other > - bits in future. > +Note: More type of pages(e.g. shmem) will be supported by other bits in future. > > 8.3 TODO > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index f6c9d42..66d2704 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -250,6 +250,7 @@ struct mem_cgroup { > */ > enum move_type { > MOVE_CHARGE_TYPE_ANON, /* private anonymous page and swap of it */ > + MOVE_CHARGE_TYPE_FILE, /* private file caches */ > NR_MOVE_TYPE, > }; > > @@ -4192,6 +4193,8 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, > int usage_count = 0; > bool move_anon = test_bit(MOVE_CHARGE_TYPE_ANON, > &mc.to->move_charge_at_immigrate); > + bool move_file = test_bit(MOVE_CHARGE_TYPE_FILE, > + &mc.to->move_charge_at_immigrate); > > if (!pte_present(ptent)) { > /* TODO: handle swap of shmes/tmpfs */ > @@ -4208,10 +4211,15 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, > if (!page || !page_mapped(page)) > return 0; > /* > - * TODO: We don't move charges of file(including shmem/tmpfs) > - * pages for now. > + * TODO: We don't move charges of shmem/tmpfs pages for now. > */ > - if (!move_anon || !PageAnon(page)) > + if (PageAnon(page)) { > + if (!move_anon) > + return 0; > + } else if (page_is_file_cache(page)) { > + if (!move_file) > + return 0; > + } else > return 0; > if (!get_page_unless_zero(page)) > return 0; > -- > 1.6.4 > > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH(v2) -mmotm 1/2] memcg move charge of file cache at task migration 2010-03-29 4:15 ` KAMEZAWA Hiroyuki @ 2010-03-30 1:32 ` Daisuke Nishimura 2010-03-30 1:50 ` KAMEZAWA Hiroyuki 2010-03-30 5:46 ` Balbir Singh 0 siblings, 2 replies; 21+ messages in thread From: Daisuke Nishimura @ 2010-03-30 1:32 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: linux-mm, Andrew Morton, Balbir Singh, Daisuke Nishimura On Mon, 29 Mar 2010 13:15:41 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > On Mon, 29 Mar 2010 12:03:21 +0900 > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > This patch adds support for moving charge of file cache. It's enabled by setting > > bit 1 of <target cgroup>/memory.move_charge_at_immigrate. > > > > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > > --- > > Documentation/cgroups/memory.txt | 6 ++++-- > > mm/memcontrol.c | 14 +++++++++++--- > > 2 files changed, 15 insertions(+), 5 deletions(-) > > > > diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt > > index 1b5bd04..f53d220 100644 > > --- a/Documentation/cgroups/memory.txt > > +++ b/Documentation/cgroups/memory.txt > > @@ -461,10 +461,12 @@ charges should be moved. > > 0 | A charge of an anonymous page(or swap of it) used by the target task. > > | Those pages and swaps must be used only by the target task. You must > > | enable Swap Extension(see 2.4) to enable move of swap charges. > > + -----+------------------------------------------------------------------------ > > + 1 | A charge of file cache mmap'ed by the target task. Those pages must be > > + | mmap'ed only by the target task. > > Hmm..my English is not good but.. > == > A charge of a page cache mapped by the target task. Pages mapped by multiple processes > will not be moved. This "page cache" doesn't include tmpfs. > == > This is more accurate than mine. > Hmm, "a page mapped only by target task but belongs to other cgroup" will be moved ? > The answer is "NO.". > > The code itself seems to work well. So, could you update Documentation ? > Thank you for your advice. This is the updated version. === From: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> This patch adds support for moving charge of file cache. It's enabled by setting bit 1 of <target cgroup>/memory.move_charge_at_immigrate. Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> --- v1->v2 - update a documentation. Documentation/cgroups/memory.txt | 7 +++++-- mm/memcontrol.c | 14 +++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt index 1b5bd04..c624cd2 100644 --- a/Documentation/cgroups/memory.txt +++ b/Documentation/cgroups/memory.txt @@ -461,10 +461,13 @@ charges should be moved. 0 | A charge of an anonymous page(or swap of it) used by the target task. | Those pages and swaps must be used only by the target task. You must | enable Swap Extension(see 2.4) to enable move of swap charges. + -----+------------------------------------------------------------------------ + 1 | A charge of page cache mapped by the target task. Pages mapped by + | multiple processes will not be moved. This "page cache" doesn't include + | tmpfs. Note: Those pages and swaps must be charged to the old cgroup. -Note: More type of pages(e.g. file cache, shmem,) will be supported by other - bits in future. +Note: More type of pages(e.g. shmem) will be supported by other bits in future. 8.3 TODO diff --git a/mm/memcontrol.c b/mm/memcontrol.c index f6c9d42..66d2704 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -250,6 +250,7 @@ struct mem_cgroup { */ enum move_type { MOVE_CHARGE_TYPE_ANON, /* private anonymous page and swap of it */ + MOVE_CHARGE_TYPE_FILE, /* private file caches */ NR_MOVE_TYPE, }; @@ -4192,6 +4193,8 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, int usage_count = 0; bool move_anon = test_bit(MOVE_CHARGE_TYPE_ANON, &mc.to->move_charge_at_immigrate); + bool move_file = test_bit(MOVE_CHARGE_TYPE_FILE, + &mc.to->move_charge_at_immigrate); if (!pte_present(ptent)) { /* TODO: handle swap of shmes/tmpfs */ @@ -4208,10 +4211,15 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, if (!page || !page_mapped(page)) return 0; /* - * TODO: We don't move charges of file(including shmem/tmpfs) - * pages for now. + * TODO: We don't move charges of shmem/tmpfs pages for now. */ - if (!move_anon || !PageAnon(page)) + if (PageAnon(page)) { + if (!move_anon) + return 0; + } else if (page_is_file_cache(page)) { + if (!move_file) + return 0; + } else return 0; if (!get_page_unless_zero(page)) return 0; -- 1.6.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 1/2] memcg move charge of file cache at task migration 2010-03-30 1:32 ` [PATCH(v2) " Daisuke Nishimura @ 2010-03-30 1:50 ` KAMEZAWA Hiroyuki 2010-03-30 5:46 ` Balbir Singh 1 sibling, 0 replies; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-30 1:50 UTC (permalink / raw) To: Daisuke Nishimura; +Cc: linux-mm, Andrew Morton, Balbir Singh On Tue, 30 Mar 2010 10:32:36 +0900 Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > On Mon, 29 Mar 2010 13:15:41 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > On Mon, 29 Mar 2010 12:03:21 +0900 > > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > > > This patch adds support for moving charge of file cache. It's enabled by setting > > > bit 1 of <target cgroup>/memory.move_charge_at_immigrate. > > > > > > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > > > --- > > > Documentation/cgroups/memory.txt | 6 ++++-- > > > mm/memcontrol.c | 14 +++++++++++--- > > > 2 files changed, 15 insertions(+), 5 deletions(-) > > > > > > diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt > > > index 1b5bd04..f53d220 100644 > > > --- a/Documentation/cgroups/memory.txt > > > +++ b/Documentation/cgroups/memory.txt > > > @@ -461,10 +461,12 @@ charges should be moved. > > > 0 | A charge of an anonymous page(or swap of it) used by the target task. > > > | Those pages and swaps must be used only by the target task. You must > > > | enable Swap Extension(see 2.4) to enable move of swap charges. > > > + -----+------------------------------------------------------------------------ > > > + 1 | A charge of file cache mmap'ed by the target task. Those pages must be > > > + | mmap'ed only by the target task. > > > > Hmm..my English is not good but.. > > == > > A charge of a page cache mapped by the target task. Pages mapped by multiple processes > > will not be moved. This "page cache" doesn't include tmpfs. > > == > > > This is more accurate than mine. > > > Hmm, "a page mapped only by target task but belongs to other cgroup" will be moved ? > > The answer is "NO.". > > > > The code itself seems to work well. So, could you update Documentation ? > > > Thank you for your advice. > > This is the updated version. > > === > From: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > > This patch adds support for moving charge of file cache. It's enabled by setting > bit 1 of <target cgroup>/memory.move_charge_at_immigrate. > > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 1/2] memcg move charge of file cache at task migration 2010-03-30 1:32 ` [PATCH(v2) " Daisuke Nishimura 2010-03-30 1:50 ` KAMEZAWA Hiroyuki @ 2010-03-30 5:46 ` Balbir Singh 1 sibling, 0 replies; 21+ messages in thread From: Balbir Singh @ 2010-03-30 5:46 UTC (permalink / raw) To: Daisuke Nishimura; +Cc: KAMEZAWA Hiroyuki, linux-mm, Andrew Morton * nishimura@mxp.nes.nec.co.jp <nishimura@mxp.nes.nec.co.jp> [2010-03-30 10:32:36]: > On Mon, 29 Mar 2010 13:15:41 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > On Mon, 29 Mar 2010 12:03:21 +0900 > > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > > > This patch adds support for moving charge of file cache. It's enabled by setting > > > bit 1 of <target cgroup>/memory.move_charge_at_immigrate. > > > > > > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > > > --- > > > Documentation/cgroups/memory.txt | 6 ++++-- > > > mm/memcontrol.c | 14 +++++++++++--- > > > 2 files changed, 15 insertions(+), 5 deletions(-) > > > > > > diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt > > > index 1b5bd04..f53d220 100644 > > > --- a/Documentation/cgroups/memory.txt > > > +++ b/Documentation/cgroups/memory.txt > > > @@ -461,10 +461,12 @@ charges should be moved. > > > 0 | A charge of an anonymous page(or swap of it) used by the target task. > > > | Those pages and swaps must be used only by the target task. You must > > > | enable Swap Extension(see 2.4) to enable move of swap charges. > > > + -----+------------------------------------------------------------------------ > > > + 1 | A charge of file cache mmap'ed by the target task. Those pages must be > > > + | mmap'ed only by the target task. > > > > Hmm..my English is not good but.. > > == > > A charge of a page cache mapped by the target task. Pages mapped by multiple processes > > will not be moved. This "page cache" doesn't include tmpfs. > > == > > > This is more accurate than mine. > > > Hmm, "a page mapped only by target task but belongs to other cgroup" will be moved ? > > The answer is "NO.". > > > > The code itself seems to work well. So, could you update Documentation ? > > > Thank you for your advice. > > This is the updated version. > > === > From: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > > This patch adds support for moving charge of file cache. It's enabled by setting > bit 1 of <target cgroup>/memory.move_charge_at_immigrate. > > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > --- > v1->v2 > - update a documentation. > > Documentation/cgroups/memory.txt | 7 +++++-- > mm/memcontrol.c | 14 +++++++++++--- > 2 files changed, 16 insertions(+), 5 deletions(-) > > diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt > index 1b5bd04..c624cd2 100644 > --- a/Documentation/cgroups/memory.txt > +++ b/Documentation/cgroups/memory.txt > @@ -461,10 +461,13 @@ charges should be moved. > 0 | A charge of an anonymous page(or swap of it) used by the target task. > | Those pages and swaps must be used only by the target task. You must > | enable Swap Extension(see 2.4) to enable move of swap charges. > + -----+------------------------------------------------------------------------ > + 1 | A charge of page cache mapped by the target task. Pages mapped by > + | multiple processes will not be moved. This "page cache" doesn't include > + | tmpfs. > > Note: Those pages and swaps must be charged to the old cgroup. > -Note: More type of pages(e.g. file cache, shmem,) will be supported by other > - bits in future. > +Note: More type of pages(e.g. shmem) will be supported by other bits in future. > > 8.3 TODO > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index f6c9d42..66d2704 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -250,6 +250,7 @@ struct mem_cgroup { > */ > enum move_type { > MOVE_CHARGE_TYPE_ANON, /* private anonymous page and swap of it */ > + MOVE_CHARGE_TYPE_FILE, /* private file caches */ > NR_MOVE_TYPE, > }; > > @@ -4192,6 +4193,8 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, > int usage_count = 0; > bool move_anon = test_bit(MOVE_CHARGE_TYPE_ANON, > &mc.to->move_charge_at_immigrate); > + bool move_file = test_bit(MOVE_CHARGE_TYPE_FILE, > + &mc.to->move_charge_at_immigrate); > > if (!pte_present(ptent)) { > /* TODO: handle swap of shmes/tmpfs */ > @@ -4208,10 +4211,15 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, > if (!page || !page_mapped(page)) > return 0; > /* > - * TODO: We don't move charges of file(including shmem/tmpfs) > - * pages for now. > + * TODO: We don't move charges of shmem/tmpfs pages for now. > */ > - if (!move_anon || !PageAnon(page)) > + if (PageAnon(page)) { > + if (!move_anon) > + return 0; if (PageAnon(page) && !move_anon) return 0 is easier to read > + } else if (page_is_file_cache(page)) { > + if (!move_file) > + return 0; if (page_is_file_cache(page) && !move_file) return 0 > + } else > return 0; > if (!get_page_unless_zero(page)) > return 0; > -- > 1.6.4 > -- Three Cheers, Balbir -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-29 3:02 [PATCH -mmotm 0/2] memcg: move charge of file cache/shmem Daisuke Nishimura 2010-03-29 3:03 ` [PATCH -mmotm 1/2] memcg move charge of file cache at task migration Daisuke Nishimura @ 2010-03-29 3:03 ` Daisuke Nishimura 2010-03-29 4:36 ` KAMEZAWA Hiroyuki 1 sibling, 1 reply; 21+ messages in thread From: Daisuke Nishimura @ 2010-03-29 3:03 UTC (permalink / raw) To: linux-mm Cc: Andrew Morton, Balbir Singh, KAMEZAWA Hiroyuki, Daisuke Nishimura This patch adds support for moving charge of shmem and swap of it. It's enabled by setting bit 2 of <target cgroup>/memory.move_charge_at_immigrate. Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> --- Documentation/cgroups/memory.txt | 7 +++- include/linux/swap.h | 5 +++ mm/memcontrol.c | 52 +++++++++++++++++++++++++------------ mm/shmem.c | 37 +++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 19 deletions(-) diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt index f53d220..b197d60 100644 --- a/Documentation/cgroups/memory.txt +++ b/Documentation/cgroups/memory.txt @@ -464,13 +464,16 @@ charges should be moved. -----+------------------------------------------------------------------------ 1 | A charge of file cache mmap'ed by the target task. Those pages must be | mmap'ed only by the target task. + -----+------------------------------------------------------------------------ + 2 | A charge of a tmpfs page(or swap of it) mmap'ed by the target task. A + | typical use case of it is ipc shared memory. It must be mmap'ed by the + | target task, but unlike above 2 cases, the task may not be the only one. + | You must enable Swap Extension(see 2.4) to enable move of swap charges. Note: Those pages and swaps must be charged to the old cgroup. -Note: More type of pages(e.g. shmem) will be supported by other bits in future. 8.3 TODO -- Add support for other types of pages(e.g. file cache, shmem, etc.). - Implement madvise(2) to let users decide the vma to be moved or not to be moved. - All of moving charge operations are done under cgroup_mutex. It's not good diff --git a/include/linux/swap.h b/include/linux/swap.h index 1f59d93..94ec325 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -285,6 +285,11 @@ extern void kswapd_stop(int nid); extern int shmem_unuse(swp_entry_t entry, struct page *page); #endif /* CONFIG_MMU */ +#ifdef CONFIG_CGROUP_MEM_RES_CTLR +extern void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, + struct page **pagep, swp_entry_t *ent); +#endif + extern void swap_unplug_io_fn(struct backing_dev_info *, struct page *); #ifdef CONFIG_SWAP diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 66d2704..99a496c 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -251,6 +251,7 @@ struct mem_cgroup { enum move_type { MOVE_CHARGE_TYPE_ANON, /* private anonymous page and swap of it */ MOVE_CHARGE_TYPE_FILE, /* private file caches */ + MOVE_CHARGE_TYPE_SHMEM, /* shared memory and swap of it */ NR_MOVE_TYPE, }; @@ -4195,12 +4196,30 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, &mc.to->move_charge_at_immigrate); bool move_file = test_bit(MOVE_CHARGE_TYPE_FILE, &mc.to->move_charge_at_immigrate); + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, + &mc.to->move_charge_at_immigrate); + bool is_shmem = false; if (!pte_present(ptent)) { - /* TODO: handle swap of shmes/tmpfs */ - if (pte_none(ptent) || pte_file(ptent)) - return 0; - else if (is_swap_pte(ptent)) { + if (pte_none(ptent) || pte_file(ptent)) { + struct inode *inode; + struct address_space *mapping; + pgoff_t pgoff = 0; + + if (!vma->vm_file) + return 0; + mapping = vma->vm_file->f_mapping; + if (!move_shmem || !mapping_cap_swap_backed(mapping)) + return 0; + + if (pte_none(ptent)) + pgoff = linear_page_index(vma, addr); + if (pte_file(ptent)) + pgoff = pte_to_pgoff(ptent); + inode = vma->vm_file->f_path.dentry->d_inode; + mem_cgroup_get_shmem_target(inode, pgoff, &page, &ent); + is_shmem = true; + } else if (is_swap_pte(ptent)) { ent = pte_to_swp_entry(ptent); if (!move_anon || non_swap_entry(ent)) return 0; @@ -4210,26 +4229,22 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, page = vm_normal_page(vma, addr, ptent); if (!page || !page_mapped(page)) return 0; - /* - * TODO: We don't move charges of shmem/tmpfs pages for now. - */ if (PageAnon(page)) { if (!move_anon) return 0; } else if (page_is_file_cache(page)) { if (!move_file) return 0; - } else - return 0; + } else { + if (!move_shmem) + return 0; + is_shmem = true; + } if (!get_page_unless_zero(page)) return 0; usage_count = page_mapcount(page); } - if (usage_count > 1) { - /* - * TODO: We don't move charges of shared(used by multiple - * processes) pages for now. - */ + if (usage_count > 1 && !is_shmem) { if (page) put_page(page); return 0; @@ -4284,6 +4299,8 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) down_read(&mm->mmap_sem); for (vma = mm->mmap; vma; vma = vma->vm_next) { + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, + &mc.to->move_charge_at_immigrate); struct mm_walk mem_cgroup_count_precharge_walk = { .pmd_entry = mem_cgroup_count_precharge_pte_range, .mm = mm, @@ -4292,7 +4309,7 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) if (is_vm_hugetlb_page(vma)) continue; /* TODO: We don't move charges of shmem/tmpfs pages for now. */ - if (vma->vm_flags & VM_SHARED) + if ((vma->vm_flags & VM_SHARED) && !move_shmem) continue; walk_page_range(vma->vm_start, vma->vm_end, &mem_cgroup_count_precharge_walk); @@ -4483,6 +4500,8 @@ static void mem_cgroup_move_charge(struct mm_struct *mm) down_read(&mm->mmap_sem); for (vma = mm->mmap; vma; vma = vma->vm_next) { int ret; + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, + &mc.to->move_charge_at_immigrate); struct mm_walk mem_cgroup_move_charge_walk = { .pmd_entry = mem_cgroup_move_charge_pte_range, .mm = mm, @@ -4490,8 +4509,7 @@ static void mem_cgroup_move_charge(struct mm_struct *mm) }; if (is_vm_hugetlb_page(vma)) continue; - /* TODO: We don't move charges of shmem/tmpfs pages for now. */ - if (vma->vm_flags & VM_SHARED) + if ((vma->vm_flags & VM_SHARED) && !move_shmem) continue; ret = walk_page_range(vma->vm_start, vma->vm_end, &mem_cgroup_move_charge_walk); diff --git a/mm/shmem.c b/mm/shmem.c index dde4363..cb87365 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2701,3 +2701,40 @@ int shmem_zero_setup(struct vm_area_struct *vma) vma->vm_ops = &shmem_vm_ops; return 0; } + +#ifdef CONFIG_CGROUP_MEM_RES_CTLR +/** + * mem_cgroup_get_shmem_target - find a page or entry assigned to the shmem file + * @inode: the inode to be searched + * @pgoff: the offset to be searched + * @pagep: the pointer for the found page to be stored + * @ent: the pointer for the found swap entry to be stored + * + * If a page is found, refcount of it is incremented. Callers should handle + * these refcount. + */ +void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, + struct page **pagep, swp_entry_t *ent) +{ + swp_entry_t entry = { .val = 0 }, *ptr; + struct page *page = NULL; + struct shmem_inode_info *info = SHMEM_I(inode); + + if ((pgoff << PAGE_CACHE_SHIFT) >= i_size_read(inode)) + goto out; + + spin_lock(&info->lock); + ptr = shmem_swp_entry(info, pgoff, NULL); + if (ptr && ptr->val) { + entry.val = ptr->val; + page = find_get_page(&swapper_space, entry.val); + } else + page = find_get_page(inode->i_mapping, pgoff); + if (ptr) + shmem_swp_unmap(ptr); + spin_unlock(&info->lock); +out: + *pagep = page; + *ent = entry; +} +#endif -- 1.6.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-29 3:03 ` [PATCH -mmotm 2/2] memcg move charge of shmem " Daisuke Nishimura @ 2010-03-29 4:36 ` KAMEZAWA Hiroyuki 2010-03-30 1:33 ` [PATCH(v2) " Daisuke Nishimura 0 siblings, 1 reply; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-29 4:36 UTC (permalink / raw) To: Daisuke Nishimura; +Cc: linux-mm, Andrew Morton, Balbir Singh On Mon, 29 Mar 2010 12:03:59 +0900 Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > This patch adds support for moving charge of shmem and swap of it. It's enabled > by setting bit 2 of <target cgroup>/memory.move_charge_at_immigrate. > > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > --- > Documentation/cgroups/memory.txt | 7 +++- > include/linux/swap.h | 5 +++ > mm/memcontrol.c | 52 +++++++++++++++++++++++++------------ > mm/shmem.c | 37 +++++++++++++++++++++++++++ > 4 files changed, 82 insertions(+), 19 deletions(-) > > diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt > index f53d220..b197d60 100644 > --- a/Documentation/cgroups/memory.txt > +++ b/Documentation/cgroups/memory.txt > @@ -464,13 +464,16 @@ charges should be moved. > -----+------------------------------------------------------------------------ > 1 | A charge of file cache mmap'ed by the target task. Those pages must be > | mmap'ed only by the target task. > + -----+------------------------------------------------------------------------ > + 2 | A charge of a tmpfs page(or swap of it) mmap'ed by the target task. A > + | typical use case of it is ipc shared memory. It must be mmap'ed by the > + | target task, but unlike above 2 cases, the task may not be the only one. > + | You must enable Swap Extension(see 2.4) to enable move of swap charges. > > Note: Those pages and swaps must be charged to the old cgroup. > -Note: More type of pages(e.g. shmem) will be supported by other bits in future. > > 8.3 TODO > > -- Add support for other types of pages(e.g. file cache, shmem, etc.). > - Implement madvise(2) to let users decide the vma to be moved or not to be > moved. > - All of moving charge operations are done under cgroup_mutex. It's not good > diff --git a/include/linux/swap.h b/include/linux/swap.h > index 1f59d93..94ec325 100644 > --- a/include/linux/swap.h > +++ b/include/linux/swap.h > @@ -285,6 +285,11 @@ extern void kswapd_stop(int nid); > extern int shmem_unuse(swp_entry_t entry, struct page *page); > #endif /* CONFIG_MMU */ > > +#ifdef CONFIG_CGROUP_MEM_RES_CTLR > +extern void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, > + struct page **pagep, swp_entry_t *ent); > +#endif > + > extern void swap_unplug_io_fn(struct backing_dev_info *, struct page *); > > #ifdef CONFIG_SWAP > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 66d2704..99a496c 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -251,6 +251,7 @@ struct mem_cgroup { > enum move_type { > MOVE_CHARGE_TYPE_ANON, /* private anonymous page and swap of it */ > MOVE_CHARGE_TYPE_FILE, /* private file caches */ > + MOVE_CHARGE_TYPE_SHMEM, /* shared memory and swap of it */ > NR_MOVE_TYPE, > }; > > @@ -4195,12 +4196,30 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, > &mc.to->move_charge_at_immigrate); > bool move_file = test_bit(MOVE_CHARGE_TYPE_FILE, > &mc.to->move_charge_at_immigrate); > + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, > + &mc.to->move_charge_at_immigrate); > + bool is_shmem = false; > > if (!pte_present(ptent)) { > - /* TODO: handle swap of shmes/tmpfs */ > - if (pte_none(ptent) || pte_file(ptent)) > - return 0; > - else if (is_swap_pte(ptent)) { > + if (pte_none(ptent) || pte_file(ptent)) { > + struct inode *inode; > + struct address_space *mapping; > + pgoff_t pgoff = 0; > + > + if (!vma->vm_file) > + return 0; > + mapping = vma->vm_file->f_mapping; > + if (!move_shmem || !mapping_cap_swap_backed(mapping)) > + return 0; > + > + if (pte_none(ptent)) > + pgoff = linear_page_index(vma, addr); > + if (pte_file(ptent)) > + pgoff = pte_to_pgoff(ptent); Hmm...then, a shmem page is moved even if the task doesn't do page-fault. Could you clarify "All pages in the range mapped by a task will be moved to the new group even if the task doesn't do page fault, i.e. not tasks' RSS." ? Thanks, -Kame > + inode = vma->vm_file->f_path.dentry->d_inode; > + mem_cgroup_get_shmem_target(inode, pgoff, &page, &ent); > + is_shmem = true; > + } else if (is_swap_pte(ptent)) { > ent = pte_to_swp_entry(ptent); > if (!move_anon || non_swap_entry(ent)) > return 0; > @@ -4210,26 +4229,22 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, > page = vm_normal_page(vma, addr, ptent); > if (!page || !page_mapped(page)) > return 0; > - /* > - * TODO: We don't move charges of shmem/tmpfs pages for now. > - */ > if (PageAnon(page)) { > if (!move_anon) > return 0; > } else if (page_is_file_cache(page)) { > if (!move_file) > return 0; > - } else > - return 0; > + } else { > + if (!move_shmem) > + return 0; > + is_shmem = true; > + } > if (!get_page_unless_zero(page)) > return 0; > usage_count = page_mapcount(page); > } > - if (usage_count > 1) { > - /* > - * TODO: We don't move charges of shared(used by multiple > - * processes) pages for now. > - */ > + if (usage_count > 1 && !is_shmem) { > if (page) > put_page(page); > return 0; > @@ -4284,6 +4299,8 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) > > down_read(&mm->mmap_sem); > for (vma = mm->mmap; vma; vma = vma->vm_next) { > + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, > + &mc.to->move_charge_at_immigrate); > struct mm_walk mem_cgroup_count_precharge_walk = { > .pmd_entry = mem_cgroup_count_precharge_pte_range, > .mm = mm, > @@ -4292,7 +4309,7 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) > if (is_vm_hugetlb_page(vma)) > continue; > /* TODO: We don't move charges of shmem/tmpfs pages for now. */ > - if (vma->vm_flags & VM_SHARED) > + if ((vma->vm_flags & VM_SHARED) && !move_shmem) > continue; > walk_page_range(vma->vm_start, vma->vm_end, > &mem_cgroup_count_precharge_walk); > @@ -4483,6 +4500,8 @@ static void mem_cgroup_move_charge(struct mm_struct *mm) > down_read(&mm->mmap_sem); > for (vma = mm->mmap; vma; vma = vma->vm_next) { > int ret; > + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, > + &mc.to->move_charge_at_immigrate); > struct mm_walk mem_cgroup_move_charge_walk = { > .pmd_entry = mem_cgroup_move_charge_pte_range, > .mm = mm, > @@ -4490,8 +4509,7 @@ static void mem_cgroup_move_charge(struct mm_struct *mm) > }; > if (is_vm_hugetlb_page(vma)) > continue; > - /* TODO: We don't move charges of shmem/tmpfs pages for now. */ > - if (vma->vm_flags & VM_SHARED) > + if ((vma->vm_flags & VM_SHARED) && !move_shmem) > continue; > ret = walk_page_range(vma->vm_start, vma->vm_end, > &mem_cgroup_move_charge_walk); > diff --git a/mm/shmem.c b/mm/shmem.c > index dde4363..cb87365 100644 > --- a/mm/shmem.c > +++ b/mm/shmem.c > @@ -2701,3 +2701,40 @@ int shmem_zero_setup(struct vm_area_struct *vma) > vma->vm_ops = &shmem_vm_ops; > return 0; > } > + > +#ifdef CONFIG_CGROUP_MEM_RES_CTLR > +/** > + * mem_cgroup_get_shmem_target - find a page or entry assigned to the shmem file > + * @inode: the inode to be searched > + * @pgoff: the offset to be searched > + * @pagep: the pointer for the found page to be stored > + * @ent: the pointer for the found swap entry to be stored > + * > + * If a page is found, refcount of it is incremented. Callers should handle > + * these refcount. > + */ > +void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, > + struct page **pagep, swp_entry_t *ent) > +{ > + swp_entry_t entry = { .val = 0 }, *ptr; > + struct page *page = NULL; > + struct shmem_inode_info *info = SHMEM_I(inode); > + > + if ((pgoff << PAGE_CACHE_SHIFT) >= i_size_read(inode)) > + goto out; > + > + spin_lock(&info->lock); > + ptr = shmem_swp_entry(info, pgoff, NULL); > + if (ptr && ptr->val) { > + entry.val = ptr->val; > + page = find_get_page(&swapper_space, entry.val); > + } else > + page = find_get_page(inode->i_mapping, pgoff); > + if (ptr) > + shmem_swp_unmap(ptr); > + spin_unlock(&info->lock); > +out: > + *pagep = page; > + *ent = entry; > +} > +#endif > -- > 1.6.4 > > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-29 4:36 ` KAMEZAWA Hiroyuki @ 2010-03-30 1:33 ` Daisuke Nishimura 2010-03-30 1:58 ` KAMEZAWA Hiroyuki 2010-03-30 2:23 ` KAMEZAWA Hiroyuki 0 siblings, 2 replies; 21+ messages in thread From: Daisuke Nishimura @ 2010-03-30 1:33 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: linux-mm, Andrew Morton, Balbir Singh, Daisuke Nishimura On Mon, 29 Mar 2010 13:36:45 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > Hmm...then, a shmem page is moved even if the task doesn't do page-fault. > Could you clarify > "All pages in the range mapped by a task will be moved to the new group > even if the task doesn't do page fault, i.e. not tasks' RSS." > ? I see. This is the updated version. === From: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> This patch adds support for moving charge of shmem and swap of it. It's enabled by setting bit 2 of <target cgroup>/memory.move_charge_at_immigrate. Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> --- v1->v2 - update a documentation. Documentation/cgroups/memory.txt | 9 +++++- include/linux/swap.h | 5 +++ mm/memcontrol.c | 52 +++++++++++++++++++++++++------------ mm/shmem.c | 37 +++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 19 deletions(-) diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt index c624cd2..4755d5e 100644 --- a/Documentation/cgroups/memory.txt +++ b/Documentation/cgroups/memory.txt @@ -465,13 +465,18 @@ charges should be moved. 1 | A charge of page cache mapped by the target task. Pages mapped by | multiple processes will not be moved. This "page cache" doesn't include | tmpfs. + -----+------------------------------------------------------------------------ + 2 | A charge of a tmpfs page(or swap of it) mapped by the target task. A + | typical use case of it is ipc shared memory. Unlike above 2 cases, all + | pages(and swaps) in the range mapped by the task will be moved even if + | the task hasn't done page fault, i.e. they might not be the task's + | "RSS", but other task's "RSS" that maps the shared memory. You must + | enable Swap Extension(see 2.4) to enable move of swap charges. Note: Those pages and swaps must be charged to the old cgroup. -Note: More type of pages(e.g. shmem) will be supported by other bits in future. 8.3 TODO -- Add support for other types of pages(e.g. file cache, shmem, etc.). - Implement madvise(2) to let users decide the vma to be moved or not to be moved. - All of moving charge operations are done under cgroup_mutex. It's not good diff --git a/include/linux/swap.h b/include/linux/swap.h index 1f59d93..94ec325 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -285,6 +285,11 @@ extern void kswapd_stop(int nid); extern int shmem_unuse(swp_entry_t entry, struct page *page); #endif /* CONFIG_MMU */ +#ifdef CONFIG_CGROUP_MEM_RES_CTLR +extern void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, + struct page **pagep, swp_entry_t *ent); +#endif + extern void swap_unplug_io_fn(struct backing_dev_info *, struct page *); #ifdef CONFIG_SWAP diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 66d2704..99a496c 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -251,6 +251,7 @@ struct mem_cgroup { enum move_type { MOVE_CHARGE_TYPE_ANON, /* private anonymous page and swap of it */ MOVE_CHARGE_TYPE_FILE, /* private file caches */ + MOVE_CHARGE_TYPE_SHMEM, /* shared memory and swap of it */ NR_MOVE_TYPE, }; @@ -4195,12 +4196,30 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, &mc.to->move_charge_at_immigrate); bool move_file = test_bit(MOVE_CHARGE_TYPE_FILE, &mc.to->move_charge_at_immigrate); + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, + &mc.to->move_charge_at_immigrate); + bool is_shmem = false; if (!pte_present(ptent)) { - /* TODO: handle swap of shmes/tmpfs */ - if (pte_none(ptent) || pte_file(ptent)) - return 0; - else if (is_swap_pte(ptent)) { + if (pte_none(ptent) || pte_file(ptent)) { + struct inode *inode; + struct address_space *mapping; + pgoff_t pgoff = 0; + + if (!vma->vm_file) + return 0; + mapping = vma->vm_file->f_mapping; + if (!move_shmem || !mapping_cap_swap_backed(mapping)) + return 0; + + if (pte_none(ptent)) + pgoff = linear_page_index(vma, addr); + if (pte_file(ptent)) + pgoff = pte_to_pgoff(ptent); + inode = vma->vm_file->f_path.dentry->d_inode; + mem_cgroup_get_shmem_target(inode, pgoff, &page, &ent); + is_shmem = true; + } else if (is_swap_pte(ptent)) { ent = pte_to_swp_entry(ptent); if (!move_anon || non_swap_entry(ent)) return 0; @@ -4210,26 +4229,22 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, page = vm_normal_page(vma, addr, ptent); if (!page || !page_mapped(page)) return 0; - /* - * TODO: We don't move charges of shmem/tmpfs pages for now. - */ if (PageAnon(page)) { if (!move_anon) return 0; } else if (page_is_file_cache(page)) { if (!move_file) return 0; - } else - return 0; + } else { + if (!move_shmem) + return 0; + is_shmem = true; + } if (!get_page_unless_zero(page)) return 0; usage_count = page_mapcount(page); } - if (usage_count > 1) { - /* - * TODO: We don't move charges of shared(used by multiple - * processes) pages for now. - */ + if (usage_count > 1 && !is_shmem) { if (page) put_page(page); return 0; @@ -4284,6 +4299,8 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) down_read(&mm->mmap_sem); for (vma = mm->mmap; vma; vma = vma->vm_next) { + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, + &mc.to->move_charge_at_immigrate); struct mm_walk mem_cgroup_count_precharge_walk = { .pmd_entry = mem_cgroup_count_precharge_pte_range, .mm = mm, @@ -4292,7 +4309,7 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) if (is_vm_hugetlb_page(vma)) continue; /* TODO: We don't move charges of shmem/tmpfs pages for now. */ - if (vma->vm_flags & VM_SHARED) + if ((vma->vm_flags & VM_SHARED) && !move_shmem) continue; walk_page_range(vma->vm_start, vma->vm_end, &mem_cgroup_count_precharge_walk); @@ -4483,6 +4500,8 @@ static void mem_cgroup_move_charge(struct mm_struct *mm) down_read(&mm->mmap_sem); for (vma = mm->mmap; vma; vma = vma->vm_next) { int ret; + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, + &mc.to->move_charge_at_immigrate); struct mm_walk mem_cgroup_move_charge_walk = { .pmd_entry = mem_cgroup_move_charge_pte_range, .mm = mm, @@ -4490,8 +4509,7 @@ static void mem_cgroup_move_charge(struct mm_struct *mm) }; if (is_vm_hugetlb_page(vma)) continue; - /* TODO: We don't move charges of shmem/tmpfs pages for now. */ - if (vma->vm_flags & VM_SHARED) + if ((vma->vm_flags & VM_SHARED) && !move_shmem) continue; ret = walk_page_range(vma->vm_start, vma->vm_end, &mem_cgroup_move_charge_walk); diff --git a/mm/shmem.c b/mm/shmem.c index dde4363..cb87365 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -2701,3 +2701,40 @@ int shmem_zero_setup(struct vm_area_struct *vma) vma->vm_ops = &shmem_vm_ops; return 0; } + +#ifdef CONFIG_CGROUP_MEM_RES_CTLR +/** + * mem_cgroup_get_shmem_target - find a page or entry assigned to the shmem file + * @inode: the inode to be searched + * @pgoff: the offset to be searched + * @pagep: the pointer for the found page to be stored + * @ent: the pointer for the found swap entry to be stored + * + * If a page is found, refcount of it is incremented. Callers should handle + * these refcount. + */ +void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, + struct page **pagep, swp_entry_t *ent) +{ + swp_entry_t entry = { .val = 0 }, *ptr; + struct page *page = NULL; + struct shmem_inode_info *info = SHMEM_I(inode); + + if ((pgoff << PAGE_CACHE_SHIFT) >= i_size_read(inode)) + goto out; + + spin_lock(&info->lock); + ptr = shmem_swp_entry(info, pgoff, NULL); + if (ptr && ptr->val) { + entry.val = ptr->val; + page = find_get_page(&swapper_space, entry.val); + } else + page = find_get_page(inode->i_mapping, pgoff); + if (ptr) + shmem_swp_unmap(ptr); + spin_unlock(&info->lock); +out: + *pagep = page; + *ent = entry; +} +#endif -- 1.6.4 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply related [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 1:33 ` [PATCH(v2) " Daisuke Nishimura @ 2010-03-30 1:58 ` KAMEZAWA Hiroyuki 2010-03-30 2:23 ` KAMEZAWA Hiroyuki 1 sibling, 0 replies; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-30 1:58 UTC (permalink / raw) To: Daisuke Nishimura; +Cc: linux-mm, Andrew Morton, Balbir Singh On Tue, 30 Mar 2010 10:33:01 +0900 Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > On Mon, 29 Mar 2010 13:36:45 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > Hmm...then, a shmem page is moved even if the task doesn't do page-fault. > > Could you clarify > > "All pages in the range mapped by a task will be moved to the new group > > even if the task doesn't do page fault, i.e. not tasks' RSS." > > ? > I see. > > This is the updated version. > > === > From: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > > This patch adds support for moving charge of shmem and swap of it. It's enabled > by setting bit 2 of <target cgroup>/memory.move_charge_at_immigrate. > > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> BTW, I'm glad if I can see some clean up around migrations. Total clean up after all necessary functions will be good. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 1:33 ` [PATCH(v2) " Daisuke Nishimura 2010-03-30 1:58 ` KAMEZAWA Hiroyuki @ 2010-03-30 2:23 ` KAMEZAWA Hiroyuki 2010-03-30 2:49 ` Daisuke Nishimura 1 sibling, 1 reply; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-30 2:23 UTC (permalink / raw) To: Daisuke Nishimura; +Cc: linux-mm, Andrew Morton, Balbir Singh On Tue, 30 Mar 2010 10:33:01 +0900 Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > On Mon, 29 Mar 2010 13:36:45 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > Hmm...then, a shmem page is moved even if the task doesn't do page-fault. > > Could you clarify > > "All pages in the range mapped by a task will be moved to the new group > > even if the task doesn't do page fault, i.e. not tasks' RSS." > > ? > I see. > > This is the updated version. > Ah, sorry. one more quesiton. > === > From: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > > This patch adds support for moving charge of shmem and swap of it. It's enabled > by setting bit 2 of <target cgroup>/memory.move_charge_at_immigrate. > > Signed-off-by: Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> > --- > v1->v2 > - update a documentation. > > Documentation/cgroups/memory.txt | 9 +++++- > include/linux/swap.h | 5 +++ > mm/memcontrol.c | 52 +++++++++++++++++++++++++------------ > mm/shmem.c | 37 +++++++++++++++++++++++++++ > 4 files changed, 84 insertions(+), 19 deletions(-) > > diff --git a/Documentation/cgroups/memory.txt b/Documentation/cgroups/memory.txt > index c624cd2..4755d5e 100644 > --- a/Documentation/cgroups/memory.txt > +++ b/Documentation/cgroups/memory.txt > @@ -465,13 +465,18 @@ charges should be moved. > 1 | A charge of page cache mapped by the target task. Pages mapped by > | multiple processes will not be moved. This "page cache" doesn't include > | tmpfs. > + -----+------------------------------------------------------------------------ > + 2 | A charge of a tmpfs page(or swap of it) mapped by the target task. A > + | typical use case of it is ipc shared memory. Unlike above 2 cases, all > + | pages(and swaps) in the range mapped by the task will be moved even if > + | the task hasn't done page fault, i.e. they might not be the task's > + | "RSS", but other task's "RSS" that maps the shared memory. You must > + | enable Swap Extension(see 2.4) to enable move of swap charges. > > Note: Those pages and swaps must be charged to the old cgroup. > -Note: More type of pages(e.g. shmem) will be supported by other bits in future. > > 8.3 TODO > > -- Add support for other types of pages(e.g. file cache, shmem, etc.). > - Implement madvise(2) to let users decide the vma to be moved or not to be > moved. > - All of moving charge operations are done under cgroup_mutex. It's not good > diff --git a/include/linux/swap.h b/include/linux/swap.h > index 1f59d93..94ec325 100644 > --- a/include/linux/swap.h > +++ b/include/linux/swap.h > @@ -285,6 +285,11 @@ extern void kswapd_stop(int nid); > extern int shmem_unuse(swp_entry_t entry, struct page *page); > #endif /* CONFIG_MMU */ > > +#ifdef CONFIG_CGROUP_MEM_RES_CTLR > +extern void mem_cgroup_get_shmem_target(struct inode *inode, pgoff_t pgoff, > + struct page **pagep, swp_entry_t *ent); > +#endif > + > extern void swap_unplug_io_fn(struct backing_dev_info *, struct page *); > > #ifdef CONFIG_SWAP > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 66d2704..99a496c 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -251,6 +251,7 @@ struct mem_cgroup { > enum move_type { > MOVE_CHARGE_TYPE_ANON, /* private anonymous page and swap of it */ > MOVE_CHARGE_TYPE_FILE, /* private file caches */ > + MOVE_CHARGE_TYPE_SHMEM, /* shared memory and swap of it */ > NR_MOVE_TYPE, > }; > > @@ -4195,12 +4196,30 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, > &mc.to->move_charge_at_immigrate); > bool move_file = test_bit(MOVE_CHARGE_TYPE_FILE, > &mc.to->move_charge_at_immigrate); > + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, > + &mc.to->move_charge_at_immigrate); > + bool is_shmem = false; > > if (!pte_present(ptent)) { > - /* TODO: handle swap of shmes/tmpfs */ > - if (pte_none(ptent) || pte_file(ptent)) > - return 0; > - else if (is_swap_pte(ptent)) { > + if (pte_none(ptent) || pte_file(ptent)) { > + struct inode *inode; > + struct address_space *mapping; > + pgoff_t pgoff = 0; > + > + if (!vma->vm_file) > + return 0; > + mapping = vma->vm_file->f_mapping; > + if (!move_shmem || !mapping_cap_swap_backed(mapping)) > + return 0; > + > + if (pte_none(ptent)) > + pgoff = linear_page_index(vma, addr); > + if (pte_file(ptent)) > + pgoff = pte_to_pgoff(ptent); > + inode = vma->vm_file->f_path.dentry->d_inode; > + mem_cgroup_get_shmem_target(inode, pgoff, &page, &ent); > + is_shmem = true; > + } else if (is_swap_pte(ptent)) { > ent = pte_to_swp_entry(ptent); > if (!move_anon || non_swap_entry(ent)) > return 0; > @@ -4210,26 +4229,22 @@ static int is_target_pte_for_mc(struct vm_area_struct *vma, > page = vm_normal_page(vma, addr, ptent); > if (!page || !page_mapped(page)) > return 0; > - /* > - * TODO: We don't move charges of shmem/tmpfs pages for now. > - */ > if (PageAnon(page)) { > if (!move_anon) > return 0; > } else if (page_is_file_cache(page)) { > if (!move_file) > return 0; > - } else > - return 0; > + } else { > + if (!move_shmem) > + return 0; > + is_shmem = true; > + } > if (!get_page_unless_zero(page)) > return 0; > usage_count = page_mapcount(page); > } > - if (usage_count > 1) { > - /* > - * TODO: We don't move charges of shared(used by multiple > - * processes) pages for now. > - */ > + if (usage_count > 1 && !is_shmem) { > if (page) > put_page(page); > return 0; > @@ -4284,6 +4299,8 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) > > down_read(&mm->mmap_sem); > for (vma = mm->mmap; vma; vma = vma->vm_next) { > + bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, > + &mc.to->move_charge_at_immigrate); > struct mm_walk mem_cgroup_count_precharge_walk = { > .pmd_entry = mem_cgroup_count_precharge_pte_range, > .mm = mm, > @@ -4292,7 +4309,7 @@ static unsigned long mem_cgroup_count_precharge(struct mm_struct *mm) > if (is_vm_hugetlb_page(vma)) > continue; > /* TODO: We don't move charges of shmem/tmpfs pages for now. */ > - if (vma->vm_flags & VM_SHARED) > + if ((vma->vm_flags & VM_SHARED) && !move_shmem) > continue; SHARED mapped file cache is not moved by patch [1/2] ??? It sounds strange. Thanks, -Kame -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 2:23 ` KAMEZAWA Hiroyuki @ 2010-03-30 2:49 ` Daisuke Nishimura 2010-03-30 3:11 ` KAMEZAWA Hiroyuki 0 siblings, 1 reply; 21+ messages in thread From: Daisuke Nishimura @ 2010-03-30 2:49 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: linux-mm, Andrew Morton, Balbir Singh, Daisuke Nishimura On Tue, 30 Mar 2010 11:23:01 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > SHARED mapped file cache is not moved by patch [1/2] ??? > It sounds strange. > hmm, I'm sorry I'm not so good at user applications, but is it usual to use VM_SHARED file caches(!tmpfs) ? And is it better for us to move them only when page_mapcount() == 1 ? Thanks, Daisuke Nishimura. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 2:49 ` Daisuke Nishimura @ 2010-03-30 3:11 ` KAMEZAWA Hiroyuki 2010-03-30 4:06 ` Daisuke Nishimura 0 siblings, 1 reply; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-30 3:11 UTC (permalink / raw) To: Daisuke Nishimura; +Cc: linux-mm, Andrew Morton, Balbir Singh On Tue, 30 Mar 2010 11:49:03 +0900 Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > On Tue, 30 Mar 2010 11:23:01 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > SHARED mapped file cache is not moved by patch [1/2] ??? > > It sounds strange. > > > hmm, I'm sorry I'm not so good at user applications, but is it usual to use > VM_SHARED file caches(!tmpfs) ? > And is it better for us to move them only when page_mapcount() == 1 ? > Considering shared library which has only one user, moving MAP_SHARED makes sense. Unfortunately, there are people who creates their own shared library just for their private dlopen() etc. (shared library for private use...) So, I think moving MAP_SHARED files makes sense. Thanks, -Kame -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 3:11 ` KAMEZAWA Hiroyuki @ 2010-03-30 4:06 ` Daisuke Nishimura 2010-03-30 4:51 ` KAMEZAWA Hiroyuki 0 siblings, 1 reply; 21+ messages in thread From: Daisuke Nishimura @ 2010-03-30 4:06 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: linux-mm, Andrew Morton, Balbir Singh, Daisuke Nishimura On Tue, 30 Mar 2010 12:11:19 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > On Tue, 30 Mar 2010 11:49:03 +0900 > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > On Tue, 30 Mar 2010 11:23:01 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > SHARED mapped file cache is not moved by patch [1/2] ??? > > > It sounds strange. > > > > > hmm, I'm sorry I'm not so good at user applications, but is it usual to use > > VM_SHARED file caches(!tmpfs) ? > > And is it better for us to move them only when page_mapcount() == 1 ? > > > > Considering shared library which has only one user, moving MAP_SHARED makes sense. > Unfortunately, there are people who creates their own shared library just for > their private dlopen() etc. (shared library for private use...) > > So, I think moving MAP_SHARED files makes sense. > Thank you for your explanations. I'll update my patches to allow to move MAP_SHARED(but page_mapcount() == 1) file caches, and resend. Thanks, Daisuke Nishimura. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 4:06 ` Daisuke Nishimura @ 2010-03-30 4:51 ` KAMEZAWA Hiroyuki 2010-03-30 5:00 ` Balbir Singh 0 siblings, 1 reply; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-30 4:51 UTC (permalink / raw) To: Daisuke Nishimura; +Cc: linux-mm, Andrew Morton, Balbir Singh On Tue, 30 Mar 2010 13:06:48 +0900 Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > On Tue, 30 Mar 2010 12:11:19 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > On Tue, 30 Mar 2010 11:49:03 +0900 > > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > > > On Tue, 30 Mar 2010 11:23:01 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > > SHARED mapped file cache is not moved by patch [1/2] ??? > > > > It sounds strange. > > > > > > > hmm, I'm sorry I'm not so good at user applications, but is it usual to use > > > VM_SHARED file caches(!tmpfs) ? > > > And is it better for us to move them only when page_mapcount() == 1 ? > > > > > > > Considering shared library which has only one user, moving MAP_SHARED makes sense. > > Unfortunately, there are people who creates their own shared library just for > > their private dlopen() etc. (shared library for private use...) > > > > So, I think moving MAP_SHARED files makes sense. > > > Thank you for your explanations. > I'll update my patches to allow to move MAP_SHARED(but page_mapcount() == 1) > file caches, and resend. > Hmm, considering again...current summary is following...right ? - If page is an anon, it's not moved if page_mapcount() > 2. - If page is a page cache, it's not moved if page_mapcount() > 2. - If page is a shmem, it's not moved regardless of mapcount. - If pte is swap, it's not moved refcnt > 2. I think following is straightforward and simple. - If page is an anon or swap of anon, it's not moved if referer > 2. (i.e. inherited from it's parent) - If page is file,shmem or swap of shmem, it's moved regardless of referer. But pages only under "from" memcg can be moved. I doubt adding too much speciality to shmem is not good. How do you think ? Thanks, -Kame -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 4:51 ` KAMEZAWA Hiroyuki @ 2010-03-30 5:00 ` Balbir Singh 2010-03-30 5:09 ` KAMEZAWA Hiroyuki 2010-03-30 5:30 ` Daisuke Nishimura 0 siblings, 2 replies; 21+ messages in thread From: Balbir Singh @ 2010-03-30 5:00 UTC (permalink / raw) To: KAMEZAWA Hiroyuki; +Cc: Daisuke Nishimura, linux-mm, Andrew Morton * KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> [2010-03-30 13:51:59]: > On Tue, 30 Mar 2010 13:06:48 +0900 > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > On Tue, 30 Mar 2010 12:11:19 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > On Tue, 30 Mar 2010 11:49:03 +0900 > > > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > > > > > On Tue, 30 Mar 2010 11:23:01 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > > > SHARED mapped file cache is not moved by patch [1/2] ??? > > > > > It sounds strange. > > > > > > > > > hmm, I'm sorry I'm not so good at user applications, but is it usual to use > > > > VM_SHARED file caches(!tmpfs) ? > > > > And is it better for us to move them only when page_mapcount() == 1 ? > > > > > > > > > > Considering shared library which has only one user, moving MAP_SHARED makes sense. > > > Unfortunately, there are people who creates their own shared library just for > > > their private dlopen() etc. (shared library for private use...) > > > > > > So, I think moving MAP_SHARED files makes sense. > > > IIRC, the libraries are loaded with MAP_PRIVATE and MAP_SHARED is not set. > > Thank you for your explanations. > > I'll update my patches to allow to move MAP_SHARED(but page_mapcount() == 1) > > file caches, and resend. > > > > Hmm, considering again...current summary is following...right ? > > - If page is an anon, it's not moved if page_mapcount() > 2. > - If page is a page cache, it's not moved if page_mapcount() > 2. > - If page is a shmem, it's not moved regardless of mapcount. > - If pte is swap, it's not moved refcnt > 2. > > I think following is straightforward and simple. > > - If page is an anon or swap of anon, it's not moved if referer > 2. What is referer in this context? The cgroup refering to the page? > (i.e. inherited from it's parent) > - If page is file,shmem or swap of shmem, it's moved regardless of referer. > But pages only under "from" memcg can be moved. > > I doubt adding too much speciality to shmem is not good. > Yep, I tend to agree, but I need to take a closer look again at the patches. -- Three Cheers, Balbir -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 5:00 ` Balbir Singh @ 2010-03-30 5:09 ` KAMEZAWA Hiroyuki 2010-03-30 5:30 ` Daisuke Nishimura 1 sibling, 0 replies; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-30 5:09 UTC (permalink / raw) To: balbir; +Cc: Daisuke Nishimura, linux-mm, Andrew Morton On Tue, 30 Mar 2010 10:30:50 +0530 Balbir Singh <balbir@linux.vnet.ibm.com> wrote: > * KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> [2010-03-30 13:51:59]: > > > > Considering shared library which has only one user, moving MAP_SHARED makes sense. > > > > Unfortunately, there are people who creates their own shared library just for > > > > their private dlopen() etc. (shared library for private use...) > > > > > > > > So, I think moving MAP_SHARED files makes sense. > > > > > > IIRC, the libraries are loaded with MAP_PRIVATE and MAP_SHARED is not > set. > Ah, yes. I was wrong. But changing handling of MAP_SHARED/MAP_PRIVATE is not good. It will give much confusion to users. > > > Thank you for your explanations. > > > I'll update my patches to allow to move MAP_SHARED(but page_mapcount() == 1) > > > file caches, and resend. > > > > > > > Hmm, considering again...current summary is following...right ? > > > > - If page is an anon, it's not moved if page_mapcount() > 2. > > - If page is a page cache, it's not moved if page_mapcount() > 2. > > - If page is a shmem, it's not moved regardless of mapcount. > > - If pte is swap, it's not moved refcnt > 2. > > > > I think following is straightforward and simple. > > > > - If page is an anon or swap of anon, it's not moved if referer > 2. > > What is referer in this context? The cgroup refering to the page? > page_mapcount(page) + refcnt_to_swap_entry(ent.val) Bye. -Kame > > (i.e. inherited from it's parent) > > - If page is file,shmem or swap of shmem, it's moved regardless of referer. > > But pages only under "from" memcg can be moved. > > > > I doubt adding too much speciality to shmem is not good. > > > > Yep, I tend to agree, but I need to take a closer look again at the > patches. > > -- > Three Cheers, > Balbir > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 5:00 ` Balbir Singh 2010-03-30 5:09 ` KAMEZAWA Hiroyuki @ 2010-03-30 5:30 ` Daisuke Nishimura 2010-03-30 5:44 ` KAMEZAWA Hiroyuki 1 sibling, 1 reply; 21+ messages in thread From: Daisuke Nishimura @ 2010-03-30 5:30 UTC (permalink / raw) To: Balbir Singh Cc: KAMEZAWA Hiroyuki, linux-mm, Andrew Morton, Daisuke Nishimura On Tue, 30 Mar 2010 10:30:50 +0530, Balbir Singh <balbir@linux.vnet.ibm.com> wrote: > * KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> [2010-03-30 13:51:59]: > > > On Tue, 30 Mar 2010 13:06:48 +0900 > > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > > > On Tue, 30 Mar 2010 12:11:19 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > > On Tue, 30 Mar 2010 11:49:03 +0900 > > > > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > > > > > > > On Tue, 30 Mar 2010 11:23:01 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > > > > SHARED mapped file cache is not moved by patch [1/2] ??? > > > > > > It sounds strange. > > > > > > > > > > > hmm, I'm sorry I'm not so good at user applications, but is it usual to use > > > > > VM_SHARED file caches(!tmpfs) ? > > > > > And is it better for us to move them only when page_mapcount() == 1 ? > > > > > > > > > > > > > Considering shared library which has only one user, moving MAP_SHARED makes sense. > > > > Unfortunately, there are people who creates their own shared library just for > > > > their private dlopen() etc. (shared library for private use...) > > > > > > > > So, I think moving MAP_SHARED files makes sense. > > > > > > IIRC, the libraries are loaded with MAP_PRIVATE and MAP_SHARED is not > set. > Thank you for your information. > > > Thank you for your explanations. > > > I'll update my patches to allow to move MAP_SHARED(but page_mapcount() == 1) > > > file caches, and resend. > > > > > > > Hmm, considering again...current summary is following...right ? > > > > - If page is an anon, it's not moved if page_mapcount() > 2. > > - If page is a page cache, it's not moved if page_mapcount() > 2. > > - If page is a shmem, it's not moved regardless of mapcount. > > - If pte is swap, it's not moved refcnt > 2. > > Right. > > I think following is straightforward and simple. > > > > - If page is an anon or swap of anon, it's not moved if referer > 2. > > What is referer in this context? The cgroup refering to the page? > > > (i.e. inherited from it's parent) > > - If page is file,shmem or swap of shmem, it's moved regardless of referer. > > But pages only under "from" memcg can be moved. > > > > I doubt adding too much speciality to shmem is not good. > > > > Yep, I tend to agree, but I need to take a closer look again at the > patches. > I agree it would be more simple. I selected the current policy because I was not sure whether we should move file caches(!tmpfs) with mapcount > 1, and, IMHO, shared memory and file caches are different for users. But it's O.K. for me to change current policy. Thanks, Daisuke Nishimura. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 5:30 ` Daisuke Nishimura @ 2010-03-30 5:44 ` KAMEZAWA Hiroyuki 2010-03-30 6:29 ` KAMEZAWA Hiroyuki 0 siblings, 1 reply; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-30 5:44 UTC (permalink / raw) To: Daisuke Nishimura; +Cc: Balbir Singh, linux-mm, Andrew Morton On Tue, 30 Mar 2010 14:30:38 +0900 Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > On Tue, 30 Mar 2010 10:30:50 +0530, Balbir Singh <balbir@linux.vnet.ibm.com> wrote: > > * KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> [2010-03-30 13:51:59]: > > Yep, I tend to agree, but I need to take a closer look again at the > > patches. > > > I agree it would be more simple. I selected the current policy because > I was not sure whether we should move file caches(!tmpfs) with mapcount > 1, > and, IMHO, shared memory and file caches are different for users. > But it's O.K. for me to change current policy. > To explain what I think of, I wrote a patch onto yours. (Maybe overkill for explaination ;) Summary. + adding move_anon, move_file, move_shmem information to move_charge_struct. + adding hanlders for each pte types. + checking # of referer should be divided to each type. It's complicated to catch all cases in one "if" sentense. + FILE pages will be moved if it's charged against "from". no mapcount check. i.e. FILE pages should be moved even if it's not page-faulted. + ANON pages will be moved if it's really private. For widely shared FILE, "if it's charged against "from"" is enough good limitation. --- mm/memcontrol.c | 265 +++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 170 insertions(+), 95 deletions(-) Index: mmotm-2.6.34-Mar24/mm/memcontrol.c =================================================================== --- mmotm-2.6.34-Mar24.orig/mm/memcontrol.c +++ mmotm-2.6.34-Mar24/mm/memcontrol.c @@ -263,6 +263,10 @@ static struct move_charge_struct { unsigned long moved_charge; unsigned long moved_swap; struct task_struct *moving_task; /* a task moving charges */ + /* move type attributes */ + unsigned move_anon:1; + unsigned move_file:1; + unsigned move_shmem:1; wait_queue_head_t waitq; /* a waitq for other context */ } mc = { .waitq = __WAIT_QUEUE_HEAD_INITIALIZER(mc.waitq), @@ -4184,6 +4188,112 @@ enum mc_target_type { MC_TARGET_SWAP, }; +/* + * Hanlder for 4 pte types (present, nont, pte_file, swap_entry). + */ +static struct page *__mc_handle_present_pte(struct vm_area_struct *vma, + unsigned long addr, pte_t ptent) +{ + struct page *page = vm_normal_page(vma, addr, ptent); + + if (PageAnon(page)) { + /* we don't move shared anon */ + if (!mc.move_anon || page_mapcount(page) > 2) + return NULL; + } else if (page_is_file_cache(page)) { + if (!mc.move_file) + return NULL; + } else if (!mc.move_shmem) + return NULL; + + if (!get_page_unless_zero(page)) + return NULL; + + return page; +} + +static struct page *__mc_handle_pte_none(struct vm_area_struct *vma, + unsigned long addr, swp_entry_t *ent) +{ + struct page *page; + pgoff_t pgoff; + struct inode *inode; + struct address_space *mapping; + + if (!vma->vm_file) /* Fully anonymous vma. */ + return NULL; + inode = vma->vm_file->f_path.dentry->d_inode; + mapping = inode->i_mapping; + + pgoff = linear_page_index(vma, addr); + + if (!mapping_cap_swap_backed(mapping)) { /* usual file */ + if (!mc.move_file) + return NULL; + page = find_get_page(mapping, pgoff); + /* page is moved even if it's not mapped (page-faulted) */ + } else { + /* For shmem and tmpfs. We do swap accounting then... */ + if (!mc.move_shmem) + return NULL; + mem_cgroup_get_shmem_target(inode, pgoff, &page, ent); + } + return page; +} + +static struct page *__mc_handle_pte_file(struct vm_area_struct *vma, + unsigned long addr, pte_t ptent, swp_entry_t *ent) +{ + struct page *page; + pgoff_t pgoff; + struct inode *inode; + struct address_space *mapping; + + if (!vma->vm_file) /* Fully anonymous vma. */ + return NULL; + inode = vma->vm_file->f_path.dentry->d_inode; + mapping = inode->i_mapping; + + pgoff = pte_to_pgoff(ptent); + + if (!mapping_cap_swap_backed(mapping)) { /* usual file */ + if (!mc.move_file) + return NULL; + page = find_get_page(mapping, pgoff); + /* page is moved even if it's not mapped (page-faulted) */ + } else { + /* shmem, tmpfs file. We do swap accounting then... */ + if (!mc.move_shmem) + return NULL; + mem_cgroup_get_shmem_target(inode, pgoff, &page, ent); + if (!page && !do_swap_account) { + ent->val = 0; + return NULL; + } + } + return page; +} + +static struct page *__mc_handle_pte_swap(struct vm_area_struct *vma, + unsigned long addr, pte_t ptent, swp_entry_t *ent) +{ + int count; + struct page *page; + + *ent = pte_to_swp_entry(ptent); + if (!do_swap_account || non_swap_entry(*ent)) + return NULL; + count = mem_cgroup_count_swap_user(*ent, &page); + if (count > 1) { /* We don't move shared anon */ + if (page) + put_page(page); + ent->val = 0; + return NULL; + } + return page; +} + + static int is_target_pte_for_mc(struct vm_area_struct *vma, unsigned long addr, pte_t ptent, union mc_target *target) { @@ -4191,70 +4301,27 @@ static int is_target_pte_for_mc(struct v struct page_cgroup *pc; int ret = 0; swp_entry_t ent = { .val = 0 }; - int usage_count = 0; - bool move_anon = test_bit(MOVE_CHARGE_TYPE_ANON, - &mc.to->move_charge_at_immigrate); - bool move_file = test_bit(MOVE_CHARGE_TYPE_FILE, - &mc.to->move_charge_at_immigrate); - bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, - &mc.to->move_charge_at_immigrate); - bool is_shmem = false; - if (!pte_present(ptent)) { - if (pte_none(ptent) || pte_file(ptent)) { - struct inode *inode; - struct address_space *mapping; - pgoff_t pgoff = 0; - - if (!vma->vm_file) - return 0; - mapping = vma->vm_file->f_mapping; - if (!move_shmem || !mapping_cap_swap_backed(mapping)) - return 0; - - if (pte_none(ptent)) - pgoff = linear_page_index(vma, addr); - if (pte_file(ptent)) - pgoff = pte_to_pgoff(ptent); - inode = vma->vm_file->f_path.dentry->d_inode; - mem_cgroup_get_shmem_target(inode, pgoff, &page, &ent); - is_shmem = true; - } else if (is_swap_pte(ptent)) { - ent = pte_to_swp_entry(ptent); - if (!move_anon || non_swap_entry(ent)) - return 0; - usage_count = mem_cgroup_count_swap_user(ent, &page); - } - } else { - page = vm_normal_page(vma, addr, ptent); - if (!page || !page_mapped(page)) - return 0; - if (PageAnon(page)) { - if (!move_anon) - return 0; - } else if (page_is_file_cache(page)) { - if (!move_file) - return 0; - } else { - if (!move_shmem) - return 0; - is_shmem = true; - } - if (!get_page_unless_zero(page)) - return 0; - usage_count = page_mapcount(page); - } - if (usage_count > 1 && !is_shmem) { - if (page) - put_page(page); + if (pte_present(ptent)) + page = __mc_handle_present_pte(vma, addr, ptent); + else if (pte_none(ptent) && (mc.move_file || mc.move_shmem)) + page = __mc_handle_pte_none(vma, addr, &ent); + else if (pte_file(ptent) && (mc.move_file || mc.move_shmem)) + page = __mc_handle_pte_file(vma, addr, ptent, &ent); + else if (is_swap_pte(ptent) && mc.move_anon) + page = __mc_handle_pte_swap(vma, addr, ptent, &ent); + else return 0; - } + + if (!page && !ent.val) + return 0; + if (page) { pc = lookup_page_cgroup(page); /* * Do only loose check w/o page_cgroup lock. - * mem_cgroup_move_account() checks the pc is valid or not under - * the lock. + * mem_cgroup_move_account() checks the pc is valid or + * not under the lock. */ if (PageCgroupUsed(pc) && pc->mem_cgroup == mc.from) { ret = MC_TARGET_PAGE; @@ -4264,12 +4331,13 @@ static int is_target_pte_for_mc(struct v if (!ret || !target) put_page(page); } - /* throught */ - if (ent.val && do_swap_account && !ret && - css_id(&mc.from->css) == lookup_swap_cgroup(ent)) { - ret = MC_TARGET_SWAP; - if (target) - target->ent = ent; + /* Threre is a swap entry and a page doesn't exist or isn't charged */ + if (!ret && ent.val) { + if (css_id(&mc.from->css) == lookup_swap_cgroup(ent)) { + ret = MC_TARGET_SWAP; + if (target) + target->ent = ent; + } } return ret; } @@ -4370,6 +4438,9 @@ static void mem_cgroup_clear_mc(void) mc.from = NULL; mc.to = NULL; mc.moving_task = NULL; + mc.move_anon = 0; + mc.move_file = 0; + mc.move_shmem = 0; wake_up_all(&mc.waitq); } @@ -4380,37 +4451,44 @@ static int mem_cgroup_can_attach(struct { int ret = 0; struct mem_cgroup *mem = mem_cgroup_from_cont(cgroup); + struct mm_struct *mm; + struct mem_cgroup *from = mem_cgroup_from_task(p); - if (mem->move_charge_at_immigrate) { - struct mm_struct *mm; - struct mem_cgroup *from = mem_cgroup_from_task(p); + if (!mem->move_charge_at_immigrate) + return 0; - VM_BUG_ON(from == mem); + VM_BUG_ON(from == mem); - mm = get_task_mm(p); - if (!mm) - return 0; - /* We move charges only when we move a owner of the mm */ - if (mm->owner == p) { - VM_BUG_ON(mc.from); - VM_BUG_ON(mc.to); - VM_BUG_ON(mc.precharge); - VM_BUG_ON(mc.moved_charge); - VM_BUG_ON(mc.moved_swap); - VM_BUG_ON(mc.moving_task); - mc.from = from; - mc.to = mem; - mc.precharge = 0; - mc.moved_charge = 0; - mc.moved_swap = 0; - mc.moving_task = current; + mm = get_task_mm(p); + if (!mm) + return 0; + if (mm->owner != p) + goto out; + /* We move charges only when we move a owner of the mm */ + VM_BUG_ON(mc.from); + VM_BUG_ON(mc.to); + VM_BUG_ON(mc.precharge); + VM_BUG_ON(mc.moved_charge); + VM_BUG_ON(mc.moved_swap); + VM_BUG_ON(mc.moving_task); + mc.from = from; + mc.to = mem; + mc.precharge = 0; + mc.moved_charge = 0; + mc.moved_swap = 0; + mc.moving_task = current; + if (test_bit(MOVE_CHARGE_TYPE_ANON, &mem->move_charge_at_immigrate)) + mc.move_anon = 1; + if (test_bit(MOVE_CHARGE_TYPE_FILE, &mem->move_charge_at_immigrate)) + mc.move_file = 1; + if (test_bit(MOVE_CHARGE_TYPE_SHMEM, &mem->move_charge_at_immigrate)) + mc.move_shmem = 1; - ret = mem_cgroup_precharge_mc(mm); - if (ret) - mem_cgroup_clear_mc(); - } - mmput(mm); - } + ret = mem_cgroup_precharge_mc(mm); + if (ret) + mem_cgroup_clear_mc(); +out: + mmput(mm); return ret; } @@ -4500,8 +4578,6 @@ static void mem_cgroup_move_charge(struc down_read(&mm->mmap_sem); for (vma = mm->mmap; vma; vma = vma->vm_next) { int ret; - bool move_shmem = test_bit(MOVE_CHARGE_TYPE_SHMEM, - &mc.to->move_charge_at_immigrate); struct mm_walk mem_cgroup_move_charge_walk = { .pmd_entry = mem_cgroup_move_charge_pte_range, .mm = mm, @@ -4509,8 +4585,7 @@ static void mem_cgroup_move_charge(struc }; if (is_vm_hugetlb_page(vma)) continue; - if ((vma->vm_flags & VM_SHARED) && !move_shmem) - continue; + ret = walk_page_range(vma->vm_start, vma->vm_end, &mem_cgroup_move_charge_walk); if (ret) -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 5:44 ` KAMEZAWA Hiroyuki @ 2010-03-30 6:29 ` KAMEZAWA Hiroyuki 2010-03-31 0:34 ` Daisuke Nishimura 0 siblings, 1 reply; 21+ messages in thread From: KAMEZAWA Hiroyuki @ 2010-03-30 6:29 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Daisuke Nishimura, Balbir Singh, linux-mm, Andrew Morton On Tue, 30 Mar 2010 14:44:58 +0900 KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > On Tue, 30 Mar 2010 14:30:38 +0900 > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > On Tue, 30 Mar 2010 10:30:50 +0530, Balbir Singh <balbir@linux.vnet.ibm.com> wrote: > > > * KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> [2010-03-30 13:51:59]: > > > Yep, I tend to agree, but I need to take a closer look again at the > > > patches. > > > > > I agree it would be more simple. I selected the current policy because > > I was not sure whether we should move file caches(!tmpfs) with mapcount > 1, > > and, IMHO, shared memory and file caches are different for users. > > But it's O.K. for me to change current policy. > > > > To explain what I think of, I wrote a patch onto yours. (Maybe overkill for explaination ;) > > Summary. > > + adding move_anon, move_file, move_shmem information to move_charge_struct. > + adding hanlders for each pte types. > + checking # of referer should be divided to each type. > It's complicated to catch all cases in one "if" sentense. > + FILE pages will be moved if it's charged against "from". no mapcount check. > i.e. FILE pages should be moved even if it's not page-faulted. > + ANON pages will be moved if it's really private. > > For widely shared FILE, "if it's charged against "from"" is enough good limitation. > > Hmm....how about changing meanings of new flags ? 1 : a charge of page caches are moved. Page cache means cache of regular files and shared memory. But only privately mapped pages (mapcount==1) are moved. 2 : a charge of page caches are moved. Page cache means cache of regular files and shared memory. They are moved even if it's shared among processes. When both of 1 and 2 are specified, "2" is used. Anonymous pages will not be moved if it's shared. Then, total view of user interface will be simple and I think this will allow what you want. Thanks, -Kame -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [PATCH(v2) -mmotm 2/2] memcg move charge of shmem at task migration 2010-03-30 6:29 ` KAMEZAWA Hiroyuki @ 2010-03-31 0:34 ` Daisuke Nishimura 0 siblings, 0 replies; 21+ messages in thread From: Daisuke Nishimura @ 2010-03-31 0:34 UTC (permalink / raw) To: KAMEZAWA Hiroyuki Cc: Balbir Singh, linux-mm, Andrew Morton, Daisuke Nishimura On Tue, 30 Mar 2010 15:29:58 +0900, KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > On Tue, 30 Mar 2010 14:44:58 +0900 > KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> wrote: > > > On Tue, 30 Mar 2010 14:30:38 +0900 > > Daisuke Nishimura <nishimura@mxp.nes.nec.co.jp> wrote: > > > > > On Tue, 30 Mar 2010 10:30:50 +0530, Balbir Singh <balbir@linux.vnet.ibm.com> wrote: > > > > * KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> [2010-03-30 13:51:59]: > > > > Yep, I tend to agree, but I need to take a closer look again at the > > > > patches. > > > > > > > I agree it would be more simple. I selected the current policy because > > > I was not sure whether we should move file caches(!tmpfs) with mapcount > 1, > > > and, IMHO, shared memory and file caches are different for users. > > > But it's O.K. for me to change current policy. > > > > > > > To explain what I think of, I wrote a patch onto yours. (Maybe overkill for explaination ;) > > > > Summary. > > > > + adding move_anon, move_file, move_shmem information to move_charge_struct. > > + adding hanlders for each pte types. > > + checking # of referer should be divided to each type. > > It's complicated to catch all cases in one "if" sentense. > > + FILE pages will be moved if it's charged against "from". no mapcount check. > > i.e. FILE pages should be moved even if it's not page-faulted. > > + ANON pages will be moved if it's really private. > > > > For widely shared FILE, "if it's charged against "from"" is enough good limitation. > > > > > > Hmm....how about changing meanings of new flags ? > > 1 : a charge of page caches are moved. Page cache means cache of regular files > and shared memory. But only privately mapped pages (mapcount==1) are moved. > > 2 : a charge of page caches are moved. Page cache means cache of regular files > and shared memory. They are moved even if it's shared among processes. > > When both of 1 and 2 are specified, "2" is used. Anonymous pages will not be > moved if it's shared. > > Then, total view of user interface will be simple and I think this will allow > what you want. > Thank you for your suggestion. It would be simple. I'll try in that way. Thanks, Daisuke Nishimura. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a> ^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2010-03-31 0:39 UTC | newest] Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2010-03-29 3:02 [PATCH -mmotm 0/2] memcg: move charge of file cache/shmem Daisuke Nishimura 2010-03-29 3:03 ` [PATCH -mmotm 1/2] memcg move charge of file cache at task migration Daisuke Nishimura 2010-03-29 4:15 ` KAMEZAWA Hiroyuki 2010-03-30 1:32 ` [PATCH(v2) " Daisuke Nishimura 2010-03-30 1:50 ` KAMEZAWA Hiroyuki 2010-03-30 5:46 ` Balbir Singh 2010-03-29 3:03 ` [PATCH -mmotm 2/2] memcg move charge of shmem " Daisuke Nishimura 2010-03-29 4:36 ` KAMEZAWA Hiroyuki 2010-03-30 1:33 ` [PATCH(v2) " Daisuke Nishimura 2010-03-30 1:58 ` KAMEZAWA Hiroyuki 2010-03-30 2:23 ` KAMEZAWA Hiroyuki 2010-03-30 2:49 ` Daisuke Nishimura 2010-03-30 3:11 ` KAMEZAWA Hiroyuki 2010-03-30 4:06 ` Daisuke Nishimura 2010-03-30 4:51 ` KAMEZAWA Hiroyuki 2010-03-30 5:00 ` Balbir Singh 2010-03-30 5:09 ` KAMEZAWA Hiroyuki 2010-03-30 5:30 ` Daisuke Nishimura 2010-03-30 5:44 ` KAMEZAWA Hiroyuki 2010-03-30 6:29 ` KAMEZAWA Hiroyuki 2010-03-31 0:34 ` Daisuke Nishimura
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.