Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752166AbdFSV1y (ORCPT ); Mon, 19 Jun 2017 17:27:54 -0400 Received: from mail.kernel.org ([198.145.29.99]:32862 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751022AbdFSV1x (ORCPT ); Mon, 19 Jun 2017 17:27:53 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9FAD0239D6 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=goodmis.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=rostedt@goodmis.org Date: Mon, 19 Jun 2017 17:27:50 -0400 From: Steven Rostedt To: Tejun Heo Cc: LKML , Linus Torvalds , Vladimir Davydov , Christoph Lameter , Pekka Enberg , David Rientjes , Joonsoo Kim , Andrew Morton Subject: Re: [LOCKDEP BUG] from slub: separate out sysfs_slab_release() from sysfs_slab_remove() Message-ID: <20170619172750.6890df32@gandalf.local.home> In-Reply-To: <20170619203538.GN12062@htj.duckdns.org> References: <20170616085507.3cc7d4b8@gandalf.local.home> <20170619203538.GN12062@htj.duckdns.org> X-Mailer: Claws Mail 3.14.0 (GTK+ 2.24.31; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2736 Lines: 95 On Mon, 19 Jun 2017 16:35:38 -0400 Tejun Heo 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) Tested-by: Steven Rostedt (VMware) -- 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)