[{"id":1775043,"web_url":"http://patchwork.ozlabs.org/comment/1775043/","msgid":"<20170925234439.GG15970@bhelgaas-glaptop.roam.corp.google.com>","list_archive_url":null,"date":"2017-09-25T23:44:39","subject":"Re: [PATCH 1/3] PCI: fix race condition with driver_override","submitter":{"id":67298,"url":"http://patchwork.ozlabs.org/api/people/67298/","name":"Bjorn Helgaas","email":"helgaas@kernel.org"},"content":"On Mon, Sep 11, 2017 at 09:45:40AM +0200, Nicolai Stange wrote:\n> The driver_override implementation is susceptible to a race condition when\n> different threads are reading vs. storing a different driver override.\n> Add locking to avoid the race condition.\n> \n> This is in close analogy to commit 6265539776a0 (\"driver core: platform:\n> fix race condition with driver_override\") from Adrian Salido.\n> \n> Fixes: 782a985d7af2 (\"PCI: Introduce new device binding path using pci_dev.driver_override\")\n> Cc: stable@vger.kernel.org\t# v3.16+\n> Signed-off-by: Nicolai Stange <nstange@suse.de>\n\nApplied to for-linus for v4.14, thanks!\n\n> ---\n>  drivers/pci/pci-sysfs.c | 11 +++++++++--\n>  1 file changed, 9 insertions(+), 2 deletions(-)\n> \n> diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c\n> index 1eecfa301f7f..8e075ea2743e 100644\n> --- a/drivers/pci/pci-sysfs.c\n> +++ b/drivers/pci/pci-sysfs.c\n> @@ -686,7 +686,7 @@ static ssize_t driver_override_store(struct device *dev,\n>  \t\t\t\t     const char *buf, size_t count)\n>  {\n>  \tstruct pci_dev *pdev = to_pci_dev(dev);\n> -\tchar *driver_override, *old = pdev->driver_override, *cp;\n> +\tchar *driver_override, *old, *cp;\n>  \n>  \t/* We need to keep extra room for a newline */\n>  \tif (count >= (PAGE_SIZE - 1))\n> @@ -700,12 +700,15 @@ static ssize_t driver_override_store(struct device *dev,\n>  \tif (cp)\n>  \t\t*cp = '\\0';\n>  \n> +\tdevice_lock(dev);\n> +\told = pdev->driver_override;\n>  \tif (strlen(driver_override)) {\n>  \t\tpdev->driver_override = driver_override;\n>  \t} else {\n>  \t\tkfree(driver_override);\n>  \t\tpdev->driver_override = NULL;\n>  \t}\n> +\tdevice_unlock(dev);\n>  \n>  \tkfree(old);\n>  \n> @@ -716,8 +719,12 @@ static ssize_t driver_override_show(struct device *dev,\n>  \t\t\t\t    struct device_attribute *attr, char *buf)\n>  {\n>  \tstruct pci_dev *pdev = to_pci_dev(dev);\n> +\tssize_t len;\n>  \n> -\treturn snprintf(buf, PAGE_SIZE, \"%s\\n\", pdev->driver_override);\n> +\tdevice_lock(dev);\n> +\tlen = snprintf(buf, PAGE_SIZE, \"%s\\n\", pdev->driver_override);\n> +\tdevice_unlock(dev);\n> +\treturn len;\n>  }\n>  static DEVICE_ATTR_RW(driver_override);\n>  \n> -- \n> 2.13.5\n>","headers":{"Return-Path":"<linux-pci-owner@vger.kernel.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=linux-pci-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)","mail.kernel.org;\n\tdmarc=none (p=none dis=none) header.from=kernel.org","mail.kernel.org;\n\tspf=none smtp.mailfrom=helgaas@kernel.org"],"Received":["from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3y1LKS5Z25z9t2Q\n\tfor <incoming@patchwork.ozlabs.org>;\n\tTue, 26 Sep 2017 09:44:44 +1000 (AEST)","(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S935992AbdIYXon (ORCPT <rfc822;incoming@patchwork.ozlabs.org>);\n\tMon, 25 Sep 2017 19:44:43 -0400","from mail.kernel.org ([198.145.29.99]:54964 \"EHLO mail.kernel.org\"\n\trhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP\n\tid S933685AbdIYXom (ORCPT <rfc822;linux-pci@vger.kernel.org>);\n\tMon, 25 Sep 2017 19:44:42 -0400","from localhost (unknown [69.71.4.159])\n\t(using TLSv1.2 with cipher DHE-RSA-AES128-SHA (128/128 bits))\n\t(No client certificate requested)\n\tby mail.kernel.org (Postfix) with ESMTPSA id 8E7862148C;\n\tMon, 25 Sep 2017 23:44:41 +0000 (UTC)"],"DMARC-Filter":"OpenDMARC Filter v1.3.2 mail.kernel.org 8E7862148C","Date":"Mon, 25 Sep 2017 18:44:39 -0500","From":"Bjorn Helgaas <helgaas@kernel.org>","To":"Nicolai Stange <nstange@suse.de>","Cc":"Bjorn Helgaas <bhelgaas@google.com>,\n\tGreg Kroah-Hartman <gregkh@linuxfoundation.org>,\n\tAdrian Salido <salidoa@google.com>, Sasha Levin <sasha.levin@oracle.com>,\n\tlinux-kernel@vger.kernel.org, linux-pci@vger.kernel.org","Subject":"Re: [PATCH 1/3] PCI: fix race condition with driver_override","Message-ID":"<20170925234439.GG15970@bhelgaas-glaptop.roam.corp.google.com>","References":"<20170911074542.16777-1-nstange@suse.de>\n\t<20170911074542.16777-2-nstange@suse.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=us-ascii","Content-Disposition":"inline","In-Reply-To":"<20170911074542.16777-2-nstange@suse.de>","User-Agent":"Mutt/1.5.21 (2010-09-15)","Sender":"linux-pci-owner@vger.kernel.org","Precedence":"bulk","List-ID":"<linux-pci.vger.kernel.org>","X-Mailing-List":"linux-pci@vger.kernel.org"}}]