projects
/
platform
/
adaptation
/
renesas_rcar
/
renesas_kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
memsw: handle swapaccount kernel parameter correctly
[platform/adaptation/renesas_rcar/renesas_kernel.git]
/
mm
/
memcontrol.c
diff --git
a/mm/memcontrol.c
b/mm/memcontrol.c
index
db76ef7
..
44f9f9c
100644
(file)
--- a/
mm/memcontrol.c
+++ b/
mm/memcontrol.c
@@
-1832,6
+1832,7
@@
static int __mem_cgroup_do_charge(struct mem_cgroup *mem, gfp_t gfp_mask,
if (likely(!ret))
return CHARGE_OK;
if (likely(!ret))
return CHARGE_OK;
+ res_counter_uncharge(&mem->res, csize);
mem_over_limit = mem_cgroup_from_res_counter(fail_res, memsw);
flags |= MEM_CGROUP_RECLAIM_NOSWAP;
} else
mem_over_limit = mem_cgroup_from_res_counter(fail_res, memsw);
flags |= MEM_CGROUP_RECLAIM_NOSWAP;
} else
@@
-2144,6
+2145,8
@@
void mem_cgroup_split_huge_fixup(struct page *head, struct page *tail)
struct page_cgroup *tail_pc = lookup_page_cgroup(tail);
unsigned long flags;
struct page_cgroup *tail_pc = lookup_page_cgroup(tail);
unsigned long flags;
+ if (mem_cgroup_disabled())
+ return;
/*
* We have no races with charge/uncharge but will have races with
* page state accounting.
/*
* We have no races with charge/uncharge but will have races with
* page state accounting.
@@
-2233,7
+2236,12
@@
static int mem_cgroup_move_account(struct page_cgroup *pc,
{
int ret = -EINVAL;
unsigned long flags;
{
int ret = -EINVAL;
unsigned long flags;
-
+ /*
+ * The page is isolated from LRU. So, collapse function
+ * will not handle this page. But page splitting can happen.
+ * Do this check under compound_page_lock(). The caller should
+ * hold it.
+ */
if ((charge_size > PAGE_SIZE) && !PageTransHuge(pc->page))
return -EBUSY;
if ((charge_size > PAGE_SIZE) && !PageTransHuge(pc->page))
return -EBUSY;
@@
-2265,7
+2273,7
@@
static int mem_cgroup_move_parent(struct page_cgroup *pc,
struct cgroup *cg = child->css.cgroup;
struct cgroup *pcg = cg->parent;
struct mem_cgroup *parent;
struct cgroup *cg = child->css.cgroup;
struct cgroup *pcg = cg->parent;
struct mem_cgroup *parent;
- int
charg
e = PAGE_SIZE;
+ int
page_siz
e = PAGE_SIZE;
unsigned long flags;
int ret;
unsigned long flags;
int ret;
@@
-2278,23
+2286,26
@@
static int mem_cgroup_move_parent(struct page_cgroup *pc,
goto out;
if (isolate_lru_page(page))
goto put;
goto out;
if (isolate_lru_page(page))
goto put;
- /* The page is isolated from LRU and we have no race with splitting */
- charge = PAGE_SIZE << compound_order(page);
+
+ if (PageTransHuge(page))
+ page_size = HPAGE_SIZE;
parent = mem_cgroup_from_cont(pcg);
parent = mem_cgroup_from_cont(pcg);
- ret = __mem_cgroup_try_charge(NULL, gfp_mask, &parent, false, charge);
+ ret = __mem_cgroup_try_charge(NULL, gfp_mask,
+ &parent, false, page_size);
if (ret || !parent)
goto put_back;
if (ret || !parent)
goto put_back;
- if (
charg
e > PAGE_SIZE)
+ if (
page_siz
e > PAGE_SIZE)
flags = compound_lock_irqsave(page);
flags = compound_lock_irqsave(page);
- ret = mem_cgroup_move_account(pc, child, parent, true,
charg
e);
+ ret = mem_cgroup_move_account(pc, child, parent, true,
page_siz
e);
if (ret)
if (ret)
- mem_cgroup_cancel_charge(parent,
charg
e);
-put_back:
- if (
charg
e > PAGE_SIZE)
+ mem_cgroup_cancel_charge(parent,
page_siz
e);
+
+ if (
page_siz
e > PAGE_SIZE)
compound_unlock_irqrestore(page, flags);
compound_unlock_irqrestore(page, flags);
+put_back:
putback_lru_page(page);
put:
put_page(page);
putback_lru_page(page);
put:
put_page(page);
@@
-5013,9
+5024,9
@@
struct cgroup_subsys mem_cgroup_subsys = {
static int __init enable_swap_account(char *s)
{
/* consider enabled if no parameter or 1 is given */
static int __init enable_swap_account(char *s)
{
/* consider enabled if no parameter or 1 is given */
- if (!
s || !strcmp(s, "
1"))
+ if (!
(*s) || !strcmp(s, "=
1"))
really_do_swap_account = 1;
really_do_swap_account = 1;
- else if (!strcmp(s, "0"))
+ else if (!strcmp(s, "
=
0"))
really_do_swap_account = 0;
return 1;
}
really_do_swap_account = 0;
return 1;
}
@@
-5023,7
+5034,7
@@
__setup("swapaccount", enable_swap_account);
static int __init disable_swap_account(char *s)
{
static int __init disable_swap_account(char *s)
{
- enable_swap_account("0");
+ enable_swap_account("
=
0");
return 1;
}
__setup("noswapaccount", disable_swap_account);
return 1;
}
__setup("noswapaccount", disable_swap_account);