|
@@ -71,8 +71,9 @@ enum mem_cgroup_stat_index {
|
|
MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */
|
|
MEM_CGROUP_STAT_FILE_MAPPED, /* # of pages charged as file rss */
|
|
MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */
|
|
MEM_CGROUP_STAT_PGPGIN_COUNT, /* # of pages paged in */
|
|
MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */
|
|
MEM_CGROUP_STAT_PGPGOUT_COUNT, /* # of pages paged out */
|
|
- MEM_CGROUP_STAT_EVENTS, /* sum of pagein + pageout for internal use */
|
|
|
|
MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */
|
|
MEM_CGROUP_STAT_SWAPOUT, /* # of pages, swapped out */
|
|
|
|
+ MEM_CGROUP_STAT_SOFTLIMIT, /* decrements on each page in/out.
|
|
|
|
+ used by soft limit implementation */
|
|
|
|
|
|
MEM_CGROUP_STAT_NSTATS,
|
|
MEM_CGROUP_STAT_NSTATS,
|
|
};
|
|
};
|
|
@@ -86,10 +87,10 @@ struct mem_cgroup_stat {
|
|
};
|
|
};
|
|
|
|
|
|
static inline void
|
|
static inline void
|
|
-__mem_cgroup_stat_reset_safe(struct mem_cgroup_stat_cpu *stat,
|
|
|
|
- enum mem_cgroup_stat_index idx)
|
|
|
|
|
|
+__mem_cgroup_stat_set_safe(struct mem_cgroup_stat_cpu *stat,
|
|
|
|
+ enum mem_cgroup_stat_index idx, s64 val)
|
|
{
|
|
{
|
|
- stat->count[idx] = 0;
|
|
|
|
|
|
+ stat->count[idx] = val;
|
|
}
|
|
}
|
|
|
|
|
|
static inline s64
|
|
static inline s64
|
|
@@ -411,9 +412,10 @@ static bool mem_cgroup_soft_limit_check(struct mem_cgroup *mem)
|
|
|
|
|
|
cpu = get_cpu();
|
|
cpu = get_cpu();
|
|
cpustat = &mem->stat.cpustat[cpu];
|
|
cpustat = &mem->stat.cpustat[cpu];
|
|
- val = __mem_cgroup_stat_read_local(cpustat, MEM_CGROUP_STAT_EVENTS);
|
|
|
|
- if (unlikely(val > SOFTLIMIT_EVENTS_THRESH)) {
|
|
|
|
- __mem_cgroup_stat_reset_safe(cpustat, MEM_CGROUP_STAT_EVENTS);
|
|
|
|
|
|
+ val = __mem_cgroup_stat_read_local(cpustat, MEM_CGROUP_STAT_SOFTLIMIT);
|
|
|
|
+ if (unlikely(val < 0)) {
|
|
|
|
+ __mem_cgroup_stat_set_safe(cpustat, MEM_CGROUP_STAT_SOFTLIMIT,
|
|
|
|
+ SOFTLIMIT_EVENTS_THRESH);
|
|
ret = true;
|
|
ret = true;
|
|
}
|
|
}
|
|
put_cpu();
|
|
put_cpu();
|
|
@@ -546,7 +548,7 @@ static void mem_cgroup_charge_statistics(struct mem_cgroup *mem,
|
|
else
|
|
else
|
|
__mem_cgroup_stat_add_safe(cpustat,
|
|
__mem_cgroup_stat_add_safe(cpustat,
|
|
MEM_CGROUP_STAT_PGPGOUT_COUNT, 1);
|
|
MEM_CGROUP_STAT_PGPGOUT_COUNT, 1);
|
|
- __mem_cgroup_stat_add_safe(cpustat, MEM_CGROUP_STAT_EVENTS, 1);
|
|
|
|
|
|
+ __mem_cgroup_stat_add_safe(cpustat, MEM_CGROUP_STAT_SOFTLIMIT, -1);
|
|
put_cpu();
|
|
put_cpu();
|
|
}
|
|
}
|
|
|
|
|