diff options
-rw-r--r-- | mm/memcontrol.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 5f8f93d83edf..5a41d93c7077 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c | |||
@@ -71,8 +71,9 @@ enum mem_cgroup_stat_index { | |||
71 | MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */ | 71 | MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */ |
72 | MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */ | 72 | MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */ |
73 | MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */ | 73 | MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */ |
74 | MEM_CGROUP_STAT_EVENTS, /* sum of pagein + pageout for internal use */ | ||
75 | MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */ | 74 | MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */ |
75 | MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out. | ||
76 | used by soft limit implementation */ | ||
76 | 77 | ||
77 | MEM_CGROUP_STAT_NSTATS, | 78 | MEM_CGROUP_STAT_NSTATS, |
78 | }; | 79 | }; |
@@ -86,10 +87,10 @@ struct mem_cgroup_stat { | |||
86 | }; | 87 | }; |
87 | 88 | ||
88 | static inline void | 89 | static inline void |
89 | __mem_cgroup_stat_reset_safe(struct mem_cgroup_stat_cpu *stat, | 90 | __mem_cgroup_stat_set_safe(struct mem_cgroup_stat_cpu *stat, |
90 | enum mem_cgroup_stat_index idx) | 91 | enum mem_cgroup_stat_index idx, s64 val) |
91 | { | 92 | { |
92 | stat->count[idx] = 0; | 93 | stat->count[idx] = val; |
93 | } | 94 | } |
94 | 95 | ||
95 | static inline s64 | 96 | static inline s64 |
@@ -411,9 +412,10 @@ static bool mem_cgroup_soft_limit_check(struct mem_cgroup *mem) | |||
411 | 412 | ||
412 | cpu = get_cpu(); | 413 | cpu = get_cpu(); |
413 | cpustat = &mem->stat.cpustat[cpu]; | 414 | cpustat = &mem->stat.cpustat[cpu]; |
414 | val = __mem_cgroup_stat_read_local(cpustat, MEM_CGROUP_STAT_EVENTS); | 415 | val = __mem_cgroup_stat_read_local(cpustat, MEM_CGROUP_STAT_SOFTLIMIT); |
415 | if (unlikely(val > SOFTLIMIT_EVENTS_THRESH)) { | 416 | if (unlikely(val < 0)) { |
416 | __mem_cgroup_stat_reset_safe(cpustat, MEM_CGROUP_STAT_EVENTS); | 417 | __mem_cgroup_stat_set_safe(cpustat, MEM_CGROUP_STAT_SOFTLIMIT, |
418 | SOFTLIMIT_EVENTS_THRESH); | ||
417 | ret = true; | 419 | ret = true; |
418 | } | 420 | } |
419 | put_cpu(); | 421 | put_cpu(); |
@@ -546,7 +548,7 @@ static void mem_cgroup_charge_statistics(struct mem_cgroup *mem, | |||
546 | else | 548 | else |
547 | __mem_cgroup_stat_add_safe(cpustat, | 549 | __mem_cgroup_stat_add_safe(cpustat, |
548 | MEM_CGROUP_STAT_PGPGOUT_COUNT, 1); | 550 | MEM_CGROUP_STAT_PGPGOUT_COUNT, 1); |
549 | __mem_cgroup_stat_add_safe(cpustat, MEM_CGROUP_STAT_EVENTS, 1); | 551 | __mem_cgroup_stat_add_safe(cpustat, MEM_CGROUP_STAT_SOFTLIMIT, -1); |
550 | put_cpu(); | 552 | put_cpu(); |
551 | } | 553 | } |
552 | 554 | ||