Commit de380b55f92986c1a84198149cb71b7228d15fbd

Authored by Tejun Heo
1 parent ea5a9f0c34

percpu: don't implicitly include slab.h from percpu.h

percpu.h has always been including slab.h to get k[mz]alloc/free() for
UP inline implementation.  percpu.h being used by very low level
headers including module.h and sched.h, this meant that a lot files
unintentionally got slab.h inclusion.

Lee Schermerhorn was trying to make topology.h use percpu.h and got
bitten by this implicit inclusion.  The right thing to do is break
this ultimately unnecessary dependency.  The previous patch added
explicit inclusion of either gfp.h or slab.h to the source files using
them.  This patch updates percpu.h such that slab.h is no longer
included from percpu.h.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Christoph Lameter <cl@linux-foundation.org>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Lee Schermerhorn <Lee.Schermerhorn@hp.com>

Showing 3 changed files with 40 additions and 26 deletions Side-by-side Diff

include/linux/percpu.h
... ... @@ -2,10 +2,10 @@
2 2 #define __LINUX_PERCPU_H
3 3  
4 4 #include <linux/preempt.h>
5   -#include <linux/slab.h> /* For kmalloc() */
6 5 #include <linux/smp.h>
7 6 #include <linux/cpumask.h>
8 7 #include <linux/pfn.h>
  8 +#include <linux/init.h>
9 9  
10 10 #include <asm/percpu.h>
11 11  
... ... @@ -135,9 +135,6 @@
135 135 #define per_cpu_ptr(ptr, cpu) SHIFT_PERCPU_PTR((ptr), per_cpu_offset((cpu)))
136 136  
137 137 extern void __percpu *__alloc_reserved_percpu(size_t size, size_t align);
138   -extern void __percpu *__alloc_percpu(size_t size, size_t align);
139   -extern void free_percpu(void __percpu *__pdata);
140   -extern phys_addr_t per_cpu_ptr_to_phys(void *addr);
141 138  
142 139 #ifndef CONFIG_HAVE_SETUP_PER_CPU_AREA
143 140 extern void __init setup_per_cpu_areas(void);
... ... @@ -147,27 +144,6 @@
147 144  
148 145 #define per_cpu_ptr(ptr, cpu) ({ (void)(cpu); (ptr); })
149 146  
150   -static inline void __percpu *__alloc_percpu(size_t size, size_t align)
151   -{
152   - /*
153   - * Can't easily make larger alignment work with kmalloc. WARN
154   - * on it. Larger alignment should only be used for module
155   - * percpu sections on SMP for which this path isn't used.
156   - */
157   - WARN_ON_ONCE(align > SMP_CACHE_BYTES);
158   - return kzalloc(size, GFP_KERNEL);
159   -}
160   -
161   -static inline void free_percpu(void __percpu *p)
162   -{
163   - kfree(p);
164   -}
165   -
166   -static inline phys_addr_t per_cpu_ptr_to_phys(void *addr)
167   -{
168   - return __pa(addr);
169   -}
170   -
171 147 static inline void __init setup_per_cpu_areas(void) { }
172 148  
173 149 static inline void *pcpu_lpage_remapped(void *kaddr)
... ... @@ -176,6 +152,10 @@
176 152 }
177 153  
178 154 #endif /* CONFIG_SMP */
  155 +
  156 +extern void __percpu *__alloc_percpu(size_t size, size_t align);
  157 +extern void free_percpu(void __percpu *__pdata);
  158 +extern phys_addr_t per_cpu_ptr_to_phys(void *addr);
179 159  
180 160 #define alloc_percpu(type) \
181 161 (typeof(type) __percpu *)__alloc_percpu(sizeof(type), __alignof__(type))
... ... @@ -33,7 +33,11 @@
33 33 obj-$(CONFIG_MEMORY_HOTPLUG) += memory_hotplug.o
34 34 obj-$(CONFIG_FS_XIP) += filemap_xip.o
35 35 obj-$(CONFIG_MIGRATION) += migrate.o
36   -obj-$(CONFIG_SMP) += percpu.o
  36 +ifdef CONFIG_SMP
  37 +obj-y += percpu.o
  38 +else
  39 +obj-y += percpu_up.o
  40 +endif
37 41 obj-$(CONFIG_QUICKLIST) += quicklist.o
38 42 obj-$(CONFIG_CGROUP_MEM_RES_CTLR) += memcontrol.o page_cgroup.o
39 43 obj-$(CONFIG_MEMORY_FAILURE) += memory-failure.o
  1 +/*
  2 + * mm/percpu_up.c - dummy percpu memory allocator implementation for UP
  3 + */
  4 +
  5 +#include <linux/module.h>
  6 +#include <linux/percpu.h>
  7 +#include <linux/slab.h>
  8 +
  9 +void __percpu *__alloc_percpu(size_t size, size_t align)
  10 +{
  11 + /*
  12 + * Can't easily make larger alignment work with kmalloc. WARN
  13 + * on it. Larger alignment should only be used for module
  14 + * percpu sections on SMP for which this path isn't used.
  15 + */
  16 + WARN_ON_ONCE(align > SMP_CACHE_BYTES);
  17 + return kzalloc(size, GFP_KERNEL);
  18 +}
  19 +EXPORT_SYMBOL_GPL(__alloc_percpu);
  20 +
  21 +void free_percpu(void __percpu *p)
  22 +{
  23 + kfree(p);
  24 +}
  25 +EXPORT_SYMBOL_GPL(free_percpu);
  26 +
  27 +phys_addr_t per_cpu_ptr_to_phys(void *addr)
  28 +{
  29 + return __pa(addr);
  30 +}