mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 05:44:11 +00:00
mm: memcg: move pc lookup point to commit_charge()
None of the callsites actually need the page_cgroup descriptor
themselves, so just pass the page and do the look up in there.
We already had two bugs (6568d4a
'mm: memcg: update the correct soft
limit tree during migration' and 'memcg: fix Bad page state after
replace_page_cache') where the passed page and pc were not referring
to the same page frame.
Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
Acked-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
4e1c2b2844
commit
ce587e65e8
1 changed files with 5 additions and 12 deletions
|
@ -2476,10 +2476,10 @@ struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
|
||||||
static void __mem_cgroup_commit_charge(struct mem_cgroup *memcg,
|
static void __mem_cgroup_commit_charge(struct mem_cgroup *memcg,
|
||||||
struct page *page,
|
struct page *page,
|
||||||
unsigned int nr_pages,
|
unsigned int nr_pages,
|
||||||
struct page_cgroup *pc,
|
|
||||||
enum charge_type ctype,
|
enum charge_type ctype,
|
||||||
bool lrucare)
|
bool lrucare)
|
||||||
{
|
{
|
||||||
|
struct page_cgroup *pc = lookup_page_cgroup(page);
|
||||||
struct zone *uninitialized_var(zone);
|
struct zone *uninitialized_var(zone);
|
||||||
bool was_on_lru = false;
|
bool was_on_lru = false;
|
||||||
bool anon;
|
bool anon;
|
||||||
|
@ -2716,7 +2716,6 @@ static int mem_cgroup_charge_common(struct page *page, struct mm_struct *mm,
|
||||||
{
|
{
|
||||||
struct mem_cgroup *memcg = NULL;
|
struct mem_cgroup *memcg = NULL;
|
||||||
unsigned int nr_pages = 1;
|
unsigned int nr_pages = 1;
|
||||||
struct page_cgroup *pc;
|
|
||||||
bool oom = true;
|
bool oom = true;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -2730,11 +2729,10 @@ static int mem_cgroup_charge_common(struct page *page, struct mm_struct *mm,
|
||||||
oom = false;
|
oom = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
pc = lookup_page_cgroup(page);
|
|
||||||
ret = __mem_cgroup_try_charge(mm, gfp_mask, nr_pages, &memcg, oom);
|
ret = __mem_cgroup_try_charge(mm, gfp_mask, nr_pages, &memcg, oom);
|
||||||
if (ret == -ENOMEM)
|
if (ret == -ENOMEM)
|
||||||
return ret;
|
return ret;
|
||||||
__mem_cgroup_commit_charge(memcg, page, nr_pages, pc, ctype, false);
|
__mem_cgroup_commit_charge(memcg, page, nr_pages, ctype, false);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2831,16 +2829,13 @@ static void
|
||||||
__mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *memcg,
|
__mem_cgroup_commit_charge_swapin(struct page *page, struct mem_cgroup *memcg,
|
||||||
enum charge_type ctype)
|
enum charge_type ctype)
|
||||||
{
|
{
|
||||||
struct page_cgroup *pc;
|
|
||||||
|
|
||||||
if (mem_cgroup_disabled())
|
if (mem_cgroup_disabled())
|
||||||
return;
|
return;
|
||||||
if (!memcg)
|
if (!memcg)
|
||||||
return;
|
return;
|
||||||
cgroup_exclude_rmdir(&memcg->css);
|
cgroup_exclude_rmdir(&memcg->css);
|
||||||
|
|
||||||
pc = lookup_page_cgroup(page);
|
__mem_cgroup_commit_charge(memcg, page, 1, ctype, true);
|
||||||
__mem_cgroup_commit_charge(memcg, page, 1, pc, ctype, true);
|
|
||||||
/*
|
/*
|
||||||
* Now swap is on-memory. This means this page may be
|
* Now swap is on-memory. This means this page may be
|
||||||
* counted both as mem and swap....double count.
|
* counted both as mem and swap....double count.
|
||||||
|
@ -3298,14 +3293,13 @@ int mem_cgroup_prepare_migration(struct page *page,
|
||||||
* page. In the case new page is migrated but not remapped, new page's
|
* page. In the case new page is migrated but not remapped, new page's
|
||||||
* mapcount will be finally 0 and we call uncharge in end_migration().
|
* mapcount will be finally 0 and we call uncharge in end_migration().
|
||||||
*/
|
*/
|
||||||
pc = lookup_page_cgroup(newpage);
|
|
||||||
if (PageAnon(page))
|
if (PageAnon(page))
|
||||||
ctype = MEM_CGROUP_CHARGE_TYPE_MAPPED;
|
ctype = MEM_CGROUP_CHARGE_TYPE_MAPPED;
|
||||||
else if (page_is_file_cache(page))
|
else if (page_is_file_cache(page))
|
||||||
ctype = MEM_CGROUP_CHARGE_TYPE_CACHE;
|
ctype = MEM_CGROUP_CHARGE_TYPE_CACHE;
|
||||||
else
|
else
|
||||||
ctype = MEM_CGROUP_CHARGE_TYPE_SHMEM;
|
ctype = MEM_CGROUP_CHARGE_TYPE_SHMEM;
|
||||||
__mem_cgroup_commit_charge(memcg, newpage, 1, pc, ctype, false);
|
__mem_cgroup_commit_charge(memcg, newpage, 1, ctype, false);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3392,8 +3386,7 @@ void mem_cgroup_replace_page_cache(struct page *oldpage,
|
||||||
* the newpage may be on LRU(or pagevec for LRU) already. We lock
|
* the newpage may be on LRU(or pagevec for LRU) already. We lock
|
||||||
* LRU while we overwrite pc->mem_cgroup.
|
* LRU while we overwrite pc->mem_cgroup.
|
||||||
*/
|
*/
|
||||||
pc = lookup_page_cgroup(newpage);
|
__mem_cgroup_commit_charge(memcg, newpage, 1, type, true);
|
||||||
__mem_cgroup_commit_charge(memcg, newpage, 1, pc, type, true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_VM
|
#ifdef CONFIG_DEBUG_VM
|
||||||
|
|
Loading…
Reference in a new issue