From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 43F221B5C3 for ; Fri, 23 Nov 2018 18:04:49 +0100 (CET) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5427AA404C; Fri, 23 Nov 2018 17:04:48 +0000 (UTC) Received: from [10.36.112.54] (ovpn-112-54.ams2.redhat.com [10.36.112.54]) by smtp.corp.redhat.com (Postfix) with ESMTPS id DA13917F3F; Fri, 23 Nov 2018 17:04:46 +0000 (UTC) To: Darek Stojaczyk , dev@dpdk.org Cc: gaetan.rivet@6wind.com, thomas@monjalon.net References: <20181121193827.62540-1-dariusz.stojaczyk@intel.com> <20181123154328.97021-1-dariusz.stojaczyk@intel.com> From: Maxime Coquelin Message-ID: Date: Fri, 23 Nov 2018 18:04:44 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 In-Reply-To: <20181123154328.97021-1-dariusz.stojaczyk@intel.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 23 Nov 2018 17:04:48 +0000 (UTC) Subject: Re: [dpdk-dev] [PATCH v3] dev: don't remove devargs that are still referenced X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 23 Nov 2018 17:04:49 -0000 Hi, On 11/23/18 4:43 PM, Darek Stojaczyk wrote: > Even if a device failed to plug, it's still a device > object that references the devargs. Those devargs will > be freed automatically together with the device, but > freeing them any earlier - like it's done in the hotplug > error handling path right now - will give us a dangling > pointer and a segfault scenario. > > Consider the following case: > * secondary process receives the hotplug request IPC message > * devargs are either created or updated > * the bus is scanned > * a new device object is created with the latest devargs > * the device can't be plugged for whatever reason, > bus->plug returns error > * the devargs are freed, even though they're still referenced > by the device object on the bus > > For PCI devices, the generic device name comes from > a buffer within the devargs. Freeing those will make > EAL segfault whenever the device name is checked. > > This patch just prevents the hotplug error handling > path from removing the devargs when there's a device > that references them. This is done by simply exiting > early from the hotplug function. As mentioned in the > beginning, those devargs will be freed later, together > with the device itself. > > Fixes: 7e8b26650146 ("eal: fix hotplug add / remove") Should you also cc stable? Above commit is in since v17.08. > Cc: gaetan.rivet@6wind.com > Cc: thomas@monjalon.net > > Signed-off-by: Darek Stojaczyk > --- > Changes since v2: > * added an extra comment (Gaetan) > > Changes since v1: > * described the failing scenario in commit msg (Thomas) > > lib/librte_eal/common/eal_common_dev.c | 13 ++++++++----- > 1 file changed, 8 insertions(+), 5 deletions(-) > > diff --git a/lib/librte_eal/common/eal_common_dev.c b/lib/librte_eal/common/eal_common_dev.c > index 1fdc9ab17..d7950bc9a 100644 > --- a/lib/librte_eal/common/eal_common_dev.c > +++ b/lib/librte_eal/common/eal_common_dev.c > @@ -166,14 +166,17 @@ local_dev_probe(const char *devargs, struct rte_device **new_dev) > ret = -ENODEV; > goto err_devarg; > } > + /* Since there is a matching device, it is now its responsibility > + * to manage the devargs we've just inserted. From this point > + * those devargs shouldn't be removed manually anymore. > + */ > > ret = dev->bus->plug(dev); > if (ret) { > - if (rte_dev_is_probed(dev)) /* if already succeeded earlier */ > - return ret; /* no rollback */ > - RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", > - dev->name); > - goto err_devarg; > + if (!rte_dev_is_probed(dev)) /* if hasn't succeeded earlier */ > + RTE_LOG(ERR, EAL, "Driver cannot attach the device (%s)\n", > + dev->name); > + return ret; > } > > *new_dev = dev; > Other than that, it looks good to me: Acked-by: Maxime Coquelin Regards, Maxime