[PATCH v1] PCI: Release SR-IOV device reference on init failure

Yuho Choi <[email protected]>
Newsgroups org.kernel.vger.linux-pci,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
sriov_init() takes a reference on the sibling physical function stored in
pci_sriov->dev before computing the maximum VF bus usage. If
compute_max_vf_buses() fails, the failure path clears the SR-IOV state and
frees pci_sriov without releasing that reference. Since is_physfn is
cleared, pci_iov_release() cannot clean it up later.

Release the reference on the failure path when pci_sriov->dev is different
from the device being initialized, matching the cleanup in sriov_release().

Fixes: ea9a8854161d ("PCI: Set SR-IOV NumVFs to zero after enumeration")
Signed-off-by: Yuho Choi <[email protected]>
---
 drivers/pci/iov.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index b0d24839c084..65c60f88a3d4 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -907,6 +907,8 @@ static int sriov_init(struct pci_dev *dev, int pos)
 fail_max_buses:
 	dev->sriov = NULL;
 	dev->is_physfn = 0;
+	if (iov->dev != dev)
+		pci_dev_put(iov->dev);
 failed:
 	for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
 		res = &dev->resource[pci_resource_num_from_vf_bar(i)];
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.