{"id":2224052,"url":"http://patchwork.ozlabs.org/api/covers/2224052/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-pci/cover/20260416180107.777065-1-kwilczynski@kernel.org/","project":{"id":28,"url":"http://patchwork.ozlabs.org/api/projects/28/?format=json","name":"Linux PCI development","link_name":"linux-pci","list_id":"linux-pci.vger.kernel.org","list_email":"linux-pci@vger.kernel.org","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260416180107.777065-1-kwilczynski@kernel.org>","list_archive_url":null,"date":"2026-04-16T18:00:44","name":"[v5,00/23] PCI: Convert all dynamic sysfs attributes to static","submitter":{"id":86709,"url":"http://patchwork.ozlabs.org/api/people/86709/?format=json","name":"Krzysztof Wilczyński","email":"kwilczynski@kernel.org"},"mbox":"http://patchwork.ozlabs.org/project/linux-pci/cover/20260416180107.777065-1-kwilczynski@kernel.org/mbox/","series":[{"id":500193,"url":"http://patchwork.ozlabs.org/api/series/500193/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-pci/list/?series=500193","date":"2026-04-16T18:00:44","name":"PCI: Convert all dynamic sysfs attributes to static","version":5,"mbox":"http://patchwork.ozlabs.org/series/500193/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/covers/2224052/comments/","headers":{"Return-Path":"\n <linux-pci+bounces-52624-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-pci@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=IN0G++eL;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c04:e001:36c::12fc:5321; helo=tor.lore.kernel.org;\n envelope-from=linux-pci+bounces-52624-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"IN0G++eL\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from tor.lore.kernel.org (tor.lore.kernel.org\n [IPv6:2600:3c04:e001:36c::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fxQms1KCRz1yD3\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 17 Apr 2026 04:01:17 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id ACAC930082AD\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 16 Apr 2026 18:01:13 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id BB13533262A;\n\tThu, 16 Apr 2026 18:01:12 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 8DF78331A4C;\n\tThu, 16 Apr 2026 18:01:12 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPSA id CB3DBC2BCAF;\n\tThu, 16 Apr 2026 18:01:08 +0000 (UTC)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1776362472; cv=none;\n b=RYo648TNdh896cpQ5yzG6+Vb/q7hvXRWtq60nn4FsyuRjXs/eSf1ET4oIWLdnkxhhvtoj7zgV3fwE6e9rXDh/ZLQR1tLAfLOgsc3m6q41gJddmMbLn2n6tf8qQTIIzZb/OgibqFCcyOdplIoaJQ/HmDhbWDHrB/zV8eVVix7iBo=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1776362472; c=relaxed/simple;\n\tbh=0gwbU28QnN9fAESh13GoaD14hEGTKIIjtJA8T2NO+Uw=;\n\th=From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type;\n b=OoUzx23SWvpm95USa6e+IaeFJswryzWNjV6gYLFHHpNg67lHhWzwnWYdwfAyAPm0zQiNttM3vFsqi3XdifXZVtjbhx1UFvssNjDOS/873d2Cl/gnhPCTlWJIKLQgq0NujzjybQCGcqqjGDYvte4TDmL0Qb/y1XusvUXhWsPeV5A=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=IN0G++eL; arc=none smtp.client-ip=10.30.226.201","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1776362472;\n\tbh=0gwbU28QnN9fAESh13GoaD14hEGTKIIjtJA8T2NO+Uw=;\n\th=From:To:Cc:Subject:Date:From;\n\tb=IN0G++eLHaqph6Kdkoprfm9BaOBsVO4IXrABjvmTLcu7EshpBE/81pDBZ1HDt2jD5\n\t kjGtnIIxLMB5mTbkeGBWsq2AxR+WXfNF97N1MBLknGCxunaV5Y18N3Gbdk8Xty737n\n\t xjQupnIl2esXrUf5abrzQl+0xMrE/YARvWE7UNG2eR+/W9tH1zylHYN1E9tMUmbT0/\n\t D9ytm5XHFENFMuvyhtSvWb573/suSQlOMRCvxGUjRqVloXBnuvB8OZEdOkkJokFeD6\n\t LO9L044tbnp9YkY899nxjM/p551NJ2GYPYkPB181hDqk6MmZpwILoMUqy78rciGYuj\n\t /fzjVlIdWjxag==","From":"=?utf-8?q?Krzysztof_Wilczy=C5=84ski?= <kwilczynski@kernel.org>","To":"Bjorn Helgaas <bhelgaas@google.com>","Cc":"Bjorn Helgaas <helgaas@kernel.org>,\n Manivannan Sadhasivam <mani@kernel.org>,\n Lorenzo Pieralisi <lpieralisi@kernel.org>,\n Magnus Lindholm <linmag7@gmail.com>, Matt Turner <mattst88@gmail.com>,\n Richard Henderson <richard.henderson@linaro.org>,\n Christophe Leroy <chleroy@kernel.org>,\n Madhavan Srinivasan <maddy@linux.ibm.com>,\n Michael Ellerman <mpe@ellerman.id.au>, Nicholas Piggin <npiggin@gmail.com>,\n Dexuan Cui <decui@microsoft.com>,\n =?utf-8?q?Krzysztof_Ha=C5=82asa?= <khalasa@piap.pl>,\n Lukas Wunner <lukas@wunner.de>, \"Oliver O'Halloran\" <oohall@gmail.com>,\n Saurabh Singh Sengar <ssengar@microsoft.com>,\n Shuan He <heshuan@bytedance.com>, Srivatsa Bhat <srivatsabhat@microsoft.com>,\n\t=?utf-8?q?Ilpo_J=C3=A4rvinen?= <ilpo.jarvinen@linux.intel.com>,\n linux-pci@vger.kernel.org, linux-alpha@vger.kernel.org,\n linuxppc-dev@lists.ozlabs.org","Subject":"[PATCH v5 00/23] PCI: Convert all dynamic sysfs attributes to static","Date":"Thu, 16 Apr 2026 18:00:44 +0000","Message-ID":"<20260416180107.777065-1-kwilczynski@kernel.org>","X-Mailer":"git-send-email 2.53.0","Precedence":"bulk","X-Mailing-List":"linux-pci@vger.kernel.org","List-Id":"<linux-pci.vger.kernel.org>","List-Subscribe":"<mailto:linux-pci+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-pci+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=UTF-8","Content-Transfer-Encoding":"8bit"},"content":"Hello,\n\nThis series converts every dynamically allocated PCI sysfs attribute to\na static const definition.  After the full series, pci_sysfs_init() and\nsysfs_initialized are gone, and every sysfs file is created by the\ndriver model at device_add() time.\n\nCurrently, the PCI resource files (resourceN, resourceN_wc) and the\nlegacy bus files (legacy_io, legacy_mem) are created dynamically\nfrom two unsynchronised paths:\n\nPath A: late_initcall\n\n  pci_sysfs_init                        (late_initcall)\n    sysfs_initialized = 1\n    for_each_pci_dev\n      pci_create_sysfs_dev_files\n        sysfs_create_bin_file           (resourceN, resourceN_wc)\n    pci_find_next_bus\n      pci_create_legacy_files\n        sysfs_create_bin_file           (legacy_io, legacy_mem)\n\nPath B: device registration / hotplug\n\n  pci_bus_add_devices\n    pci_bus_add_device\n      pci_create_sysfs_dev_files\n        if (!sysfs_initialized) return  <- only guard\n        sysfs_create_bin_file           (resourceN, resourceN_wc)\n\nOn most ACPI systems this does not race because PCI enumeration\ncompletes at subsys_initcall time, before pci_sysfs_init() runs:\n\n  subsys_initcall (level 4):\n    acpi_pci_root_add\n      pci_bus_add_device\n        pci_create_sysfs_dev_files\n          if (!sysfs_initialized)          <- not yet set\n            return -EACCES\n\n  late_initcall (level 7):\n    pci_sysfs_init\n      sysfs_initialized = 1\n      for_each_pci_dev\n        pci_create_sysfs_dev_files         <- creates the files, no race\n\nOn Devicetree platforms the host controller is a platform driver that\nprobes via the driver model, often on a workqueue, and overlaps with the\nlate_initcall:\n\n  CPU 0 (late_initcall)                CPU 1 (driver probe)\n  ---------------------------          ----------------------------\n  pci_sysfs_init()\n    sysfs_initialized = 1\n    for_each_pci_dev(pdev)             pci_bus_add_device(pdev)\n      pci_create_sysfs_dev_files()       pci_create_sysfs_dev_files()\n        sysfs_create_bin_file()            sysfs_create_bin_file()\n                                             -> \"duplicate filename\"\n\nThe same happens on ACPI when probing is asynchronous (hv_pci on\nAzure, RISC-V with ACPI).\n\nThe duplicate causes sysfs_create_bin_file() to fail with -EEXIST.\npci_create_resource_files() then calls pci_remove_resource_files() in\nits error unwind, tearing down files the other thread created and\nstill references through pdev->res_attr[].  This has caused kernel\npanics on i.MX6 and boot failures on other platforms.\n\nSeveral different fixes have been proposed over the years: reordering\nthe sysfs_initialized assignment, adding locks, checking\npci_dev_is_added(), setting pdev->res_attr[] to NULL after kfree\n(which only prevents a double-free on the teardown path, not the\nerror unwind removing the other thread's files).  None would address the\nroot cause.\n\nThis has been reported a few times:\n\n  - https://lore.kernel.org/linux-pci/20250702155112.40124-1-heshuan@bytedance.com/\n  - https://lore.kernel.org/linux-pci/b51519d6-ce45-4b6d-8135-c70169bd110e@h-partners.com/\n  - https://lore.kernel.org/linux-pci/1702093576-30405-1-git-send-email-ssengar@linux.microsoft.com/\n  - https://lore.kernel.org/linux-pci/SY0P300MB04687548090B73E40AF97D8897B82@SY0P300MB0468.AUSP300.PROD.OUTLOOK.COM/\n  - https://lore.kernel.org/linux-pci/20230105174736.GA1154719@bhelgaas/\n  - https://lore.kernel.org/linux-pci/m3eebg9puj.fsf@t19.piap.pl/\n  - https://lore.kernel.org/linux-pci/20200716110423.xtfyb3n6tn5ixedh@pali/\n  - https://lore.kernel.org/linux-pci/1366196798-15929-1-git-send-email-artem.savkov@gmail.com/\n  - https://bugzilla.kernel.org/show_bug.cgi?id=215515\n  - https://bugzilla.kernel.org/show_bug.cgi?id=216888\n\nWith static attributes the driver model creates sysfs entries once per\ndevice at device_add() time, under the device lock, eliminating the\nlate_initcall iteration and the race along with it.\n\n\tKrzysztof\n\n---\nChanges in v5:\n  https://lore.kernel.org/linux-pci/20260411080148.471335-1-kwilczynski@kernel.org/\n  \n   - Added new Tested-by, Reviewed-by, and Acked-by tags.\n   - Used the existing _io function names in the static macro\n     definitions, deferring the rename to the conversion commit\n     where it belongs, to avoid a forward reference across\n     commits. This was reported by Sashiko, see:\n     https://sashiko.dev/#/patchset/20260411080148.471335-1-kwilczynski%40kernel.org?part=6\n   - Folded the __resource_resize_store() conversion into the\n     main static attributes commit so the resize path is never\n     broken between commits. This was reported by Sashiko, see:\n     https://sashiko.dev/#/patchset/20260410055040.39233-1-kwilczynski%40kernel.org?part=6\n     https://sashiko.dev/#/patchset/20260411080148.471335-1-kwilczynski%40kernel.org?part=7\n   - Dropped the unnecessary parentheses cleanup from the Alpha\n     BAR index commit, as the line is replaced two commits later\n     anyway, as per Ilpo Järvinen's feedback.\n   - Squashed the Alpha accessor macro and cleanup commits into\n     one, using pci_resource_is_mem() directly instead of the\n     intermediate pci_resource_flags() step, as per Ilpo\n     Järvinen's feedback.\n   - Moved the raw literal conversion in pci_create_legacy_files()\n     into the macro definition commit, so the macros and their\n     usage are introduced together, as per Ilpo Järvinen's\n     feedback.\n   - Removed unnecessary backslash line continuation from the\n     ternary in pci_mmap_legacy_page_range().\n   - Kept pci_resource_len() for visibility checks instead of\n     resource_assigned().  The static is_visible() callback\n     runs at device_add() time during the PCI enumeration,\n     before the pci_assign_unassigned_bus_resources() populates\n     res->parent, as such, resource_assigned() returned false\n     for every BAR, hiding all resource files.  This is related\n     to review feedback from Ilpo Järvinen.\n\nChanges in v4:\n  https://lore.kernel.org/linux-pci/20260410055040.39233-1-kwilczynski@kernel.org/\n\n   - Added new Reviewed-by tags.\n   - Added pci_resource_is_io() and pci_resource_is_mem() helpers\n     for resource type checks, replacing the open-coded bitwise\n     flag tests in pci_mmap_resource(), pci_resource_io(), and\n     Alpha's pci_mmap_resource(), as per Ilpo Järvinen's\n     suggestion.\n   - Split the __pci_mmap_fits() cleanup into two patches.  An\n     overflow fix for zero-length BARs, which now includes a\n     Fixes: tag referencing the original Alpha PCI sysfs commit,\n     and the WARN macro removal is a separate cleanup as per Ilpo\n     Järvinen's suggestion.\n   - Added a missing Fixes: tag to the Alpha lockdown check,\n     referencing the commit that added the check to the generic\n     path but missed Alpha's implementation.\n   - Added PCI_LEGACY_IO_SIZE and PCI_LEGACY_MEM_SIZE macros to\n     replace the raw literals used for legacy address space sizes.\n     These are used in both Alpha's pci_mmap_legacy_page_range()\n     and the static legacy attribute definitions, as per Ilpo\n     Järvinen's suggestion.\n   - Replaced sysfs_update_groups() in the BAR resize path with\n     sysfs_remove_groups() before the resize and sysfs_create_groups()\n     after, restoring the original teardown before BAR resize\n     ordering.  This was reported by Sashiko, see:\n     https://sashiko.dev/#/patchset/20260410055040.39233-1-kwilczynski%40kernel.org?part=7\n   - Defined pci_dev_resource_attr_groups as a NULL macro when\n     HAVE_PCI_MMAP and ARCH_GENERIC_PCI_MMAP_RESOURCE are both\n     absent, so the resize path compiles unconditionally without\n     #ifdef guards in the function body.  This was reported by\n     Sashiko, see:\n     https://sashiko.dev/#/patchset/20260410055040.39233-1-kwilczynski%40kernel.org?part=7\n   - Moved the pci_legacy_has_sparse() prototype into the patch\n     that introduces the function, alongside the existing\n     pci_adjust_legacy_attr() declaration, to fix a bisection\n     issue where Alpha would warn on -Wmissing-prototypes.\n     This was reported by Sashiko, see:\n     https://sashiko.dev/#/patchset/20260410055040.39233-1-kwilczynski%40kernel.org?part=18\n\nChanges in v3:\n  https://lore.kernel.org/linux-pci/20210910202623.2293708-1-kw@linux.com/\n\n  - Updated for modern kernel releases and expanded scope.  The\n    v2 only covered the generic resource files.  This version\n    also converts Alpha's sparse/dense resource files and the\n    legacy bus attributes, removing pci_sysfs_init() entirely.\n  - Split the single macro definition into three distinct ones\n    (per I/O, UC, and WC), to make sure that each carries only\n    the callbacks its resource type needs.\n  - Updated to use the new .bin_size callback, as the attributes\n    are const, to replace using a->size directly, which was not\n    ideal.  This required changes to pci_llseek_resource(), to\n    ensure that it would work for device and bus-level attributes.\n  - Updated the __resource_resize_store() to include CAP_SYS_ADMIN\n    capabilities check.\n  - Added the security_locked_down() check to Alpha's\n    pci_mmap_resource(), to align with other architectures.\n\nChanges in v2:\n  https://lore.kernel.org/linux-pci/20210825212255.878043-1-kw@linux.com/\n\n  - Refactored code so that the macros, helpers and internal\n    functions can be used to correctly leverage the read(),\n    write() and mmap() callbacks rather than to use the\n    .is_bin_visible() callback to set up sysfs objects\n    internals as this is not supported.\n  - Refactored some if-statements to check for a resource\n    flag first, and then call either arch_can_pci_mmap_io()\n    or arch_can_pci_mmap_wc(), plus store result of testing\n    for IORESOURCE_MEM and IORESOURCE_PREFETCH flags into\n    a boolean variable, as per Bjorn Helgaas' suggestion.\n  - Renamed pci_read_resource_io() and pci_write_resource_io()\n    callbacks so that these are not specifically tied to I/O\n    BARs read() and write() operations also as per Bjorn\n    Helgaas' suggestion.\n  - Updated style for code handling bitwise operations to\n    match the style that is preferred as per Bjorn Helgaas'\n    suggestion.\n  - Updated commit messages adding more details about the\n    implementation as requested by Bjorn Helgaas.\n\nKrzysztof Wilczyński (23):\n  PCI/sysfs: Use PCI resource accessor macros\n  PCI: Add pci_resource_is_io() and pci_resource_is_mem() helpers\n  PCI/sysfs: Only allow supported resource types in I/O and MMIO helpers\n  PCI/sysfs: Use BAR length in pci_llseek_resource() when attr->size is\n    zero\n  PCI/sysfs: Add CAP_SYS_ADMIN check to __resource_resize_store()\n  PCI/sysfs: Add static PCI resource attribute macros\n  PCI/sysfs: Convert PCI resource files to static attributes\n  PCI/sysfs: Warn about BAR resize failure in __resource_resize_store()\n  PCI/sysfs: Add stubs for pci_{create,remove}_sysfs_dev_files()\n  PCI/sysfs: Limit pci_sysfs_init() late_initcall compile scope\n  alpha/PCI: Add security_locked_down() check to pci_mmap_resource()\n  alpha/PCI: Use BAR index in sysfs attr->private instead of resource\n    pointer\n  alpha/PCI: Use PCI resource accessor macros\n  alpha/PCI: Fix __pci_mmap_fits() overflow for zero-length BARs\n  alpha/PCI: Remove WARN from __pci_mmap_fits()\n  alpha/PCI: Add static PCI resource attribute macros\n  alpha/PCI: Convert resource files to static attributes\n  PCI/sysfs: Remove pci_{create,remove}_sysfs_dev_files()\n  PCI: Add macros for legacy I/O and memory address space sizes\n  alpha/PCI: Compute legacy size in pci_mmap_legacy_page_range()\n  PCI/sysfs: Add __weak pci_legacy_has_sparse() helper\n  PCI/sysfs: Convert legacy I/O and memory attributes to static\n    definitions\n  PCI/sysfs: Remove pci_create_legacy_files() and pci_sysfs_init()\n\n arch/alpha/include/asm/pci.h   |  13 +-\n arch/alpha/kernel/pci-sysfs.c  | 373 +++++++++++----------\n arch/powerpc/include/asm/pci.h |   2 -\n drivers/pci/bus.c              |   1 -\n drivers/pci/pci-sysfs.c        | 575 +++++++++++++++++++--------------\n drivers/pci/pci.h              |  16 +-\n drivers/pci/probe.c            |   6 -\n drivers/pci/remove.c           |   3 -\n include/linux/pci.h            |  39 ++-\n 9 files changed, 578 insertions(+), 450 deletions(-)"}