Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 230778
b: refs/heads/master
c: 152c9cc
h: refs/heads/master
v: v3
  • Loading branch information
Daisuke Nishimura authored and Linus Torvalds committed Jan 14, 2011
1 parent 39d19ab commit c185ef6
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 18 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ec1685109f1314a30919489ef2800ed626a38c1e
refs/heads/master: 152c9ccb75548c027fa3103efa4fa4e19a345449
52 changes: 35 additions & 17 deletions trunk/mm/memcontrol.c
Original file line number Diff line number Diff line change
Expand Up @@ -2094,23 +2094,10 @@ struct mem_cgroup *try_get_mem_cgroup_from_page(struct page *page)
* commit a charge got by __mem_cgroup_try_charge() and makes page_cgroup to be
* USED state. If already USED, uncharge and return.
*/

static void __mem_cgroup_commit_charge(struct mem_cgroup *mem,
struct page_cgroup *pc,
enum charge_type ctype,
int page_size)
static void ____mem_cgroup_commit_charge(struct mem_cgroup *mem,
struct page_cgroup *pc,
enum charge_type ctype)
{
/* try_charge() can return NULL to *memcg, taking care of it. */
if (!mem)
return;

lock_page_cgroup(pc);
if (unlikely(PageCgroupUsed(pc))) {
unlock_page_cgroup(pc);
mem_cgroup_cancel_charge(mem, page_size);
return;
}

pc->mem_cgroup = mem;
/*
* We access a page_cgroup asynchronously without lock_page_cgroup().
Expand All @@ -2135,6 +2122,33 @@ static void __mem_cgroup_commit_charge(struct mem_cgroup *mem,
}

mem_cgroup_charge_statistics(mem, pc, true);
}

static void __mem_cgroup_commit_charge(struct mem_cgroup *mem,
struct page_cgroup *pc,
enum charge_type ctype,
int page_size)
{
int i;
int count = page_size >> PAGE_SHIFT;

/* try_charge() can return NULL to *memcg, taking care of it. */
if (!mem)
return;

lock_page_cgroup(pc);
if (unlikely(PageCgroupUsed(pc))) {
unlock_page_cgroup(pc);
mem_cgroup_cancel_charge(mem, page_size);
return;
}

/*
* we don't need page_cgroup_lock about tail pages, becase they are not
* accessed by any other context at this point.
*/
for (i = 0; i < count; i++)
____mem_cgroup_commit_charge(mem, pc + i, ctype);

unlock_page_cgroup(pc);
/*
Expand Down Expand Up @@ -2532,6 +2546,8 @@ __do_uncharge(struct mem_cgroup *mem, const enum charge_type ctype,
static struct mem_cgroup *
__mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype)
{
int i;
int count;
struct page_cgroup *pc;
struct mem_cgroup *mem = NULL;
int page_size = PAGE_SIZE;
Expand All @@ -2545,6 +2561,7 @@ __mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype)
if (PageTransHuge(page))
page_size <<= compound_order(page);

count = page_size >> PAGE_SHIFT;
/*
* Check if our page_cgroup is valid
*/
Expand Down Expand Up @@ -2577,7 +2594,8 @@ __mem_cgroup_uncharge_common(struct page *page, enum charge_type ctype)
break;
}

mem_cgroup_charge_statistics(mem, pc, false);
for (i = 0; i < count; i++)
mem_cgroup_charge_statistics(mem, pc + i, false);

ClearPageCgroupUsed(pc);
/*
Expand Down

0 comments on commit c185ef6

Please sign in to comment.