On Mon, 19 Jun 2017 16:35:38 -0400 Tejun Heo <[email protected]> wrote:
> Hello, Steven. > > Can you please see whether the following patch makes the lockdep > warning go away? > Added the patch and the lockdep splat goes away. Removed it, and it comes back. Reported-by: Steven Rostedt (VMware) <[email protected]> Tested-by: Steven Rostedt (VMware) <[email protected]> -- Steve > diff --git a/include/linux/slub_def.h b/include/linux/slub_def.h > index 07ef550c6627..93315d6b21a8 100644 > --- a/include/linux/slub_def.h > +++ b/include/linux/slub_def.h > @@ -84,6 +84,7 @@ struct kmem_cache { > int red_left_pad; /* Left redzone padding size */ > #ifdef CONFIG_SYSFS > struct kobject kobj; /* For sysfs */ > + struct work_struct kobj_remove_work; > #endif > #ifdef CONFIG_MEMCG > struct memcg_cache_params memcg_params; > diff --git a/mm/slub.c b/mm/slub.c > index 7449593fca72..8addc535bcdc 100644 > --- a/mm/slub.c > +++ b/mm/slub.c > @@ -5625,6 +5625,28 @@ static char *create_unique_id(struct kmem_cache *s) > return name; > } > > +static void sysfs_slab_remove_workfn(struct work_struct *work) > +{ > + struct kmem_cache *s = > + container_of(work, struct kmem_cache, kobj_remove_work); > + > + if (!s->kobj.state_in_sysfs) > + /* > + * For a memcg cache, this may be called during > + * deactivation and again on shutdown. Remove only once. > + * A cache is never shut down before deactivation is > + * complete, so no need to worry about synchronization. > + */ > + return; > + > +#ifdef CONFIG_MEMCG > + kset_unregister(s->memcg_kset); > +#endif > + kobject_uevent(&s->kobj, KOBJ_REMOVE); > + kobject_del(&s->kobj); > + kobject_put(&s->kobj); > +} > + > static int sysfs_slab_add(struct kmem_cache *s) > { > int err; > @@ -5632,6 +5654,8 @@ static int sysfs_slab_add(struct kmem_cache *s) > struct kset *kset = cache_kset(s); > int unmergeable = slab_unmergeable(s); > > + INIT_WORK(&s->kobj_remove_work, sysfs_slab_remove_workfn); > + > if (!kset) { > kobject_init(&s->kobj, &slab_ktype); > return 0; > @@ -5695,20 +5719,8 @@ static void sysfs_slab_remove(struct kmem_cache *s) > */ > return; > > - if (!s->kobj.state_in_sysfs) > - /* > - * For a memcg cache, this may be called during > - * deactivation and again on shutdown. Remove only once. > - * A cache is never shut down before deactivation is > - * complete, so no need to worry about synchronization. > - */ > - return; > - > -#ifdef CONFIG_MEMCG > - kset_unregister(s->memcg_kset); > -#endif > - kobject_uevent(&s->kobj, KOBJ_REMOVE); > - kobject_del(&s->kobj); > + kobject_get(&s->kobj); > + schedule_work(&s->kobj_remove_work); > } > > void sysfs_slab_release(struct kmem_cache *s)

