Skip to content

Commit c054a78

Browse files
Yu Zhaotorvalds
authored andcommitted
memcg: refactor mem_cgroup_resize_limit()
mem_cgroup_resize_limit() and mem_cgroup_resize_memsw_limit() have identical logics. Refactor code so we don't need to keep two pieces of code that does same thing. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Yu Zhao <[email protected]> Acked-by: Vladimir Davydov <[email protected]> Acked-by: Michal Hocko <[email protected]> Cc: Johannes Weiner <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 9c3760e commit c054a78

File tree

1 file changed

+17
-60
lines changed

1 file changed

+17
-60
lines changed

mm/memcontrol.c

Lines changed: 17 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2461,13 +2461,15 @@ static inline int mem_cgroup_move_swap_account(swp_entry_t entry,
24612461
static DEFINE_MUTEX(memcg_limit_mutex);
24622462

24632463
static int mem_cgroup_resize_limit(struct mem_cgroup *memcg,
2464-
unsigned long limit)
2464+
unsigned long limit, bool memsw)
24652465
{
24662466
unsigned long curusage;
24672467
unsigned long oldusage;
24682468
bool enlarge = false;
24692469
int retry_count;
24702470
int ret;
2471+
bool limits_invariant;
2472+
struct page_counter *counter = memsw ? &memcg->memsw : &memcg->memory;
24712473

24722474
/*
24732475
* For keeping hierarchical_reclaim simple, how long we should retry
@@ -2477,7 +2479,7 @@ static int mem_cgroup_resize_limit(struct mem_cgroup *memcg,
24772479
retry_count = MEM_CGROUP_RECLAIM_RETRIES *
24782480
mem_cgroup_count_children(memcg);
24792481

2480-
oldusage = page_counter_read(&memcg->memory);
2482+
oldusage = page_counter_read(counter);
24812483

24822484
do {
24832485
if (signal_pending(current)) {
@@ -2486,73 +2488,28 @@ static int mem_cgroup_resize_limit(struct mem_cgroup *memcg,
24862488
}
24872489

24882490
mutex_lock(&memcg_limit_mutex);
2489-
if (limit > memcg->memsw.limit) {
2490-
mutex_unlock(&memcg_limit_mutex);
2491-
ret = -EINVAL;
2492-
break;
2493-
}
2494-
if (limit > memcg->memory.limit)
2495-
enlarge = true;
2496-
ret = page_counter_limit(&memcg->memory, limit);
2497-
mutex_unlock(&memcg_limit_mutex);
2498-
2499-
if (!ret)
2500-
break;
2501-
2502-
try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, true);
2503-
2504-
curusage = page_counter_read(&memcg->memory);
2505-
/* Usage is reduced ? */
2506-
if (curusage >= oldusage)
2507-
retry_count--;
2508-
else
2509-
oldusage = curusage;
2510-
} while (retry_count);
2511-
2512-
if (!ret && enlarge)
2513-
memcg_oom_recover(memcg);
2514-
2515-
return ret;
2516-
}
2517-
2518-
static int mem_cgroup_resize_memsw_limit(struct mem_cgroup *memcg,
2519-
unsigned long limit)
2520-
{
2521-
unsigned long curusage;
2522-
unsigned long oldusage;
2523-
bool enlarge = false;
2524-
int retry_count;
2525-
int ret;
2526-
2527-
/* see mem_cgroup_resize_res_limit */
2528-
retry_count = MEM_CGROUP_RECLAIM_RETRIES *
2529-
mem_cgroup_count_children(memcg);
2530-
2531-
oldusage = page_counter_read(&memcg->memsw);
2532-
2533-
do {
2534-
if (signal_pending(current)) {
2535-
ret = -EINTR;
2536-
break;
2537-
}
2538-
2539-
mutex_lock(&memcg_limit_mutex);
2540-
if (limit < memcg->memory.limit) {
2491+
/*
2492+
* Make sure that the new limit (memsw or memory limit) doesn't
2493+
* break our basic invariant rule memory.limit <= memsw.limit.
2494+
*/
2495+
limits_invariant = memsw ? limit >= memcg->memory.limit :
2496+
limit <= memcg->memsw.limit;
2497+
if (!limits_invariant) {
25412498
mutex_unlock(&memcg_limit_mutex);
25422499
ret = -EINVAL;
25432500
break;
25442501
}
2545-
if (limit > memcg->memsw.limit)
2502+
if (limit > counter->limit)
25462503
enlarge = true;
2547-
ret = page_counter_limit(&memcg->memsw, limit);
2504+
ret = page_counter_limit(counter, limit);
25482505
mutex_unlock(&memcg_limit_mutex);
25492506

25502507
if (!ret)
25512508
break;
25522509

2553-
try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, false);
2510+
try_to_free_mem_cgroup_pages(memcg, 1, GFP_KERNEL, !memsw);
25542511

2555-
curusage = page_counter_read(&memcg->memsw);
2512+
curusage = page_counter_read(counter);
25562513
/* Usage is reduced ? */
25572514
if (curusage >= oldusage)
25582515
retry_count--;
@@ -3014,10 +2971,10 @@ static ssize_t mem_cgroup_write(struct kernfs_open_file *of,
30142971
}
30152972
switch (MEMFILE_TYPE(of_cft(of)->private)) {
30162973
case _MEM:
3017-
ret = mem_cgroup_resize_limit(memcg, nr_pages);
2974+
ret = mem_cgroup_resize_limit(memcg, nr_pages, false);
30182975
break;
30192976
case _MEMSWAP:
3020-
ret = mem_cgroup_resize_memsw_limit(memcg, nr_pages);
2977+
ret = mem_cgroup_resize_limit(memcg, nr_pages, true);
30212978
break;
30222979
case _KMEM:
30232980
ret = memcg_update_kmem_limit(memcg, nr_pages);

0 commit comments

Comments
 (0)