memcg: make threshold index in the right position
Index current_threshold may point to threshold that just equal to usage after last call of __mem_cgroup_threshold. But after registering a new event, it will change (pointing to threshold just below usage). So make it consistent here. For example: now: threshold array: 3 [5] 7 9 (usage = 6, [index] = 5) next turn (after calling __mem_cgroup_threshold): threshold array: 3 5 [7] 9 (usage = 7, [index] = 7) after registering a new event (threshold = 10): threshold array: 3 [5] 7 9 10 (usage = 7, [index] = 5) Signed-off-by: Sha Zhengju <handai.szj@taobao.com> Acked-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Reviewed-by: Kirill A. Shutemov <kirill@shutemov.name> Cc: Michal Hocko <mhocko@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
a0db00fcf5
commit
748dad36d6
|
@ -181,7 +181,7 @@ struct mem_cgroup_threshold {
|
|||
|
||||
/* For threshold */
|
||||
struct mem_cgroup_threshold_ary {
|
||||
/* An array index points to threshold just below usage. */
|
||||
/* An array index points to threshold just below or equal to usage. */
|
||||
int current_threshold;
|
||||
/* Size of entries[] */
|
||||
unsigned int size;
|
||||
|
@ -4280,7 +4280,7 @@ static void __mem_cgroup_threshold(struct mem_cgroup *memcg, bool swap)
|
|||
usage = mem_cgroup_usage(memcg, swap);
|
||||
|
||||
/*
|
||||
* current_threshold points to threshold just below usage.
|
||||
* current_threshold points to threshold just below or equal to usage.
|
||||
* If it's not true, a threshold was crossed after last
|
||||
* call of __mem_cgroup_threshold().
|
||||
*/
|
||||
|
@ -4406,14 +4406,15 @@ static int mem_cgroup_usage_register_event(struct cgroup *cgrp,
|
|||
/* Find current threshold */
|
||||
new->current_threshold = -1;
|
||||
for (i = 0; i < size; i++) {
|
||||
if (new->entries[i].threshold < usage) {
|
||||
if (new->entries[i].threshold <= usage) {
|
||||
/*
|
||||
* new->current_threshold will not be used until
|
||||
* rcu_assign_pointer(), so it's safe to increment
|
||||
* it here.
|
||||
*/
|
||||
++new->current_threshold;
|
||||
}
|
||||
} else
|
||||
break;
|
||||
}
|
||||
|
||||
/* Free old spare buffer and save old primary buffer as spare */
|
||||
|
@ -4482,7 +4483,7 @@ static void mem_cgroup_usage_unregister_event(struct cgroup *cgrp,
|
|||
continue;
|
||||
|
||||
new->entries[j] = thresholds->primary->entries[i];
|
||||
if (new->entries[j].threshold < usage) {
|
||||
if (new->entries[j].threshold <= usage) {
|
||||
/*
|
||||
* new->current_threshold will not be used
|
||||
* until rcu_assign_pointer(), so it's safe to increment
|
||||
|
|
Loading…
Reference in New Issue