]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
memcg: manually uninline __memcg_memory_event
authorShakeel Butt <shakeel.butt@linux.dev>
Tue, 21 Oct 2025 23:44:25 +0000 (16:44 -0700)
committerAndrew Morton <akpm@linux-foundation.org>
Mon, 17 Nov 2025 01:28:16 +0000 (17:28 -0800)
__memcg_memory_event() has been unnecessarily marked inline even when it
is not really performance critical.  It is usually called to track extreme
conditions.  Over the time, it has evolved to include more functionality
and inlining it is causing more harm.

Before the patch:
$ size mm/memcontrol.o net/ipv4/tcp_input.o net/ipv4/tcp_output.o
   text    data     bss     dec     hex filename
  35645   10574    4192   50411    c4eb mm/memcontrol.o
  54738    1658       0   56396    dc4c net/ipv4/tcp_input.o
  34644    1065       0   35709    8b7d net/ipv4/tcp_output.o

After the patch:
$ size mm/memcontrol.o net/ipv4/tcp_input.o net/ipv4/tcp_output.o
   text    data     bss     dec     hex filename
  35137   10446    4192   49775    c26f mm/memcontrol.o
  54322    1562       0   55884    da4c net/ipv4/tcp_input.o
  34492    1017       0   35509    8ab5 net/ipv4/tcp_output.o

[akpm@linux-foundation.org: use EXPORT_SYMBOL_GPL for __memcg_memory_event, per Michal and Christoph]
Link: https://lkml.kernel.org/r/20251021234425.1885471-1-shakeel.butt@linux.dev
Signed-off-by: Shakeel Butt <shakeel.butt@linux.dev>
Acked-by: SeongJae Park <sj@kernel.org>
Acked-by: Roman Gushchin <roman.gushchin@linux.dev>
Acked-by: Michal Hocko <mhocko@suse.com>
Cc: Johannes Weiner <hannes@cmpxchg.org>
Cc: Muchun Song <muchun.song@linux.dev>
Cc: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/memcontrol.h
mm/memcontrol.c

index 5fe254813123f25bd1238b4ec0d638c25047c674..8c0f15e5978fa5fc4e6d2fc161e5619f7edcbc66 100644 (file)
@@ -1002,36 +1002,8 @@ static inline void count_memcg_event_mm(struct mm_struct *mm,
        count_memcg_events_mm(mm, idx, 1);
 }
 
-static inline void __memcg_memory_event(struct mem_cgroup *memcg,
-                                       enum memcg_memory_event event,
-                                       bool allow_spinning)
-{
-       bool swap_event = event == MEMCG_SWAP_HIGH || event == MEMCG_SWAP_MAX ||
-                         event == MEMCG_SWAP_FAIL;
-
-       /* For now only MEMCG_MAX can happen with !allow_spinning context. */
-       VM_WARN_ON_ONCE(!allow_spinning && event != MEMCG_MAX);
-
-       atomic_long_inc(&memcg->memory_events_local[event]);
-       if (!swap_event && allow_spinning)
-               cgroup_file_notify(&memcg->events_local_file);
-
-       do {
-               atomic_long_inc(&memcg->memory_events[event]);
-               if (allow_spinning) {
-                       if (swap_event)
-                               cgroup_file_notify(&memcg->swap_events_file);
-                       else
-                               cgroup_file_notify(&memcg->events_file);
-               }
-
-               if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
-                       break;
-               if (cgrp_dfl_root.flags & CGRP_ROOT_MEMORY_LOCAL_EVENTS)
-                       break;
-       } while ((memcg = parent_mem_cgroup(memcg)) &&
-                !mem_cgroup_is_root(memcg));
-}
+void __memcg_memory_event(struct mem_cgroup *memcg,
+                         enum memcg_memory_event event, bool allow_spinning);
 
 static inline void memcg_memory_event(struct mem_cgroup *memcg,
                                      enum memcg_memory_event event)
index 976412c8196e22bda40a1486124064b701657f49..025da46d9959fd72e055144f49ba03bf21ec3542 100644 (file)
@@ -1626,6 +1626,37 @@ unsigned long mem_cgroup_size(struct mem_cgroup *memcg)
        return page_counter_read(&memcg->memory);
 }
 
+void __memcg_memory_event(struct mem_cgroup *memcg,
+                         enum memcg_memory_event event, bool allow_spinning)
+{
+       bool swap_event = event == MEMCG_SWAP_HIGH || event == MEMCG_SWAP_MAX ||
+                         event == MEMCG_SWAP_FAIL;
+
+       /* For now only MEMCG_MAX can happen with !allow_spinning context. */
+       VM_WARN_ON_ONCE(!allow_spinning && event != MEMCG_MAX);
+
+       atomic_long_inc(&memcg->memory_events_local[event]);
+       if (!swap_event && allow_spinning)
+               cgroup_file_notify(&memcg->events_local_file);
+
+       do {
+               atomic_long_inc(&memcg->memory_events[event]);
+               if (allow_spinning) {
+                       if (swap_event)
+                               cgroup_file_notify(&memcg->swap_events_file);
+                       else
+                               cgroup_file_notify(&memcg->events_file);
+               }
+
+               if (!cgroup_subsys_on_dfl(memory_cgrp_subsys))
+                       break;
+               if (cgrp_dfl_root.flags & CGRP_ROOT_MEMORY_LOCAL_EVENTS)
+                       break;
+       } while ((memcg = parent_mem_cgroup(memcg)) &&
+                !mem_cgroup_is_root(memcg));
+}
+EXPORT_SYMBOL_GPL(__memcg_memory_event);
+
 static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask,
                                     int order)
 {