#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 */
 
        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
        spinlock_t              move_lock;
        unsigned long           move_lock_flags;
 
-       MEMCG_PADDING(_pad1_);
+       CACHELINE_PADDING(_pad1_);
 
        /* memory.stat */
        struct memcg_vmstats    vmstats;
        struct list_head objcg_list;
 #endif
 
-       MEMCG_PADDING(_pad2_);
+       CACHELINE_PADDING(_pad2_);
 
        /*
         * set > 0 if pages under this cgroup are moving to other cgroup.
 
 
 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 */
        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];
        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
 
        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];
 #endif /* CONFIG_NUMA */
 
        /* Write-intensive fields used by page reclaim */
-       ZONE_PADDING(_pad1_)
+       CACHELINE_PADDING(_pad1_);
 
 #ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT
        /*
        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;
 
 #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;
        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;