Received: by 2002:a05:6a10:a0d1:0:0:0:0 with SMTP id j17csp227588pxa; Fri, 14 Aug 2020 02:26:11 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyzr5F7nj34rgYgw5mskOubWSwzGqfBbjtjBQVAnFt9HonbEuX17uFfV73+fBgMa2GxMUYd X-Received: by 2002:a17:906:d054:: with SMTP id bo20mr1610530ejb.9.1597397171441; Fri, 14 Aug 2020 02:26:11 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1597397171; cv=none; d=google.com; s=arc-20160816; b=hknV7ZnShiqJ9ncmDkm98hal+y9oHq0P++EB9GeUxdvNU6TYvEv+J7LWQ3ZcF0gLGR /6gGyQ4OibnZwHWPPLhs0vVwkidn0ZwrsK3JDmWBa7M5ntDEnh914dJG8Wp4dmqo9joo xqXW55A+oxTUdDJvNZ49v05kYRY81kUiL7MYn8jo1yibirHxggQ9x/7Qnw3mn/74loJg O2GpNPlyw62TMXROyrnuXi29PHPDuJ+z/Up2efBHCS5NHzblQguIOlLOcCsbJBJpzK5D MoD2xD7v9eKS40RB48MPUN0uyT+i/6GH9eDBx5oBaKCfhmubSZJrQ+wFdK5kR1YSUpHd RTeA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-transfer-encoding:content-disposition:mime-version :references:message-id:subject:to:from:date:dkim-signature; bh=sn0ksFSYB8JEKApdWaBfrQ3MRBLUFDGtieFPBVleVW0=; b=IUbZ1lW56NzRnRFvcnJAA00XoR3FfA2ImuY+uLjavaexzU65LYPzNB+oATbypU+Hu6 mLW6Sit5q27ljA07f5Yaes8O83DvjIjo/k/8Y283EPP/7/zZsqhVfRZKF7i9QAi8p5Nt FkUMw5zbmcBfVBcyHnrMv/V4uv/0QOeArI4VykXn8DnJ0W+uSgHg7kaoruONjiqED44W q3vUj1H/6cMTIQJ0it4OdoF9QWxcE/WhItIoTn3ZIY3NunkUr5VH+zcPAhMslNjE/8fd EfVVI5RS4vPPk1AmjD7SmjafSOWfiPgMQw68kjbdBX+6bJyt26I5koKgXQ2FtUQmc0CY gqeA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=KWrsGMWD; 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=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id a10si4905139ejf.666.2020.08.14.02.25.48; Fri, 14 Aug 2020 02:26:11 -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=@kernel.org header.s=default header.b=KWrsGMWD; 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=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726943AbgHNII2 (ORCPT + 99 others); Fri, 14 Aug 2020 04:08:28 -0400 Received: from mail.kernel.org ([198.145.29.99]:52376 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726124AbgHNII1 (ORCPT ); Fri, 14 Aug 2020 04:08:27 -0400 Received: from pali.im (pali.im [31.31.79.79]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 432412068E; Fri, 14 Aug 2020 08:08:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1597392506; bh=/LfkcEwmvc6XJiPP0cDp9JvhIhtwfzMlxBKzfvk7Bc4=; h=Date:From:To:Subject:References:In-Reply-To:From; b=KWrsGMWDdvdqnJDi46ZFlqdVaP+kdiwEbPnWj1hr9tfUjT6Y87vwZAq1c+a/fUIH8 MVvrA10PXtObKYyVLh4ROJkSzea/eFmdGX0NEK/ffyP7Dhe+szp5dyzwZcLFqrMUcT /zJRksXAz4vgBtc0jFq8loeo5Rb5NhEpRf0B0bX8= Received: by pali.im (Postfix) id 7F25ABD5; Fri, 14 Aug 2020 10:08:24 +0200 (CEST) Date: Fri, 14 Aug 2020 10:08:24 +0200 From: Pali =?utf-8?B?Um9ow6Fy?= To: Bjorn Helgaas , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: PCI: Race condition in pci_create_sysfs_dev_files Message-ID: <20200814080824.dg57kmbimyf3ushe@pali> References: <20200716110423.xtfyb3n6tn5ixedh@pali> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20200716110423.xtfyb3n6tn5ixedh@pali> User-Agent: NeoMutt/20180716 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello! I would like to remind this issue which I reported month ago. On Thursday 16 July 2020 13:04:23 Pali Rohár wrote: > Hello Bjorn! > > I see following error message in dmesg which looks like a race condition: > > sysfs: cannot create duplicate filename '/devices/platform/soc/d0070000.pcie/pci0000:00/0000:00:00.0/config' > > I looked at it deeper and found out that in PCI subsystem code is race > condition between pci_bus_add_device() and pci_sysfs_init() calls. Both > of these functions calls pci_create_sysfs_dev_files() and calling this > function more times for same pci device throws above error message. > > There can be two different race conditions: > > 1. pci_bus_add_device() called pcibios_bus_add_device() or > pci_fixup_device() but have not called pci_create_sysfs_dev_files() yet. > Meanwhile pci_sysfs_init() is running and pci_create_sysfs_dev_files() > was called for newly registered device. In this case function > pci_create_sysfs_dev_files() is called two times, ones from > pci_bus_add_device() and once from pci_sysfs_init(). > > 2. pci_sysfs_init() is called. It first sets sysfs_initialized to 1 > which unblock calling pci_create_sysfs_dev_files(). Then another bus > registers new PCI device and calls pci_bus_add_device() which calls > pci_create_sysfs_dev_files() and registers sysfs files. Function > pci_sysfs_init() continues execution and calls function > pci_create_sysfs_dev_files() also for this newly registered device. So > pci_create_sysfs_dev_files() is again called two times. > > > I workaround both race conditions I created following hack patch. After > applying it I'm not getting that 'sysfs: cannot create duplicate filename' > error message anymore. > > Can you look at it how to fix both race conditions in proper way? Is this workaround diff enough? Or are you going to prepare something better? Please let me know if I should send this diff as regular patch. > > diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c > index 8e40b3e6da77..691be2258c4e 100644 > --- a/drivers/pci/bus.c > +++ b/drivers/pci/bus.c > @@ -316,7 +316,7 @@ void pci_bus_add_device(struct pci_dev *dev) > */ > pcibios_bus_add_device(dev); > pci_fixup_device(pci_fixup_final, dev); > - pci_create_sysfs_dev_files(dev); > + pci_create_sysfs_dev_files(dev, false); > pci_proc_attach_device(dev); > pci_bridge_d3_update(dev); > > diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c > index 6d78df981d41..b0c4852a51dd 100644 > --- a/drivers/pci/pci-sysfs.c > +++ b/drivers/pci/pci-sysfs.c > @@ -1328,13 +1328,13 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev) > return retval; > } > > -int __must_check pci_create_sysfs_dev_files(struct pci_dev *pdev) > +int __must_check pci_create_sysfs_dev_files(struct pci_dev *pdev, bool sysfs_initializing) > { > int retval; > int rom_size; > struct bin_attribute *attr; > > - if (!sysfs_initialized) > + if (!sysfs_initializing && !sysfs_initialized) > return -EACCES; > > if (pdev->cfg_size > PCI_CFG_SPACE_SIZE) > @@ -1437,18 +1437,21 @@ void pci_remove_sysfs_dev_files(struct pci_dev *pdev) > static int __init pci_sysfs_init(void) > { > struct pci_dev *pdev = NULL; > - int retval; > + int retval = 0; > > - sysfs_initialized = 1; > for_each_pci_dev(pdev) { > - retval = pci_create_sysfs_dev_files(pdev); > + if (!pci_dev_is_added(pdev)) > + continue; > + retval = pci_create_sysfs_dev_files(pdev, true); > if (retval) { > pci_dev_put(pdev); > - return retval; > + goto out; > } > } > > - return 0; > +out: > + sysfs_initialized = 1; > + return retval; > } > late_initcall(pci_sysfs_init); > > diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h > index 6d3f75867106..304294c7171e 100644 > --- a/drivers/pci/pci.h > +++ b/drivers/pci/pci.h > @@ -19,7 +19,7 @@ bool pcie_cap_has_rtctl(const struct pci_dev *dev); > > /* Functions internal to the PCI core code */ > > -int pci_create_sysfs_dev_files(struct pci_dev *pdev); > +int pci_create_sysfs_dev_files(struct pci_dev *pdev, bool sysfs_initializing); > void pci_remove_sysfs_dev_files(struct pci_dev *pdev); > #if !defined(CONFIG_DMI) && !defined(CONFIG_ACPI) > static inline void pci_create_firmware_label_files(struct pci_dev *pdev) >