Received: by 2002:a25:1985:0:0:0:0:0 with SMTP id 127csp4068035ybz; Mon, 20 Apr 2020 15:05:34 -0700 (PDT) X-Google-Smtp-Source: APiQypJhRe6IR5CMA4uZAdgMFavJoze/v+otL/D1I71HXkx0ffDctdksPoAophRP25RLvwr6CSlW X-Received: by 2002:a17:906:af59:: with SMTP id ly25mr18174790ejb.65.1587420334628; Mon, 20 Apr 2020 15:05:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1587420334; cv=none; d=google.com; s=arc-20160816; b=ENl9DjEcQTvo5a5bdidt5Cz2Hjz4aaweTTNpul23TIjB5muwpzAQnK87GkUTGmn4OS 56GiU5pMjMTCqlCDGfAJrSQkUCmjsg2Jb0AqILgpUrDddPD1rsIR8bvC6lHZaKzn4kBu jpSjgh9vIXPjThPjkdNZtHQqgEImT3XnPFAbzdx55f6qFRCEKHUvr/0Nx5z+31kKZTOb IJK49mD4vSfQCFqstlrDLjVyN5rs2ko+vxyzG2Tg4fzM7UCx9lRuD4AbCR6Yr6V3tRLS XR+KYvCKTeWTdfLfWqc/ddQFBczK+x8Tou41BPBJKiW63fzWVExD9k0CziLuCAkY2wBu Jsqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=GkO5OPMfjblm2nsbFSt6vLqg6Y5q/RvWe2WQ/AkzzSw=; b=J0Rzu52kVU46NiOprXrpkg/WXTrQ0faNiqNQVRZmGoPqffLlNvpBszgyGDJE6FcLAe CMdN6vljVLeSQGm9/o52Ccqgwkw9AxC35NvKLkKJCM1/YQSWWVtIrx8UPTG0mbXYEaQ6 Nx21yZCt5xwco2ROJ/nz+V/oM/PtAea9I3tiOI//V4vewaDjC8N8XXjfU1YIJ/Tjkp4H vYnYroYM/tAUnAB6nSt8kkpxod/h7fM/D4SDk/Om/4QAE7obRkbtvtAD+5JRnSQ3KIZ3 Z99vRPEGrd+vM9ofqi9V5q40aTwI1F+LZNbNrblD6l1Y7vNOvyMI91RSWthEqDPJvfPt KatQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=RLT9hDOh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id bz17si283229ejc.528.2020.04.20.15.05.11; Mon, 20 Apr 2020 15:05:34 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=RLT9hDOh; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726316AbgDTWDy (ORCPT + 99 others); Mon, 20 Apr 2020 18:03:54 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36868 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725774AbgDTWDy (ORCPT ); Mon, 20 Apr 2020 18:03:54 -0400 Received: from mail-pf1-x441.google.com (mail-pf1-x441.google.com [IPv6:2607:f8b0:4864:20::441]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 865CDC061A0C for ; Mon, 20 Apr 2020 15:03:53 -0700 (PDT) Received: by mail-pf1-x441.google.com with SMTP id d184so1233128pfd.4 for ; Mon, 20 Apr 2020 15:03:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=GkO5OPMfjblm2nsbFSt6vLqg6Y5q/RvWe2WQ/AkzzSw=; b=RLT9hDOhYDaVrOb3NQXEzKxLHu29Fry2nuuaORCMrniqJ6qFBrzkqExYtQsHcw+PV3 7O6N4Js3skiA85xYqwa4OXyxNXaoSVywnwsyGIBQPrrbuM+9qedw62FvSYonGlzH53Vp 1ZRz9H3HA+v1LH386c5pUp+6yQc6fYgdisIlUJGHsnvepCqAHnzS4jBNtwViMFUv8EW4 j5IxVqiUy04j74GBYjPPr3O8I8HZonBfK2NKdS4ew22JAAKHNLOE0aAsC1XkNJ1z2jbh cgvOnISKLT1x4FXcUcTTYnqEbZpOq81T25jZLx2CWYni87ck/VIgHgmrqSacW5pVV4Oh aJLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=GkO5OPMfjblm2nsbFSt6vLqg6Y5q/RvWe2WQ/AkzzSw=; b=s/NQlbcecip6gc4scCyggv5KP83m65IRin6guB904jpK7S5IsBFbSSo/TpRt57BEme vjODvQZMOSIwgRMJ1LLTvo9vy+YbwdAiMIPmHzGmYRB8lkhRKeL4tfm8uUbsc53NiKjV XhjmDSQlE3gavoZlbV7mHxBfkUcPhrryegYHBYNEZyk+vVw4FWEvVcX3mU4ouNJd3Nh/ jIvWHfmmuUqUn9rrM1R/TWPhl8fTWIOerwndqKFg3ocZZ/wgI6dWVOO77KpvI6moLpQC e23JPrpDVv+93/fTVohdX/AtoKmsGwKr3ZXLUzlzpjKMeiBWb91wN8ZyguRpYA7n8tWT 81wg== X-Gm-Message-State: AGi0PubnoSavJwE3UG5Eu8rMWoa9JA/mYVDn2nbkP7DeY+/EMuIzlLtm G9/kWF6T+TjF2FLgO8JoYHag7WGSmi2+tmqfTw5XOw== X-Received: by 2002:a63:cf10:: with SMTP id j16mr18229361pgg.201.1587420232829; Mon, 20 Apr 2020 15:03:52 -0700 (PDT) MIME-Version: 1.0 References: <20200414204240.186377-1-brendanhiggins@google.com> <20200415061154.GA2496263@kroah.com> <20200415084653.GM2828150@kuha.fi.intel.com> <20200415131018.GO2828150@kuha.fi.intel.com> <20200415133122.GB3461248@kroah.com> <20200417113956.GA3728594@kuha.fi.intel.com> In-Reply-To: From: Brendan Higgins Date: Mon, 20 Apr 2020 15:03:41 -0700 Message-ID: Subject: Re: [PATCH v1] kobject: make sure parent is not released before children To: Randy Dunlap Cc: Heikki Krogerus , Greg KH , "Rafael J. Wysocki" , Linux Kernel Mailing List , Naresh Kamboju , Sakari Ailus , Andy Shevchenko , Hans de Goede , Rafael Wysocki , "open list:KERNEL SELFTEST FRAMEWORK" , Steven Rostedt , Sergey Senozhatsky , Andy Shevchenko , Shuah Khan , Anders Roxell , lkft-triage@lists.linaro.org, Rasmus Villemoes Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Apr 17, 2020 at 9:08 AM Randy Dunlap wrote: > > On 4/17/20 4:39 AM, Heikki Krogerus wrote: > > Hi, > > > >>>> An alternative might be to define something like __kobject_del() doing > >>>> everything that kobject_del() does *without* the > >>>> kobject_put(kobj->parent). > >>>> > >>>> Then, kobject_del() could be defined as something like (pseudocode): > >>>> > >>>> kobject_del(kobj) > >>>> { > >>>> kobject *perent = kobj->parent; > >>>> > >>>> __kobject_del(kobj); > >>>> kobject_put(parent); > >>>> } > >>>> > >>>> and kobject_cleanup() could call __kobject_del() instead of > >>>> kobject_del() and then do the last kobject_put(parent) when it is done > >>>> with the child. > >>>> > >>>> Would that work? > >>> > >>> I think so. Greg, what do you think? > >> > >> Hm, maybe. Can someone test it out with the reproducer? > > > > Brendan, or Randy! Can you guys test Rafael's proposal? I think it > > would look like this: > > patch is whitespace-damaged. did you copy-paste it from a screen? > > > Anyway, it works for me. I loaded & unloaded test_printf.ko 5 times > without a problem. I just tried it as well. I also noticed some whitespace corruption, but it otherwise worked against the KUnit reproducer I wrote: https://lore.kernel.org/patchwork/patch/1224002/ Thanks! > Thanks. > > > diff --git a/lib/kobject.c b/lib/kobject.c > > index 83198cb37d8d..2bd631460e18 100644 > > --- a/lib/kobject.c > > +++ b/lib/kobject.c > > @@ -599,14 +599,7 @@ int kobject_move(struct kobject *kobj, struct kobject *new_parent) > > } > > EXPORT_SYMBOL_GPL(kobject_move); > > > > -/** > > - * kobject_del() - Unlink kobject from hierarchy. > > - * @kobj: object. > > - * > > - * This is the function that should be called to delete an object > > - * successfully added via kobject_add(). > > - */ > > -void kobject_del(struct kobject *kobj) > > +static void __kobject_del(struct kobject *kobj) > > { > > struct kernfs_node *sd; > > const struct kobj_type *ktype; > > @@ -625,9 +618,23 @@ void kobject_del(struct kobject *kobj) > > > > kobj->state_in_sysfs = 0; > > kobj_kset_leave(kobj); > > - kobject_put(kobj->parent); > > kobj->parent = NULL; > > } > > + > > +/** > > + * kobject_del() - Unlink kobject from hierarchy. > > + * @kobj: object. > > + * > > + * This is the function that should be called to delete an object > > + * successfully added via kobject_add(). > > + */ > > +void kobject_del(struct kobject *kobj) > > +{ > > + struct kobject *parent = kobj->parent; > > + > > + __kobject_del(kobj); > > + kobject_put(parent); > > +} > > EXPORT_SYMBOL(kobject_del); > > > > /** > > @@ -663,6 +670,7 @@ EXPORT_SYMBOL(kobject_get_unless_zero); > > */ > > static void kobject_cleanup(struct kobject *kobj) > > { > > + struct kobject *parent = kobj->parent; > > struct kobj_type *t = get_ktype(kobj); > > const char *name = kobj->name; > > > > @@ -684,7 +692,7 @@ static void kobject_cleanup(struct kobject *kobj) > > if (kobj->state_in_sysfs) { > > pr_debug("kobject: '%s' (%p): auto cleanup kobject_del\n", > > kobject_name(kobj), kobj); > > - kobject_del(kobj); > > + __kobject_del(kobj); > > } > > > > if (t && t->release) { > > @@ -698,6 +706,8 @@ static void kobject_cleanup(struct kobject *kobj) > > pr_debug("kobject: '%s': free name\n", name); > > kfree_const(name); > > } > > + > > + kobject_put(parent); > > } > > > > #ifdef CONFIG_DEBUG_KOBJECT_RELEASE > > > > > > thanks, > > > > > -- > ~Randy > Reported-by: Randy Dunlap