From: Steven Rostedt The code in memcg_check_events() calls this_cpu_read() on different variables without disabling preemption, and can cause the calculations to be done from two different CPU variables. Disable preemption throughout the check to keep apples and oranges from becoming a mixed drink. Signed-off-by: Johannes Weiner Signed-off-by: Greg Thelen Acked-by: KAMEZAWA Hiroyuki Acked-by: Balbir Singh Cc: Daisuke Nishimura Signed-off-by: Steven Rostedt --- mm/memcontrol.c | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) diff --git a/mm/memcontrol.c b/mm/memcontrol.c index 3508777..a164c93 100644 --- a/mm/memcontrol.c +++ b/mm/memcontrol.c @@ -718,6 +718,7 @@ static void __mem_cgroup_target_update(struct mem_cgroup *mem, int target) */ static void memcg_check_events(struct mem_cgroup *mem, struct page *page) { + preempt_disable(); /* threshold event is triggered in finer grain than soft limit */ if (unlikely(__memcg_event_check(mem, MEM_CGROUP_TARGET_THRESH))) { mem_cgroup_threshold(mem); @@ -737,6 +738,7 @@ static void memcg_check_events(struct mem_cgroup *mem, struct page *page) } #endif } + preempt_enable(); } static struct mem_cgroup *mem_cgroup_from_cont(struct cgroup *cont) -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/