Commit 35ff867b authored by Pierre Crégut's avatar Pierre Crégut Committed by Bjorn Helgaas
Browse files

PCI/IOV: Serialize sysfs sriov_numvfs reads vs writes

When sriov_numvfs is being updated, we call the driver->sriov_configure()
function, which may enable VFs and call probe functions, which may make new
devices visible.  This all happens before before sriov_numvfs_store()
updates sriov->num_VFs, so previously, concurrent sysfs reads of
sriov_numvfs returned stale values.

Serialize the sysfs read vs the write so the read returns the correct
num_VFs value.

[bhelgaas: hold device_lock instead of checking mutex_is_locked()]
Link: https://bugzilla.kernel.org/show_bug.cgi?id=202991
Link: https://lore.kernel.org/r/20190911072736.32091-1-pierre.cregut@orange.com


Signed-off-by: default avatarPierre Crégut <pierre.cregut@orange.com>
Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
parent 56b4cd4b
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -254,8 +254,14 @@ static ssize_t sriov_numvfs_show(struct device *dev,
				 char *buf)
{
	struct pci_dev *pdev = to_pci_dev(dev);
	u16 num_vfs;

	/* Serialize vs sriov_numvfs_store() so readers see valid num_VFs */
	device_lock(&pdev->dev);
	num_vfs = pdev->sriov->num_VFs;
	device_unlock(&pdev->dev);

	return sprintf(buf, "%u\n", pdev->sriov->num_VFs);
	return sprintf(buf, "%u\n", num_vfs);
}

/*