From: Ridong Chen <[email protected]>

Now that the vmscan tracepoints live in mm/trace_vmscan.h, move
struct scan_control there as well so the trace events can reference
reclaim-internal state directly. The definition is wrapped in its own
include guard because the trace header is re-read under
TRACE_HEADER_MULTI_READ, while a C struct may only be defined once.

No functional change.

Assisted-by: Claude:claude-opus-4-8
Signed-off-by: Ridong Chen <[email protected]>
---
 mm/trace_vmscan.h | 115 ++++++++++++++++++++++++++++++++++++++++++++++
 mm/vmscan.c       | 108 -------------------------------------------
 2 files changed, 115 insertions(+), 108 deletions(-)

diff --git a/mm/trace_vmscan.h b/mm/trace_vmscan.h
index c5d824fef554..c8ac5d4e4043 100644
--- a/mm/trace_vmscan.h
+++ b/mm/trace_vmscan.h
@@ -9,8 +9,123 @@
 #include <linux/tracepoint.h>
 #include <linux/mm.h>
 #include <linux/memcontrol.h>
+#include <linux/swap.h>
 #include <trace/events/mmflags.h>
 
+/* Guard the struct against define_trace.h's repeated inclusion. */
+#ifndef _MM_VMSCAN_INTERNAL_H
+#define _MM_VMSCAN_INTERNAL_H
+
+struct scan_control {
+       /* How many pages shrink_list() should reclaim */
+       unsigned long nr_to_reclaim;
+
+       /*
+        * Nodemask of nodes allowed by the caller. If NULL, all nodes
+        * are scanned.
+        */
+       const nodemask_t *nodemask;
+
+       /*
+        * The memory cgroup that hit its limit and as a result is the
+        * primary target of this reclaim invocation.
+        */
+       struct mem_cgroup *target_mem_cgroup;
+
+       /*
+        * Scan pressure balancing between anon and file LRUs
+        */
+       unsigned long   anon_cost;
+       unsigned long   file_cost;
+
+       /* Swappiness value for proactive reclaim. Always use sc_swappiness()! 
*/
+       int *proactive_swappiness;
+
+       /* Can active folios be deactivated as part of reclaim? */
+#define DEACTIVATE_ANON 1
+#define DEACTIVATE_FILE 2
+       unsigned int may_deactivate:2;
+       unsigned int force_deactivate:1;
+       unsigned int skipped_deactivate:1;
+
+       /* zone_reclaim_mode, boost reclaim */
+       unsigned int may_writepage:1;
+
+       /* zone_reclaim_mode */
+       unsigned int may_unmap:1;
+
+       /* zone_reclaim_mode, boost reclaim, cgroup restrictions */
+       unsigned int may_swap:1;
+
+       /* Not allow cache_trim_mode to be turned on as part of reclaim? */
+       unsigned int no_cache_trim_mode:1;
+
+       /* Has cache_trim_mode failed at least once? */
+       unsigned int cache_trim_mode_failed:1;
+
+       /* Proactive reclaim invoked by userspace */
+       unsigned int proactive:1;
+
+       /*
+        * Cgroup memory below memory.low is protected as long as we
+        * don't threaten to OOM. If any cgroup is reclaimed at
+        * reduced force or passed over entirely due to its memory.low
+        * setting (memcg_low_skipped), and nothing is reclaimed as a
+        * result, then go back for one more cycle that reclaims the protected
+        * memory (memcg_low_reclaim) to avert OOM.
+        */
+       unsigned int memcg_low_reclaim:1;
+       unsigned int memcg_low_skipped:1;
+
+       /* Shared cgroup tree walk failed, rescan the whole tree */
+       unsigned int memcg_full_walk:1;
+
+       unsigned int hibernation_mode:1;
+
+       /* One of the zones is ready for compaction */
+       unsigned int compaction_ready:1;
+
+       /* There is easily reclaimable cold cache in the current node */
+       unsigned int cache_trim_mode:1;
+
+       /* The file folios on the current node are dangerously low */
+       unsigned int file_is_tiny:1;
+
+       /* Always discard instead of demoting to lower tier memory */
+       unsigned int no_demotion:1;
+
+       /* Allocation order */
+       s8 order;
+
+       /* Scan (total_size >> priority) pages at once */
+       s8 priority;
+
+       /* The highest zone to isolate folios for reclaim from */
+       s8 reclaim_idx;
+
+       /* This context's GFP mask */
+       gfp_t gfp_mask;
+
+       /* Incremented by the number of inactive pages that were scanned */
+       unsigned long nr_scanned;
+
+       /* Number of pages freed so far during a call to shrink_zones() */
+       unsigned long nr_reclaimed;
+
+       struct {
+               unsigned int dirty;
+               unsigned int congested;
+               unsigned int writeback;
+               unsigned int immediate;
+               unsigned int taken;
+       } nr;
+
+       /* for recording the reclaimed slab by now */
+       struct reclaim_state reclaim_state;
+};
+
+#endif /* _MM_VMSCAN_INTERNAL_H */
+
 #define RECLAIM_WB_ANON                0x0001u
 #define RECLAIM_WB_FILE                0x0002u
 #define RECLAIM_WB_MIXED       0x0010u
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 0eb7fa8e1d43..2fd9b42f89d8 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -73,114 +73,6 @@
 #define CREATE_TRACE_POINTS
 #include "trace_vmscan.h"
 
