On 3/20/26 7:26 AM, Li Wang wrote:
Waiman Long wrote:

--- a/include/linux/memcontrol.h
+++ b/include/linux/memcontrol.h
@@ -328,8 +328,14 @@ struct mem_cgroup {
   * size of first charge trial.
   * TODO: maybe necessary to use big numbers in big irons or dynamic based of 
the
   * workload.
+ *
+ * There are 3 common base page sizes - 4k, 16k & 64k. In order to limit the
+ * amount of memory that can be hidden in each percpu memcg_stock for a given
+ * memcg, we scale down MEMCG_CHARGE_BATCH by 2 for 16k and 4 for 64k.
   */
-#define MEMCG_CHARGE_BATCH 64U
+#define MEMCG_CHARGE_BATCH_BASE  64U
+#define MEMCG_CHARGE_BATCH_SHIFT ((PAGE_SHIFT <= 16) ? (PAGE_SHIFT - 12)/2 : 2)
+#define MEMCG_CHARGE_BATCH      (MEMCG_CHARGE_BATCH_BASE >> 
MEMCG_CHARGE_BATCH_SHIFT)
This is a good complement to the first patch. With this change,
I got a chart to compare the three methods (linear, log2, sqrt)
in the count threshold:

4k page size (BATCH=64):
CPUs linear log2 sqrt
   --------------------------------
   1       256KB     256KB    256KB
   8       2MB       1MB      512KB
   128     32MB      2MB      2.75MB
   1024    256MB     2.75MB   8MB
        
64k page size (BATCH=16):

   CPUs    linear    log2     sqrt
   -------------------------------
   1       1MB       1MB      1MB
   8       8MB       4MB      2MB
   128     128MB     8MB      11MB
   1024    1GB       11MB     32MB


Both are huge improvements.

log2 flushes more aggressively on large systems, which gives more accurate
stats but at the cost of more frequent synchronous flushes.

sqrt is more conservative, still a massive reduction from linear but gives
more breathing room on large systems, which may be better for performance.

I would leave this choice to you, Waiman, and the data is for reference.

I think it is a good idea to use the int_sqrt() function and I will use it in the next version.

Cheers,
Longman


Reply via email to