On Wed, 25 Aug 2010, Pekka Enberg wrote: > I dropped slub cleanups from -next until we've resolved the UP boot time crash > problem. > It works here with this patch. I'd rather see a general solution so that we can use allocpercpu for bootstrapping any allocator without such special bandaids. Subject: Slub: UP bandaid Since the percpu allocator does not provide early allocation in UP mode (only in SMP configurations) use __get_free_page() to improvise a compound page allocation that can be later freed via kfree(). Compound pages will be released when the cpu caches are resized. Signed-off-by: Christoph Lameter <cl@xxxxxxxxx> --- mm/slub.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) Index: linux-2.6/mm/slub.c =================================================================== --- linux-2.6.orig/mm/slub.c 2010-08-24 20:07:12.766010774 -0500 +++ linux-2.6/mm/slub.c 2010-08-24 20:15:46.304130417 -0500 @@ -2064,8 +2064,24 @@ static inline int alloc_kmem_cache_cpus(struct kmem_cache *s) { +#ifdef CONFIG_SMP + /* + * Will use reserve that does not require slab operation during + * early boot. + */ BUILD_BUG_ON(PERCPU_DYNAMIC_EARLY_SIZE < SLUB_PAGE_SHIFT * sizeof(struct kmem_cache_cpu)); +#else + /* + * Special hack for UP mode. allocpercpu() falls back to kmalloc + * operations. So we cannot use that before the slab allocator is up + * Simply get the smallest possible compound page. The page will be + * released via kfree() when the cpu caches are resized later. + */ + if (slab_state < UP) + s->cpu_slab = (__percpu void *)__get_free_page(GFP_NOWAIT, 1); + else +#endif s->cpu_slab = alloc_percpu(struct kmem_cache_cpu); -- To unsubscribe from this list: send the line "unsubscribe linux-next" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html