[PATCH 0/2] PCI: Convert bitfield flags to atomic accessors

Maurice Hieronymus posted 2 patches 1 week, 5 days ago
Failed in applying to current master (apply log)
There is a newer version of this series
drivers/edac/edac_pci_sysfs.c               |  4 +--
drivers/net/ethernet/sfc/falcon/farch.c     |  2 +-
drivers/net/ethernet/sfc/siena/farch.c      |  2 +-
drivers/pci/pci-driver.c                    |  2 +-
drivers/pci/pci-sysfs.c                     |  4 +--
drivers/pci/pci.c                           |  6 ++---
drivers/scsi/lpfc/lpfc_init.c               |  4 +--
drivers/xen/xen-pciback/conf_space_header.c |  4 +--
drivers/xen/xen-pciback/pciback_ops.c       |  4 +--
include/linux/pci.h                         | 42 +++++++++++++++++++++++++++--
10 files changed, 56 insertions(+), 18 deletions(-)
[PATCH 0/2] PCI: Convert bitfield flags to atomic accessors
Posted by Maurice Hieronymus 1 week, 5 days ago
`struct pci_dev` keeps ~60 flags in one C bitfield. Bits sharing a
word must not be modified concurrently, but several writers take no
common lock: `pci_set_master()` writes `is_busmaster` and can run
without the device lock (e.g. runtime PM resume paths),
`pci_disable_device()` clears it, and `broken_parity_status_store()`
writes the same word from sysfs at any time without any lock.

Convert these two bits to a new public `flags` bitmap accessed with
atomic bitops, mirroring how the driver core replaced its
`offline`/`offline_disabled` bitfield in commit a7cc262a1135 ("driver
core: Replace dev->offline + ->offline_disabled with accessors").
More bits can follow the same pattern later.

An alternative would be to reuse `priv_flags`, but its bit definitions
and accessors are deliberately private to drivers/pci, while
`is_busmaster` is accessed by xen-pciback, lpfc and sfc. Happy to
respin that way if preferred.

This is also a prerequisite for the Rust device enabling API rework
[1]: the guard object planned there calls `pci_disable_device()` from
contexts that may run concurrently with `pci_set_master()`, which
requires `is_busmaster` to not be part of a shared bitfield word.

Link: https://lore.kernel.org/rust-for-linux/DJOEYVBS17MJ.1YD3TNGQBWHNK@kernel.org/ [1]
Signed-off-by: Maurice Hieronymus <mhi@mailbox.org>
---
Maurice Hieronymus (2):
      PCI: Replace pci_dev->is_busmaster with accessors
      PCI: Replace pci_dev->broken_parity_status with accessors

 drivers/edac/edac_pci_sysfs.c               |  4 +--
 drivers/net/ethernet/sfc/falcon/farch.c     |  2 +-
 drivers/net/ethernet/sfc/siena/farch.c      |  2 +-
 drivers/pci/pci-driver.c                    |  2 +-
 drivers/pci/pci-sysfs.c                     |  4 +--
 drivers/pci/pci.c                           |  6 ++---
 drivers/scsi/lpfc/lpfc_init.c               |  4 +--
 drivers/xen/xen-pciback/conf_space_header.c |  4 +--
 drivers/xen/xen-pciback/pciback_ops.c       |  4 +--
 include/linux/pci.h                         | 42 +++++++++++++++++++++++++++--
 10 files changed, 56 insertions(+), 18 deletions(-)
---
base-commit: dc59e4fea9d83f03bad6bddf3fa2e52491777482
change-id: 20260711-pci-dev-flags-fbbcf4ff9031

Best regards,
-- 
Maurice Hieronymus <mhi@mailbox.org>