+ mm-memcg-let-non-unified-root-stats-flushes-help-unified-flushes.patch added to mm-unstable branch

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch titled
     Subject: mm: memcg: let non-unified root stats flushes help unified flushes
has been added to the -mm mm-unstable branch.  Its filename is
     mm-memcg-let-non-unified-root-stats-flushes-help-unified-flushes.patch

This patch will shortly appear at
     https://git.kernel.org/pub/scm/linux/kernel/git/akpm/25-new.git/tree/patches/mm-memcg-let-non-unified-root-stats-flushes-help-unified-flushes.patch

This patch will later appear in the mm-unstable branch at
    git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm

Before you just go and hit "reply", please:
   a) Consider who else should be cc'ed
   b) Prefer to cc a suitable mailing list as well
   c) Ideally: find the original patch on the mailing list and do a
      reply-to-all to that, adding suitable additional cc's

*** Remember to use Documentation/process/submit-checklist.rst when testing your code ***

The -mm tree is included into linux-next via the mm-everything
branch at git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
and is updated there every 2-3 working days

------------------------------------------------------
From: Yosry Ahmed <yosryahmed@xxxxxxxxxx>
Subject: mm: memcg: let non-unified root stats flushes help unified flushes
Date: Thu, 31 Aug 2023 16:56:10 +0000

Unified flushing of memcg stats keeps track of the magnitude of pending
updates, and only allows a flush if that magnitude exceeds a threshold. 
It also keeps track of the time at which ratelimited flushing should be
allowed as flush_next_time.

A non-unified flush on the root memcg has the same effect as a unified
flush, so let it help unified flushing by resetting pending updates and
kicking flush_next_time forward.  Move the logic into the common
do_stats_flush() helper, and do it for all root flushes, unified or not.

There is a subtle change here, we reset stats_flush_threshold before a
flush rather than after a flush.  This probably okay because:

(a) For flushers: only unified flushers check stats_flush_threshold,
    and those flushers skip anyway if there is another unified flush
    ongoing.  Having them also skip if there is an ongoing non-unified
    root flush is actually more consistent.

(b) For updaters: Resetting stats_flush_threshold early may lead to
    more atomic updates of stats_flush_threshold, as we start updating it
    earlier.  This should not be significant in practice because we stop
    updating stats_flush_threshold when it reaches the threshold anyway. 
    If we start early and stop early, the number of atomic updates remain
    the same.  The only difference is the scenario where we reset
    stats_flush_threshold early, start doing atomic updates early, and
    then the periodic flusher kicks in before we reach the threshold.  In
    this case, we will have done more atomic updates.  However, since the
    threshold wasn't reached, then we did not do a lot of updates anyway.

Link: https://lkml.kernel.org/r/20230831165611.2610118-4-yosryahmed@xxxxxxxxxx
Suggested-by: Michal Koutný <mkoutny@xxxxxxxx>
Signed-off-by: Yosry Ahmed <yosryahmed@xxxxxxxxxx>
Acked-by: Waiman Long <longman@xxxxxxxxxx>
Cc: Ivan Babrou <ivan@xxxxxxxxxxxxxx>
Cc: Johannes Weiner <hannes@xxxxxxxxxxx>
Cc: Michal Hocko <mhocko@xxxxxxxxxx>
Cc: Muchun Song <muchun.song@xxxxxxxxx>
Cc: Roman Gushchin <roman.gushchin@xxxxxxxxx>
Cc: Shakeel Butt <shakeelb@xxxxxxxxxx>
Cc: Tejun Heo <tj@xxxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
---

 mm/memcontrol.c |    8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

--- a/mm/memcontrol.c~mm-memcg-let-non-unified-root-stats-flushes-help-unified-flushes
+++ a/mm/memcontrol.c
@@ -647,6 +647,11 @@ static inline void memcg_rstat_updated(s
  */
 static void do_stats_flush(struct mem_cgroup *memcg)
 {
+	/* for unified flushing, root non-unified flushing can help as well */
+	if (mem_cgroup_is_root(memcg)) {
+		WRITE_ONCE(flush_next_time, jiffies_64 + 2*FLUSH_TIME);
+		atomic_set(&stats_flush_threshold, 0);
+	}
 	cgroup_rstat_flush(memcg->css.cgroup);
 }
 
@@ -665,11 +670,8 @@ static void do_unified_stats_flush(void)
 	    atomic_xchg(&stats_unified_flush_ongoing, 1))
 		return;
 
-	WRITE_ONCE(flush_next_time, jiffies_64 + 2*FLUSH_TIME);
-
 	do_stats_flush(root_mem_cgroup);
 
-	atomic_set(&stats_flush_threshold, 0);
 	atomic_set(&stats_unified_flush_ongoing, 0);
 }
 
_

Patches currently in -mm which might be from yosryahmed@xxxxxxxxxx are

mm-memcg-properly-name-and-document-unified-stats-flushing.patch
mm-memcg-add-a-helper-for-non-unified-stats-flushing.patch
mm-memcg-let-non-unified-root-stats-flushes-help-unified-flushes.patch
mm-memcg-use-non-unified-stats-flushing-for-userspace-reads.patch




[Index of Archives]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux