Skip to content

Commit 3d56c86

Browse files
committed
Merge branch 'pci/virtualization'
- Add rescan/remove locking when enabling/disabling SR-IOV, which solves list corruption on s390, where disabling SR-IOV also generates hotplug events (Niklas Schnelle) - Add lockdep assertion in pci_stop_and_remove_bus_device() to catch device removal without appropriate locking (Niklas Schnelle) * pci/virtualization: PCI: Add lockdep assertion in pci_stop_and_remove_bus_device() PCI/IOV: Add PCI rescan-remove locking when enabling/disabling SR-IOV
2 parents fead6a0 + 60e7b5a commit 3d56c86

4 files changed

Lines changed: 9 additions & 1 deletion

File tree

drivers/pci/iov.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,15 +629,18 @@ static int sriov_add_vfs(struct pci_dev *dev, u16 num_vfs)
629629
if (dev->no_vf_scan)
630630
return 0;
631631

632+
pci_lock_rescan_remove();
632633
for (i = 0; i < num_vfs; i++) {
633634
rc = pci_iov_add_virtfn(dev, i);
634635
if (rc)
635636
goto failed;
636637
}
638+
pci_unlock_rescan_remove();
637639
return 0;
638640
failed:
639641
while (i--)
640642
pci_iov_remove_virtfn(dev, i);
643+
pci_unlock_rescan_remove();
641644

642645
return rc;
643646
}
@@ -762,8 +765,10 @@ static void sriov_del_vfs(struct pci_dev *dev)
762765
struct pci_sriov *iov = dev->sriov;
763766
int i;
764767

768+
pci_lock_rescan_remove();
765769
for (i = 0; i < iov->num_VFs; i++)
766770
pci_iov_remove_virtfn(dev, i);
771+
pci_unlock_rescan_remove();
767772
}
768773

769774
static void sriov_disable(struct pci_dev *dev)

drivers/pci/pci.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ struct pcie_tlp_log;
8989
extern const unsigned char pcie_link_speed[];
9090
extern bool pci_early_dump;
9191

92+
extern struct mutex pci_rescan_remove_lock;
93+
9294
bool pcie_cap_has_lnkctl(const struct pci_dev *dev);
9395
bool pcie_cap_has_lnkctl2(const struct pci_dev *dev);
9496
bool pcie_cap_has_rtctl(const struct pci_dev *dev);

drivers/pci/probe.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3507,7 +3507,7 @@ EXPORT_SYMBOL_GPL(pci_rescan_bus);
35073507
* pci_rescan_bus(), pci_rescan_bus_bridge_resize() and PCI device removal
35083508
* routines should always be executed under this mutex.
35093509
*/
3510-
static DEFINE_MUTEX(pci_rescan_remove_lock);
3510+
DEFINE_MUTEX(pci_rescan_remove_lock);
35113511

35123512
void pci_lock_rescan_remove(void)
35133513
{

drivers/pci/remove.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ static void pci_remove_bus_device(struct pci_dev *dev)
140140
*/
141141
void pci_stop_and_remove_bus_device(struct pci_dev *dev)
142142
{
143+
lockdep_assert_held(&pci_rescan_remove_lock);
143144
pci_stop_bus_device(dev);
144145
pci_remove_bus_device(dev);
145146
}

0 commit comments

Comments
 (0)