On Mon, 21 Jun 2010, Christoph Lameter wrote: > > > if (slab_state == DOWN) { > > > - early_kmem_cache_node_alloc(gfpflags, node); > > > + early_kmem_cache_node_alloc(node); > > > continue; > > > } > > > n = kmem_cache_alloc_node(kmalloc_caches, > > > - gfpflags, node); > > > + GFP_KERNEL, node); > > > > > > if (!n) { > > > free_kmem_cache_nodes(s); > > > > Same here, this can still lead to GFP_KERNEL allocations from > > kmem_cache_init() because slab_state is PARTIAL or UP. > > You cannot do that here because this function is also used later when the > slab is up. There is more in the percpu allocator which we are also trying > to use to avoid having static kmem_cache_cpu declarations. GFP_KERNEL > needs to be usable during early boot otherwise functions will have to add > special casing for boot situations. > The gfp_allowed_mask only changes once irqs are enabled, so either the gfpflags need to be passed into init_kmem_cache_nodes again or we need to do something like gfp_t gfpflags = irqs_disabled() ? GFP_NOWAIT : GFP_KERNEL; locally. The cleanest solution would probably be to extend slab_state to be set in kmem_cache_init_late() to determine when we're fully initialized, though. > > > + for (i = 0; i < SLUB_PAGE_SHIFT; i++) { > > > + struct kmem_cache *s = &kmalloc_caches[i]; > > > + > > > + if (s && s->size) { > > > + char *name = kasprintf(GFP_KERNEL, > > > + "dma-kmalloc-%d", s->objsize); > > > > kasprintf() can return NULL which isn't caught by kmem_cache_open(). > > Then we will have a nameless cache. We could catch this with a WARN_ON() > but does this work that early? > It works, but this seems to be a forced if (WARN_ON(!name)) continue; because although it appears that s->name can be NULL within the slub layer, the sysfs layer would result in a NULL pointer dereference for things like strcmp() when looking up the cache's dirent. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>