-struct scan_control {
-       /* How many pages shrink_list() should reclaim */
-       unsigned long nr_to_reclaim;
-
-       /*
-        * Nodemask of nodes allowed by the caller. If NULL, all nodes
-        * are scanned.
-        */
-       const nodemask_t *nodemask;
-
-       /*
-        * The memory cgroup that hit its limit and as a result is the
-        * primary target of this reclaim invocation.
-        */
-       struct mem_cgroup *target_mem_cgroup;
-
-       /*
-        * Scan pressure balancing between anon and file LRUs
-        */
-       unsigned long   anon_cost;
-       unsigned long   file_cost;
-
-       /* Swappiness value for proactive reclaim. Always use sc_swappiness()! 
*/
-       int *proactive_swappiness;
-
-       /* Can active folios be deactivated as part of reclaim? */
-#define DEACTIVATE_ANON 1
-#define DEACTIVATE_FILE 2
-       unsigned int may_deactivate:2;
-       unsigned int force_deactivate:1;
-       unsigned int skipped_deactivate:1;
-
-       /* zone_reclaim_mode, boost reclaim */
-       unsigned int may_writepage:1;
-
-       /* zone_reclaim_mode */
-       unsigned int may_unmap:1;
-
-       /* zone_reclaim_mode, boost reclaim, cgroup restrictions */
-       unsigned int may_swap:1;
-
-       /* Not allow cache_trim_mode to be turned on as part of reclaim? */
-       unsigned int no_cache_trim_mode:1;
-
-       /* Has cache_trim_mode failed at least once? */
-       unsigned int cache_trim_mode_failed:1;
-
-       /* Proactive reclaim invoked by userspace */
-       unsigned int proactive:1;
-
-       /*
-        * Cgroup memory below memory.low is protected as long as we
-        * don't threaten to OOM. If any cgroup is reclaimed at
-        * reduced force or passed over entirely due to its memory.low
-        * setting (memcg_low_skipped), and nothing is reclaimed as a
-        * result, then go back for one more cycle that reclaims the protected
-        * memory (memcg_low_reclaim) to avert OOM.
-        */
-       unsigned int memcg_low_reclaim:1;
-       unsigned int memcg_low_skipped:1;
-
-       /* Shared cgroup tree walk failed, rescan the whole tree */
-       unsigned int memcg_full_walk:1;
-
-       unsigned int hibernation_mode:1;
-
-       /* One of the zones is ready for compaction */
-       unsigned int compaction_ready:1;
-
-       /* There is easily reclaimable cold cache in the current node */
-       unsigned int cache_trim_mode:1;
-
-       /* The file folios on the current node are dangerously low */
-       unsigned int file_is_tiny:1;
-
-       /* Always discard instead of demoting to lower tier memory */
-       unsigned int no_demotion:1;
-
-       /* Allocation order */
-       s8 order;
-
-       /* Scan (total_size >> priority) pages at once */
-       s8 priority;
-
-       /* The highest zone to isolate folios for reclaim from */
-       s8 reclaim_idx;
-
-       /* This context's GFP mask */
-       gfp_t gfp_mask;
-
-       /* Incremented by the number of inactive pages that were scanned */
-       unsigned long nr_scanned;
-
-       /* Number of pages freed so far during a call to shrink_zones() */
-       unsigned long nr_reclaimed;
-
-       struct {
-               unsigned int dirty;
-               unsigned int congested;
-               unsigned int writeback;
-               unsigned int immediate;
-               unsigned int taken;
-       } nr;
-
-       /* for recording the reclaimed slab by now */
-       struct reclaim_state reclaim_state;
-};
-
 #ifdef ARCH_HAS_PREFETCHW
 static inline void prefetchw_prev_lru_folio(struct folio *folio,
                struct list_head *base)
-- 
2.34.1


Reply via email to