mm: deduplicate cacheline padding code
authorShakeel Butt <shakeelb@google.com>
Fri, 26 Aug 2022 23:06:42 +0000 (23:06 +0000)
committerAndrew Morton <akpm@linux-foundation.org>
Tue, 27 Sep 2022 02:46:29 +0000 (19:46 -0700)
There are three users (mmzone.h, memcontrol.h, page_counter.h) using
similar code for forcing cacheline padding between fields of different
structures.  Dedup that code.

Link: https://lkml.kernel.org/r/20220826230642.566725-1-shakeelb@google.com
Signed-off-by: Shakeel Butt <shakeelb@google.com>
Suggested-by: Feng Tang <feng.tang@intel.com>
Reviewed-by: Feng Tang <feng.tang@intel.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/cache.h
include/linux/memcontrol.h
include/linux/mmzone.h
include/linux/page_counter.h

index d742c57eaee598cb3213e870108486ecaa1d5367..5da1bbd96154b6840334223e495e5a8837617e49 100644 (file)
 #define cache_line_size()      L1_CACHE_BYTES
 #endif
 
+/*
+ * Helper to add padding within a struct to ensure data fall into separate
+ * cachelines.
+ */
+#if defined(CONFIG_SMP)
+struct cacheline_padding {
+       char x[0];
+} ____cacheline_internodealigned_in_smp;
+#define CACHELINE_PADDING(name)                struct cacheline_padding name
+#else
+#define CACHELINE_PADDING(name)
+#endif
+
 #endif /* __LINUX_CACHE_H */
index 344022f102c2c84e0918e6fa9036fbb6e11dc500..60545e4a1c0344fc61e871c49becb2634ac5c344 100644 (file)
@@ -185,15 +185,6 @@ struct mem_cgroup_thresholds {
        struct mem_cgroup_threshold_ary *spare;
 };
 
-#if defined(CONFIG_SMP)
-struct memcg_padding {
-       char x[0];
-} ____cacheline_internodealigned_in_smp;
-#define MEMCG_PADDING(name)      struct memcg_padding name
-#else
-#define MEMCG_PADDING(name)
-#endif
-
 /*
  * Remember four most recent foreign writebacks with dirty pages in this
  * cgroup.  Inode sharing is expected to be uncommon and, even if we miss
@@ -304,7 +295,7 @@ struct mem_cgroup {
        spinlock_t              move_lock;
        unsigned long           move_lock_flags;
 
-       MEMCG_PADDING(_pad1_);
+       CACHELINE_PADDING(_pad1_);
 
        /* memory.stat */
        struct memcg_vmstats    vmstats;
@@ -326,7 +317,7 @@ struct mem_cgroup {
        struct list_head objcg_list;
 #endif
 
-       MEMCG_PADDING(_pad2_);
+       CACHELINE_PADDING(_pad2_);
 
        /*
         * set > 0 if pages under this cgroup are moving to other cgroup.
index e335a492c2ebfdf5209418170c30e8a503e93e44..c69c081568227a274faf43a518f53b699f6e1370 100644 (file)
@@ -121,20 +121,6 @@ static inline bool free_area_empty(struct free_area *area, int migratetype)
 
 struct pglist_data;
 
-/*
- * Add a wild amount of padding here to ensure data fall into separate
- * cachelines.  There are very few zone structures in the machine, so space
- * consumption is not a concern here.
- */
-#if defined(CONFIG_SMP)
-struct zone_padding {
-       char x[0];
-} ____cacheline_internodealigned_in_smp;
-#define ZONE_PADDING(name)     struct zone_padding name;
-#else
-#define ZONE_PADDING(name)
-#endif
-
 #ifdef CONFIG_NUMA
 enum numa_stat_item {
        NUMA_HIT,               /* allocated in intended node */
@@ -837,7 +823,7 @@ struct zone {
        int initialized;
 
        /* Write-intensive fields used from the page allocator */
-       ZONE_PADDING(_pad1_)
+       CACHELINE_PADDING(_pad1_);
 
        /* free areas of different sizes */
        struct free_area        free_area[MAX_ORDER];
@@ -849,7 +835,7 @@ struct zone {
        spinlock_t              lock;
 
        /* Write-intensive fields used by compaction and vmstats. */
-       ZONE_PADDING(_pad2_)
+       CACHELINE_PADDING(_pad2_);
 
        /*
         * When free pages are below this point, additional steps are taken
@@ -886,7 +872,7 @@ struct zone {
 
        bool                    contiguous;
 
-       ZONE_PADDING(_pad3_)
+       CACHELINE_PADDING(_pad3_);
        /* Zone statistics */
        atomic_long_t           vm_stat[NR_VM_ZONE_STAT_ITEMS];
        atomic_long_t           vm_numa_event[NR_VM_NUMA_EVENT_ITEMS];
@@ -1196,7 +1182,7 @@ typedef struct pglist_data {
 #endif /* CONFIG_NUMA */
 
        /* Write-intensive fields used by page reclaim */
-       ZONE_PADDING(_pad1_)
+       CACHELINE_PADDING(_pad1_);
 
 #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
        /*
@@ -1241,7 +1227,7 @@ typedef struct pglist_data {
        struct lru_gen_mm_walk  mm_walk;
 #endif
 
-       ZONE_PADDING(_pad2_)
+       CACHELINE_PADDING(_pad2_);
 
        /* Per-node vmstats */
        struct per_cpu_nodestat __percpu *per_cpu_nodestats;
index 78a1c934e4163eea5b94393dc1de52a31a390a26..c141ea9a95ef86c9eea582d1872485e73321914e 100644 (file)
@@ -7,22 +7,13 @@
 #include <linux/kernel.h>
 #include <asm/page.h>
 
-#if defined(CONFIG_SMP)
-struct pc_padding {
-       char x[0];
-} ____cacheline_internodealigned_in_smp;
-#define PC_PADDING(name)       struct pc_padding name
-#else
-#define PC_PADDING(name)
-#endif
-
 struct page_counter {
        /*
         * Make sure 'usage' does not share cacheline with any other field. The
         * memcg->memory.usage is a hot member of struct mem_cgroup.
         */
        atomic_long_t usage;
-       PC_PADDING(_pad1_);
+       CACHELINE_PADDING(_pad1_);
 
        /* effective memory.min and memory.min usage tracking */
        unsigned long emin;
@@ -38,7 +29,7 @@ struct page_counter {
        unsigned long failcnt;
 
        /* Keep all the read most fields in a separete cacheline. */
-       PC_PADDING(_pad2_);
+       CACHELINE_PADDING(_pad2_);
 
        unsigned long min;
        unsigned long low;