From patchwork Thu Dec 19 22:10:19 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bjorn Helgaas X-Patchwork-Id: 3384551 X-Patchwork-Delegate: bhelgaas@google.com Return-Path: X-Original-To: patchwork-linux-pci@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id E3C649F32E for ; Thu, 19 Dec 2013 22:10:43 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 0AC39206A5 for ; Thu, 19 Dec 2013 22:10:43 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id D19542069D for ; Thu, 19 Dec 2013 22:10:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754470Ab3LSWKZ (ORCPT ); Thu, 19 Dec 2013 17:10:25 -0500 Received: from mail-ie0-f174.google.com ([209.85.223.174]:59961 "EHLO mail-ie0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753904Ab3LSWKY (ORCPT ); Thu, 19 Dec 2013 17:10:24 -0500 Received: by mail-ie0-f174.google.com with SMTP id at1so2129279iec.5 for ; Thu, 19 Dec 2013 14:10:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=date:from:to:cc:subject:message-id:references:mime-version :content-type:content-disposition:in-reply-to:user-agent; bh=CBHw+lgJWpTFzD+SX0hkwHgrfY9gFLh2y1J3MQASfbw=; b=RDXkrg/PA/+hCGI1szatXXCMOt9sHihtjdZgQc34eSmjSwk2yUHT3P5yBPYMxXeUDQ /WIwbaLUlUtJue/Lu2eJ3ltOCPekYC2NO/Z4408TyAwoIhdE9Jj9HbohH9nB5glEv3tZ ulxRU2Lt4YRn5oKkS9pNKvftLJtiyGSxzgr1tpAuUGNICYi2yxBnAJN9INxTsIFUlNSY EmllyndoDTY9qYgzIFsq+XpVCHUp8BJ/M43+a3oQEgJYxOy/2sD86z/0zUCLZjA7qWWJ iwiMFlNxdU7As8Bjo2oisabQdiQ5zA4dwN2VX1s9IeCCNXEhGEy91Zfkkv0857cX0SDO cTfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent; bh=CBHw+lgJWpTFzD+SX0hkwHgrfY9gFLh2y1J3MQASfbw=; b=U3zLNDsESHLcpjbTAzPDuLyXN0FhvNFTL4syDIPt+iLxsqT4t6Ji4wBEg6IZBxhA1y kDJzLKb8KVX58GVT+hbqCgK8jzJ54CXI35CfUhv0PSEQoK5oc95Tee+xljpV+blVsIzF DhwBeHDg+PJkHBdcLepIZSWRbzcegEwD0jwwLtXSE0qQLsFbOb4iUU7/Xwn7+6dHQtI4 GAdzXjBGTA3wN+UBY08saa7WR7RPBXAT6gQHNfnqqzWNyVPG6JKXu51EkKymxjW4NDVT 9XQztmcAcpZe2lX/KtTLJNX/+PKw+tAak8ICO6Q49kujswnnNtvQY4/D+mJ0NUOh2vme WvwQ== X-Gm-Message-State: ALoCoQkKVa9M43qLr96QZIcv1H2CzkfDO13L84J7oF2poxh8OIrZu1FvT88iSicffSwvvzpkk+iv1J4uhLl55/mcc1ntv6biDwLo9pPrkK9p+++um8WQgg0s9xKfBsXUCMfHaOUYufjLLNuyIp7et9KuQVHO87uTE9BRZANHWK93kloDwyvsq/n7W0uJ10jdDKlvO7J4LjhLD9iwcPeDQLxA+BQK1y12uQ== X-Received: by 10.50.225.39 with SMTP id rh7mr4587224igc.10.1387491023975; Thu, 19 Dec 2013 14:10:23 -0800 (PST) Received: from google.com ([172.29.120.126]) by mx.google.com with ESMTPSA id kb10sm7433031igb.6.2013.12.19.14.10.22 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Thu, 19 Dec 2013 14:10:23 -0800 (PST) Date: Thu, 19 Dec 2013 15:10:19 -0700 From: Bjorn Helgaas To: Levente Kurusa Cc: LKML , Andrew Murray , Myron Stowe , linux-pci@vger.kernel.org, Greg Kroah-Hartman , Yinghai Lu Subject: Re: [PATCH 32/38] pcie: add missing put_device call Message-ID: <20131219221019.GB15201@google.com> References: <1387465612-3673-33-git-send-email-levex@linux.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1387465612-3673-33-git-send-email-levex@linux.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org X-Spam-Status: No, score=-7.3 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FSL_HELO_FAKE, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP [+cc Greg, Yinghai] On Thu, Dec 19, 2013 at 04:06:46PM +0100, Levente Kurusa wrote: > This is required so that we give up the last reference to the device. > Removed the kfree() as put_device will result in release_pcie_device being > called and hence the container of the device will be kfree'd. > > Signed-off-by: Levente Kurusa Thanks, I applied a slightly modified version of this to my pci/deletion branch for v3.14. I think the get_device() after device_register() succeeds and the put_device() before device_unregister() are superfluous, so I propose the series included below. Any comments? > --- > drivers/pci/pcie/portdrv_core.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c > index 08d131f..80fb1f2 100644 > --- a/drivers/pci/pcie/portdrv_core.c > +++ b/drivers/pci/pcie/portdrv_core.c > @@ -345,7 +345,7 @@ static int pcie_device_init(struct pci_dev *pdev, int service, int irq) > > retval = device_register(device); > if (retval) > - kfree(pcie); > + put_device(device); > else > get_device(device); > return retval; commit 8f3acca9acec1503f6b374faef2d1013cbf502af Author: Bjorn Helgaas Date: Thu Dec 19 14:20:09 2013 -0700 PCI/portdrv: Cleanup error paths Make the straightline path the normal no-error path. Check for errors and return them directly, instead of checking for success and putting the normal path in an "if" body. No functional change. Signed-off-by: Bjorn Helgaas --- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c index 0b6e76604068..fc86d323fecc 100644 --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c @@ -344,11 +344,13 @@ static int pcie_device_init(struct pci_dev *pdev, int service, int irq) device_enable_async_suspend(device); retval = device_register(device); - if (retval) + if (retval) { kfree(pcie); - else - get_device(device); - return retval; + return retval; + } + + get_device(device); + return 0; } /** @@ -498,12 +500,12 @@ static int pcie_port_probe_service(struct device *dev) pciedev = to_pcie_device(dev); status = driver->probe(pciedev); - if (!status) { - dev_printk(KERN_DEBUG, dev, "service driver %s loaded\n", - driver->name); - get_device(dev); - } - return status; + if (status) + return status; + + dev_printk(KERN_DEBUG, dev, "service driver %s loaded\n", driver->name); + get_device(dev); + return 0; } /** commit f39862058e1f278e0495cd9ea57de571e74aa1fe Author: Levente Kurusa Date: Thu Dec 19 14:22:35 2013 -0700 PCI/portdrv: Add put_device() after device_register() failure This is required so that we give up the last reference to the device. Removed the kfree() as put_device will result in release_pcie_device() being called and hence the container of the device will be kfree'd. [bhelgaas: fix conflict after my previous cleanup] Signed-off-by: Levente Kurusa Signed-off-by: Bjorn Helgaas diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c index fc86d323fecc..9811eea53511 100644 --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c @@ -345,7 +345,7 @@ static int pcie_device_init(struct pci_dev *pdev, int service, int irq) retval = device_register(device); if (retval) { - kfree(pcie); + put_device(device); return retval; } commit e75f34ce6633549486a044d64b2a79240d4113a8 Author: Bjorn Helgaas Date: Thu Dec 19 14:24:13 2013 -0700 PCI/portdrv: Remove extra get_device()/put_device() for pcie_device Previously pcie_device_init() called get_device() if device_register() for the new pcie_device succeeded, and remove_iter() called put_device() when removing before unregistering the device. But device_register() already increments the reference count in device_add(), so we don't need to do it again here. Signed-off-by: Bjorn Helgaas diff --git a/drivers/pci/pcie/portdrv_core.c b/drivers/pci/pcie/portdrv_core.c index 9811eea53511..6a6e54909335 100644 --- a/drivers/pci/pcie/portdrv_core.c +++ b/drivers/pci/pcie/portdrv_core.c @@ -349,7 +349,6 @@ static int pcie_device_init(struct pci_dev *pdev, int service, int irq) return retval; } - get_device(device); return 0; } @@ -456,10 +455,8 @@ int pcie_port_device_resume(struct device *dev) static int remove_iter(struct device *dev, void *data) { - if (dev->bus == &pcie_port_bus_type) { - put_device(dev); + if (dev->bus == &pcie_port_bus_type) device_unregister(dev); - } return 0; }