lkml.org 
[lkml]   [2012]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH v4] memcg: remove PCG_CACHE page_cgroup flag
On Tue 24-01-12 17:44:49, Johannes Weiner wrote:
> On Tue, Jan 24, 2012 at 05:01:40PM +0100, Michal Hocko wrote:
> > On Tue 24-01-12 15:54:11, Johannes Weiner wrote:
> > > Hold on, I think this patch is still not complete: end_migration()
> > > directly uses __mem_cgroup_uncharge_common() with the FORCE charge
> > > type. This will uncharge all migrated anon pages as cache, when it
> > > should decide based on PageAnon(used), which is the page where
> > > ->mapping is intact after migration.
> >
> > You are right, I've missed that one as well. Anyway
> > MEM_CGROUP_CHARGE_TYPE_FORCE is used only in mem_cgroup_end_migration
> > these days and it got out of sync with its documentation (used by
> > force_empty) quite some time ago (f817ed48). What about something like
> > the following on top of the previous patch?
> > ---
> > Should be foldet into the previous patch with the updated changelog:
> >
> > Mapping of the unused page is not touched during migration (see
>
> used one, not unused. unused->mapping is globbered during migration.

Yes, you are right:
---
Should be foldet into the previous patch with the updated changelog:

Mapping of the unused page is not touched during migration (see
page_remove_rmap) so we can rely on it and push the correct charge type
down to __mem_cgroup_uncharge_common from end_migration.
The force flag was misleading was abused for skipping the needless
page_mapped() / PageCgroupMigration() check, as we know the unused page
is no longer mapped and cleared the migration flag just a few lines
up. But doing the checks is no biggie and it's not worth adding another
flag just to skip them. But I guess this should be mentioned in the
changelog.

[hannes@cmpxchg.org: fix for end_migration with clarification]
---
mm/memcontrol.c | 7 ++++++-
1 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index 4d655ee..6a8cc56 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -3195,6 +3195,7 @@ void mem_cgroup_end_migration(struct mem_cgroup *memcg,
{
struct page *used, *unused;
struct page_cgroup *pc;
+ bool anon;

if (!memcg)
return;
@@ -3207,6 +3208,7 @@ void mem_cgroup_end_migration(struct mem_cgroup *memcg,
used = newpage;
unused = oldpage;
}
+
/*
* We disallowed uncharge of pages under migration because mapcount
* of the page goes down to zero, temporarly.
@@ -3217,7 +3219,10 @@ void mem_cgroup_end_migration(struct mem_cgroup *memcg,
ClearPageCgroupMigration(pc);
unlock_page_cgroup(pc);

- __mem_cgroup_uncharge_common(unused, MEM_CGROUP_CHARGE_TYPE_FORCE);
+ anon = PageAnon(used);
+ __mem_cgroup_uncharge_common(unused,
+ anon ? MEM_CGROUP_CHARGE_TYPE_MAPPED
+ : MEM_CGROUP_CHARGE_TYPE_CACHE);

/*
* If a page is a file cache, radix-tree replacement is very atomic
--
1.7.8.3

--
Michal Hocko
SUSE Labs
SUSE LINUX s.r.o.
Lihovarska 1060/12
190 00 Praha 9
Czech Republic


\
 
 \ /
  Last update: 2012-01-24 18:25    [W:0.091 / U:0.108 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site