--- include/linux/percpu.h | 3 ++- mm/allocpercpu.c | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) Index: linux-2.6/mm/allocpercpu.c =================================================================== --- linux-2.6.orig/mm/allocpercpu.c 2007-10-30 23:41:09.000000000 -0700 +++ linux-2.6/mm/allocpercpu.c 2007-10-31 08:28:32.000000000 -0700 @@ -19,7 +19,7 @@ static DEFINE_SPINLOCK(cpu_area_lock); static u8 cpu_alloc_map[UNITS_PER_CPU] = { 1, }; static DEFINE_PER_CPU(int, cpu_area)[UNITS_PER_CPU]; -#define CPU_DATA_OFFSET ((char *)&per_cpu__cpu_area - __per_cpu_start) +#define CPU_DATA_OFFSET ((unsigned long)&per_cpu__cpu_area) static inline int size_to_units(unsigned long size) { @@ -72,6 +72,7 @@ static inline void *cpu_alloc(unsigned l set_map(start, units); __count_vm_events(ALLOC_PERCPU, units * sizeof(int)); spin_unlock(&cpu_area_lock); + printk("cpu_alloc(%ld) = %ld\n", size, start); return (void *)(start * sizeof(int) + CPU_DATA_OFFSET); } @@ -89,6 +90,7 @@ static inline void cpu_free(void *pcpu) units = clear_map(start); __count_vm_events(ALLOC_PERCPU, -units * sizeof(int)); spin_unlock(&cpu_area_lock); + printk("cpu_free(%ld) units=%d\n", start, units); } /** @@ -135,8 +137,9 @@ EXPORT_SYMBOL_GPL(__percpu_depopulate_ma void *percpu_populate(void *__pdata, size_t size, gfp_t gfp, int cpu) { int pdata = (unsigned long)__percpu_disguise(__pdata); - void *p = (void *)per_cpu(cpu_area, cpu) + pdata; + void *p = (void *)per_cpu_offset(cpu) + pdata; + printk("Zeroing %p %ld cpu_area=%p pdata=%lx CPU_DATA_OFFSET=%lx\n", p, size, per_cpu__cpu_area, pdata, CPU_DATA_OFFSET); memset(p, 0, size); return p; } @@ -184,6 +187,9 @@ void *__percpu_alloc_mask(size_t size, g if (unlikely(!pdata)) return NULL; + printk("__percpu_alloc_mask(%d,%x) result = %p\n", + size, gfp, pdata); + if (likely(!__percpu_populate_mask(__pdata, size, gfp, mask))) return __pdata; return NULL; Index: linux-2.6/include/linux/percpu.h =================================================================== --- linux-2.6.orig/include/linux/percpu.h 2007-10-30 23:42:31.000000000 -0700 +++ linux-2.6/include/linux/percpu.h 2007-10-31 08:28:27.000000000 -0700 @@ -43,7 +43,8 @@ ({ \ void *p = __percpu_disguise(ptr); \ unsigned long q = per_cpu_offset(cpu); \ - (__typeof__(ptr))(p + q); \ + printk(KERN_ERR "percpu_ptr(%p, %d) %p + %lx = %p\n", p, cpu, p, q, p + q); \ + (__typeof__(ptr))(p + q); \ }) extern void *percpu_populate(void *__pdata, size_t size, gfp_t gfp, int cpu);