From: Dimitri Daskalakis <[email protected]> We need a way to disambiguate the virtualization type of a PF/VF. PFs may support multiple types of virtualization, while a VF should only support one.
Tighten pci_is_sriov_physfn() / pci_is_sriov_virtfn() to ensure the is_sriov bit is set. This allows the existing is_physfn/is_virtfn bits to be agnostic of virtualization type. No functional changes for SR-IOV. Assisted-by: Claude:claude-opus-4.7 Signed-off-by: Dimitri Daskalakis <[email protected]> --- arch/s390/pci/pci_iov.c | 1 + drivers/pci/iov.c | 4 ++++ include/linux/pci.h | 5 +++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/s390/pci/pci_iov.c b/arch/s390/pci/pci_iov.c index 13050ce5c3e9..82e9ef1f132f 100644 --- a/arch/s390/pci/pci_iov.c +++ b/arch/s390/pci/pci_iov.c @@ -53,6 +53,7 @@ static int zpci_iov_link_virtfn(struct pci_dev *pdev, struct pci_dev *virtfn, in return rc; virtfn->is_virtfn = 1; + virtfn->is_sriov = 1; virtfn->multifunction = 0; virtfn->physfn = pci_dev_get(pdev); diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c index 5de26057b99a..4aed4f6a42c3 100644 --- a/drivers/pci/iov.c +++ b/drivers/pci/iov.c @@ -326,6 +326,7 @@ static struct pci_dev *pci_iov_scan_device(struct pci_dev *dev, int id, virtfn->vendor = dev->vendor; virtfn->device = iov->vf_device; virtfn->is_virtfn = 1; + virtfn->is_sriov = 1; virtfn->physfn = pci_dev_get(dev); virtfn->no_command_memory = 1; @@ -897,6 +898,7 @@ static int sriov_init(struct pci_dev *dev, int pos) iov->dev = dev; dev->sriov = iov; + dev->is_sriov = 1; dev->is_physfn = 1; rc = compute_max_vf_buses(dev); if (rc) @@ -906,6 +908,7 @@ static int sriov_init(struct pci_dev *dev, int pos) fail_max_buses: dev->sriov = NULL; + dev->is_sriov = 0; dev->is_physfn = 0; failed: for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { @@ -926,6 +929,7 @@ static void sriov_release(struct pci_dev *dev) kfree(dev->sriov); dev->sriov = NULL; + dev->is_sriov = 0; } static void sriov_restore_vf_rebar_state(struct pci_dev *dev) diff --git a/include/linux/pci.h b/include/linux/pci.h index 28892243f49f..ca84f66425b2 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -479,6 +479,7 @@ struct pci_dev { unsigned int state_saved:1; unsigned int is_physfn:1; unsigned int is_virtfn:1; + unsigned int is_sriov:1; /* SR-IOV is enabled on this device (PF or VF) */ unsigned int is_hotplug_bridge:1; unsigned int is_pciehp:1; unsigned int shpc_managed:1; /* SHPC owned by shpchp */ @@ -606,12 +607,12 @@ static inline struct pci_dev *pci_physfn(struct pci_dev *dev) static inline bool pci_is_sriov_physfn(const struct pci_dev *dev) { - return dev->is_physfn; + return dev->is_physfn && dev->is_sriov; } static inline bool pci_is_sriov_virtfn(const struct pci_dev *dev) { - return dev->is_virtfn; + return dev->is_virtfn && dev->is_sriov; } struct pci_dev *pci_alloc_dev(struct pci_bus *bus); -- 2.52.0
