MAINTAINERS | 6 + drivers/vfio/pci/vfio_pci_config.c | 98 +++++++++++ drivers/vfio/pci/vfio_pci_core.c | 2 + drivers/vfio/pci/vfio_pci_priv.h | 2 + include/uapi/linux/pci_regs.h | 5 + include/uapi/linux/vfio.h | 18 ++ tools/testing/selftests/vfio/Makefile | 1 + tools/testing/selftests/vfio/vfio_pci_dsn_test.c | 206 +++++++++++++++++++++++ 8 files changed, 338 insertions(+)
vfio-pci has no perm_bits entry for the PCIe Device Serial Number (DSN)
Extended Capability, so guest reads of the serial
number currently fall through to the physical device. The DSN is a
unique, persistent hardware serial number that identifies the physical
component (the functions of a Multi-Function Device report the same
value; Root Complex integrated Endpoints may implement it independently),
so exposing it lets a guest fingerprint the host hardware and correlate
it across VMs. For multi-tenant passthrough this is an unnecessary
host-identifier leak.
Series:
Patch 1 fully virtualizes the DSN capability (header + both serial
dwords) and scrubs the serial in the virtualized config space, so guests
read a zeroed serial while the capability stays visible.
Patch 2 adds a VFIO_DEVICE_FEATURE_PCI_DSN device feature so a trusted
userspace VMM can GET/SET the serial presented to the guest, for use
cases that need a stable but non-host-identifying serial (e.g. across
live migration between different physical devices).
Patch 3 adds a selftest: scrub-by-default, guest-write rejection,
PROBE/SET/GET, set-twice, persistence-across-reset, and bad-argsz.
Position on default-on (the main RFC question):
I propose scrubbing by default rather than opt-in. Rationale:
- A passed-through DSN is not meaningful to a guest today: the value
identifies the specific physical device, so any guest that keyed off
it would already break on migration or reassignment.
- vfio-pci already virtualizes/zeroes other identifying or host-specific
config state. The DSN is an outlier passed through unfiltered.
- Patch 2 provides an explicit escape hatch (VMM-set serial) for the
rare consumer that wants a stable identity.
If maintainers prefer opt-in, the scrub can be gated behind a module
param or a per-device feature flag.
Concurrency:
The guest config-space read path is unlocked and reads the DSN as two
independent 32-bit accesses, so the kernel cannot make a 64-bit guest
read atomic. Patch 2 uses WRITE_ONCE/READ_ONCE for per-dword
consistency and documents that a guest reading across a SET may see an
old/new mix, exactly as HW may tear a 64-bit read of a register pair.
Serializing concurrent SET callers is the VMM's responsibility.
Lifetime:
The presented serial lives only in vconfig: it persists across runtime
FLR/SBR and is cleared on device fd close (per-open).
SR-IOV:
Per the SR-IOV spec a PF's DSN applies to all its VFs, and a VF that
implements DSN must report the same value as its PF. vfio-pci exposes
only the assigned device's own config space and applies no VF-specific
transform to the DSN bytes, so a VF that implements DSN (whose value is
the PF's host serial) is scrubbed like a PF, and a VF that omits the
capability (the spec-recommended case) exposes no serial. The selftest
covers VFs when run against a VF BDF that exposes DSN.
Testing (under QEMU with full VFIO device assignment via IOMMUFD); in
every configuration all of the selftest's cases passed with none skipped
or failing:
- x86_64 (intel-iommu), e1000e PF with DSN: all cases passed.
- arm64 (smmuv3), e1000e PF with DSN: all cases passed.
- x86_64 SR-IOV: an igb PF was given 1 VF that implements a DSN cap in a
realistic extended-capability chain (AER -> ARI -> DSN); the VF was
bound to vfio-pci and the selftest run against it: all cases passed.
This exercises the spec case where a VF's DSN mirrors the PF host
serial.
- The SR-IOV run used a kernel built with KASAN + PROVE_LOCKING; no KASAN
reports, lockdep splats, or warnings were produced.
Signed-off-by: Pranjal Arya <pranjal.arya@oss.qualcomm.com>
---
Pranjal Arya (3):
vfio/pci: Virtualize and scrub Device Serial Number from guests
vfio/pci: Allow userspace to set a virtual Device Serial Number
selftests/vfio: Add PCIe Device Serial Number test
MAINTAINERS | 6 +
drivers/vfio/pci/vfio_pci_config.c | 98 +++++++++++
drivers/vfio/pci/vfio_pci_core.c | 2 +
drivers/vfio/pci/vfio_pci_priv.h | 2 +
include/uapi/linux/pci_regs.h | 5 +
include/uapi/linux/vfio.h | 18 ++
tools/testing/selftests/vfio/Makefile | 1 +
tools/testing/selftests/vfio/vfio_pci_dsn_test.c | 206 +++++++++++++++++++++++
8 files changed, 338 insertions(+)
---
base-commit: c425609d6ac4012c8bbf01ec2e10e801b1923a7b
change-id: 20260613-pcie_vfio-48506602ec6a
Best regards,
--
Pranjal Arya <pranjal.arya@oss.qualcomm.com>
On Sat, Jun 13, 2026 at 11:13:35PM +0530, Pranjal Arya wrote: Hi Pranjal, > vfio-pci has no perm_bits entry for the PCIe Device Serial Number (DSN) > Extended Capability, so guest reads of the serial > number currently fall through to the physical device. The DSN is a > unique, persistent hardware serial number that identifies the physical > component (the functions of a Multi-Function Device report the same > value; Root Complex integrated Endpoints may implement it independently), > so exposing it lets a guest fingerprint the host hardware and correlate > it across VMs. For multi-tenant passthrough this is an unnecessary > host-identifier leak. > + 1 to what Alex said here, QEMU / VMM should be able to trap and present the desired values here, we shouldn't need this in the vconfig. Thus, I believe this is better suited to QEMU (maybe this should be a patch to QEMU?) > > Signed-off-by: Pranjal Arya <pranjal.arya@oss.qualcomm.com> > --- > Pranjal Arya (3): > vfio/pci: Virtualize and scrub Device Serial Number from guests > vfio/pci: Allow userspace to set a virtual Device Serial Number > selftests/vfio: Add PCIe Device Serial Number test > > MAINTAINERS | 6 + > drivers/vfio/pci/vfio_pci_config.c | 98 +++++++++++ > drivers/vfio/pci/vfio_pci_core.c | 2 + > drivers/vfio/pci/vfio_pci_priv.h | 2 + > include/uapi/linux/pci_regs.h | 5 + > include/uapi/linux/vfio.h | 18 ++ > tools/testing/selftests/vfio/Makefile | 1 + > tools/testing/selftests/vfio/vfio_pci_dsn_test.c | 206 +++++++++++++++++++++++ > 8 files changed, 338 insertions(+) > --- > base-commit: c425609d6ac4012c8bbf01ec2e10e801b1923a7b > change-id: 20260613-pcie_vfio-48506602ec6a A few minor things, we don't use change-id upstream and no need to add a MAINTAINERS entry per test, we already have an entry to maintain tools/testing/selftests/vfio. Thanks, Praan
On Sat, Jun 13, 2026, at 11:43 AM, Pranjal Arya wrote: > vfio-pci has no perm_bits entry for the PCIe Device Serial Number (DSN) > Extended Capability, so guest reads of the serial > number currently fall through to the physical device. The DSN is a > unique, persistent hardware serial number that identifies the physical > component (the functions of a Multi-Function Device report the same > value; Root Complex integrated Endpoints may implement it independently), > so exposing it lets a guest fingerprint the host hardware and correlate > it across VMs. For multi-tenant passthrough this is an unnecessary > host-identifier leak. This sounds like a userspace problem, QEMU can virtualize the capability and manipulate it as it sees fit. Thanks, Alex
© 2016 - 2026 Red Hat, Inc.