Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/penberg/slab-2.6:
SLAB: Record actual last user of freed objects.
slub: always align cpu_slab to honor cmpxchg_double requirement

+12 -12
+3
include/linux/percpu.h
··· 259 * Special handling for cmpxchg_double. cmpxchg_double is passed two 260 * percpu variables. The first has to be aligned to a double word 261 * boundary and the second has to follow directly thereafter. 262 */ 263 #define __pcpu_double_call_return_bool(stem, pcp1, pcp2, ...) \ 264 ({ \
··· 259 * Special handling for cmpxchg_double. cmpxchg_double is passed two 260 * percpu variables. The first has to be aligned to a double word 261 * boundary and the second has to follow directly thereafter. 262 + * We enforce this on all architectures even if they don't support 263 + * a double cmpxchg instruction, since it's a cheap requirement, and it 264 + * avoids breaking the requirement for architectures with the instruction. 265 */ 266 #define __pcpu_double_call_return_bool(stem, pcp1, pcp2, ...) \ 267 ({ \
+5 -4
mm/slab.c
··· 3604 * Release an obj back to its cache. If the obj has a constructed state, it must 3605 * be in this state _before_ it is released. Called with disabled ints. 3606 */ 3607 - static inline void __cache_free(struct kmem_cache *cachep, void *objp) 3608 { 3609 struct array_cache *ac = cpu_cache_get(cachep); 3610 3611 check_irq_off(); 3612 kmemleak_free_recursive(objp, cachep->flags); 3613 - objp = cache_free_debugcheck(cachep, objp, __builtin_return_address(0)); 3614 3615 kmemcheck_slab_free(cachep, objp, obj_size(cachep)); 3616 ··· 3802 debug_check_no_locks_freed(objp, obj_size(cachep)); 3803 if (!(cachep->flags & SLAB_DEBUG_OBJECTS)) 3804 debug_check_no_obj_freed(objp, obj_size(cachep)); 3805 - __cache_free(cachep, objp); 3806 local_irq_restore(flags); 3807 3808 trace_kmem_cache_free(_RET_IP_, objp); ··· 3832 c = virt_to_cache(objp); 3833 debug_check_no_locks_freed(objp, obj_size(c)); 3834 debug_check_no_obj_freed(objp, obj_size(c)); 3835 - __cache_free(c, (void *)objp); 3836 local_irq_restore(flags); 3837 } 3838 EXPORT_SYMBOL(kfree);
··· 3604 * Release an obj back to its cache. If the obj has a constructed state, it must 3605 * be in this state _before_ it is released. Called with disabled ints. 3606 */ 3607 + static inline void __cache_free(struct kmem_cache *cachep, void *objp, 3608 + void *caller) 3609 { 3610 struct array_cache *ac = cpu_cache_get(cachep); 3611 3612 check_irq_off(); 3613 kmemleak_free_recursive(objp, cachep->flags); 3614 + objp = cache_free_debugcheck(cachep, objp, caller); 3615 3616 kmemcheck_slab_free(cachep, objp, obj_size(cachep)); 3617 ··· 3801 debug_check_no_locks_freed(objp, obj_size(cachep)); 3802 if (!(cachep->flags & SLAB_DEBUG_OBJECTS)) 3803 debug_check_no_obj_freed(objp, obj_size(cachep)); 3804 + __cache_free(cachep, objp, __builtin_return_address(0)); 3805 local_irq_restore(flags); 3806 3807 trace_kmem_cache_free(_RET_IP_, objp); ··· 3831 c = virt_to_cache(objp); 3832 debug_check_no_locks_freed(objp, obj_size(c)); 3833 debug_check_no_obj_freed(objp, obj_size(c)); 3834 + __cache_free(c, (void *)objp, __builtin_return_address(0)); 3835 local_irq_restore(flags); 3836 } 3837 EXPORT_SYMBOL(kfree);
+4 -8
mm/slub.c
··· 2320 BUILD_BUG_ON(PERCPU_DYNAMIC_EARLY_SIZE < 2321 SLUB_PAGE_SHIFT * sizeof(struct kmem_cache_cpu)); 2322 2323 - #ifdef CONFIG_CMPXCHG_LOCAL 2324 /* 2325 - * Must align to double word boundary for the double cmpxchg instructions 2326 - * to work. 2327 */ 2328 - s->cpu_slab = __alloc_percpu(sizeof(struct kmem_cache_cpu), 2 * sizeof(void *)); 2329 - #else 2330 - /* Regular alignment is sufficient */ 2331 - s->cpu_slab = alloc_percpu(struct kmem_cache_cpu); 2332 - #endif 2333 2334 if (!s->cpu_slab) 2335 return 0;
··· 2320 BUILD_BUG_ON(PERCPU_DYNAMIC_EARLY_SIZE < 2321 SLUB_PAGE_SHIFT * sizeof(struct kmem_cache_cpu)); 2322 2323 /* 2324 + * Must align to double word boundary for the double cmpxchg 2325 + * instructions to work; see __pcpu_double_call_return_bool(). 2326 */ 2327 + s->cpu_slab = __alloc_percpu(sizeof(struct kmem_cache_cpu), 2328 + 2 * sizeof(void *)); 2329 2330 if (!s->cpu_slab) 2331 return 0;