On Fri, Oct 2, 2020 at 9:07 AM Jann Horn <ja...@google.com> wrote: > > On Tue, Sep 29, 2020 at 3:38 PM Marco Elver <el...@google.com> wrote: > > Inserts KFENCE hooks into the SLUB allocator. > [...] > > diff --git a/mm/slub.c b/mm/slub.c > [...] > > @@ -3290,8 +3314,14 @@ int kmem_cache_alloc_bulk(struct kmem_cache *s, > > gfp_t flags, size_t size, > > c = this_cpu_ptr(s->cpu_slab); > > > > for (i = 0; i < size; i++) { > > - void *object = c->freelist; > > + void *object = kfence_alloc(s, s->object_size, flags); > > kfence_alloc() will invoke ->ctor() callbacks if the current slab has > them. Is it fine to invoke such callbacks from here, where we're in > the middle of a section that disables interrupts to protect against > concurrent freelist changes? If someone decides to be extra smart and > uses a kmem_cache with a ->ctor that can allocate memory from the same > kmem_cache, or something along those lines, this could lead to > corruption of the SLUB freelist. But I'm not sure whether that can > happen in practice.
>From cache_init_objs_debug() in mm/slab.c: /* * Constructors are not allowed to allocate memory from the same * cache which they are a constructor for. Otherwise, deadlock. * They must also be threaded. */ So, no, it is not allowed to allocate from the same cache in the constructor. > Still, it might be nicer if you could code this to behave like a > fastpath miss: Update c->tid, turn interrupts back on (___slab_alloc() > will also do that if it has to call into the page allocator), then let > kfence do the actual allocation in a more normal context, then turn > interrupts back off and go on. If that's not too complicated? > > Maybe Christoph Lameter has opinions on whether this is necessary... > it admittedly is fairly theoretical. > > > + if (unlikely(object)) { > > + p[i] = object; > > + continue; > > + } > > + > > + object = c->freelist; > > if (unlikely(!object)) { > > /* > > * We may have removed an object from c->freelist > > using -- Alexander Potapenko Software Engineer Google Germany GmbH Erika-Mann-Straße, 33 80636 München Geschäftsführer: Paul Manicle, Halimah DeLaine Prado Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg