--- /dev/null
+From a83d041edd45e9bca721059a4d56595c17c71f8a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Apr 2020 14:55:35 -0400
+Subject: Revert "cgroup: Add memory barriers to plug cgroup_rstat_updated()
+ race window"
+
+From: Tejun Heo <tj@kernel.org>
+
+[ Upstream commit d8ef4b38cb69d907f9b0e889c44d05fc0f890977 ]
+
+This reverts commit 9a9e97b2f1f2 ("cgroup: Add memory barriers to plug
+cgroup_rstat_updated() race window").
+
+The commit was added in anticipation of memcg rstat conversion which needed
+synchronous accounting for the event counters (e.g. oom kill count). However,
+the conversion didn't get merged due to percpu memory overhead concern which
+couldn't be addressed at the time.
+
+Unfortunately, the patch's addition of smp_mb() to cgroup_rstat_updated()
+meant that every scheduling event now had to go through an additional full
+barrier and Mel Gorman noticed it as 1% regression in netperf UDP_STREAM test.
+
+There's no need to have this barrier in tree now and even if we need
+synchronous accounting in the future, the right thing to do is separating that
+out to a separate function so that hot paths which don't care about
+synchronous behavior don't have to pay the overhead of the full barrier. Let's
+revert.
+
+Signed-off-by: Tejun Heo <tj@kernel.org>
+Reported-by: Mel Gorman <mgorman@techsingularity.net>
+Link: http://lkml.kernel.org/r/20200409154413.GK3818@techsingularity.net
+Cc: v4.18+
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/cgroup/rstat.c | 16 +++-------------
+ 1 file changed, 3 insertions(+), 13 deletions(-)
+
+diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c
+index bb95a35e8c2d..d0ed410b4127 100644
+--- a/kernel/cgroup/rstat.c
++++ b/kernel/cgroup/rstat.c
+@@ -32,12 +32,9 @@ void cgroup_rstat_updated(struct cgroup *cgrp, int cpu)
+ return;
+
+ /*
+- * Paired with the one in cgroup_rstat_cpu_pop_upated(). Either we
+- * see NULL updated_next or they see our updated stat.
+- */
+- smp_mb();
+-
+- /*
++ * Speculative already-on-list test. This may race leading to
++ * temporary inaccuracies, which is fine.
++ *
+ * Because @parent's updated_children is terminated with @parent
+ * instead of NULL, we can tell whether @cgrp is on the list by
+ * testing the next pointer for NULL.
+@@ -133,13 +130,6 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos,
+ *nextp = rstatc->updated_next;
+ rstatc->updated_next = NULL;
+
+- /*
+- * Paired with the one in cgroup_rstat_cpu_updated().
+- * Either they see NULL updated_next or we see their
+- * updated stat.
+- */
+- smp_mb();
+-
+ return pos;
+ }
+
+--
+2.25.1
+