On Thu, 3 Dec 2015, Jesper Dangaard Brouer wrote: > + size_t i; > + > + flags &= gfp_allowed_mask; > + lockdep_trace_alloc(flags); > + > + if (slab_should_failslab(s, flags)) > + return 0; Ok here is an overlap with slub;'s pre_alloc_hook() and that stuff is really not allocator specific. Could make it generic and move the hook calls into slab_common.c/slab.h? That also gives you the opportunity to get the array option in there. > + s = memcg_kmem_get_cache(s, flags); > + > + cache_alloc_debugcheck_before(s, flags); > + > + local_irq_disable(); > + for (i = 0; i < size; i++) { > + void *objp = __do_cache_alloc(s, flags); > + > + // this call could be done outside IRQ disabled section > + objp = cache_alloc_debugcheck_after(s, flags, objp, _RET_IP_); > + > + if (unlikely(!objp)) > + goto error; > + > + prefetchw(objp); Is the prefetch really useful here? Only if these objects are immediately used I would think. > + p[i] = objp; > + } > + local_irq_enable(); > + > + /* Kmemleak and kmemcheck outside IRQ disabled section */ > + for (i = 0; i < size; i++) { > + void *x = p[i]; > + > + kmemleak_alloc_recursive(x, s->object_size, 1, s->flags, flags); > + kmemcheck_slab_alloc(s, flags, x, s->object_size); > + } > + > + /* Clear memory outside IRQ disabled section */ > + if (unlikely(flags & __GFP_ZERO)) > + for (i = 0; i < size; i++) > + memset(p[i], 0, s->object_size); Maybe make this one loop instead of two? > +// FIXME: Trace call missing... should we create a bulk variant? > +/* Like: > + trace_kmem_cache_alloc(_RET_IP_, ret, s->object_size, s->size, flags); > +*/ That trace call could be created when you do the genericization of the hooks() which also involve debugging stuff. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>