Skip to content

Commit

Permalink
PCI: Don't allow unbinding host controllers that aren't prepared
Browse files Browse the repository at this point in the history
Many PCI host controller drivers aren't prepared to have their devices
unbound from them forcefully (e.g., through /sys/.../<driver>/unbind), as
they don't provide any driver .remove callback, where they'd detach the
root bus, release resources, etc. Keeping the driver built in (i.e., not a
loadable module) is not enough; and providing no .remove callback just
means we don't do any teardown.

To rule out the possibility of unbinding a device via sysfs, we need to set
the ".suppress_bind_attrs" field.

I found the suspect drivers via the following search:

  git grep -l platform_driver $(git grep -L -e '\.remove' -e suppress_bind_attrs drivers/pci/)

Then I inspected them to ensure that
(a) they set up a PCI bus in their probe() and
(b) they don't have a remove() callback for undoing the setup

Suggested-by: Bjorn Helgaas <[email protected]>
Signed-off-by: Brian Norris <[email protected]>
Signed-off-by: Bjorn Helgaas <[email protected]>
  • Loading branch information
computersforpeace authored and bjorn-helgaas committed Apr 28, 2017
1 parent ef1b5da commit a5f40e8
Show file tree
Hide file tree
Showing 13 changed files with 14 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/pci/dwc/pci-imx6.c
Original file line number Diff line number Diff line change
Expand Up @@ -804,6 +804,7 @@ static struct platform_driver imx6_pcie_driver = {
.driver = {
.name = "imx6q-pcie",
.of_match_table = imx6_pcie_of_match,
.suppress_bind_attrs = true,
},
.probe = imx6_pcie_probe,
.shutdown = imx6_pcie_shutdown,
Expand Down
1 change: 1 addition & 0 deletions drivers/pci/dwc/pci-layerscape.c
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ static struct platform_driver ls_pcie_driver = {
.driver = {
.name = "layerscape-pcie",
.of_match_table = ls_pcie_of_match,
.suppress_bind_attrs = true,
},
};
builtin_platform_driver_probe(ls_pcie_driver, ls_pcie_probe);
1 change: 1 addition & 0 deletions drivers/pci/dwc/pcie-armada8k.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ static struct platform_driver armada8k_pcie_driver = {
.driver = {
.name = "armada8k-pcie",
.of_match_table = of_match_ptr(armada8k_pcie_of_match),
.suppress_bind_attrs = true,
},
};
builtin_platform_driver(armada8k_pcie_driver);
1 change: 1 addition & 0 deletions drivers/pci/dwc/pcie-artpec6.c
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ static struct platform_driver artpec6_pcie_driver = {
.driver = {
.name = "artpec6-pcie",
.of_match_table = artpec6_pcie_of_match,
.suppress_bind_attrs = true,
},
};
builtin_platform_driver(artpec6_pcie_driver);
1 change: 1 addition & 0 deletions drivers/pci/dwc/pcie-designware-plat.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ static struct platform_driver dw_plat_pcie_driver = {
.driver = {
.name = "dw-pcie",
.of_match_table = dw_plat_pcie_of_match,
.suppress_bind_attrs = true,
},
.probe = dw_plat_pcie_probe,
};
Expand Down
2 changes: 2 additions & 0 deletions drivers/pci/dwc/pcie-hisi.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,7 @@ static struct platform_driver hisi_pcie_driver = {
.driver = {
.name = "hisi-pcie",
.of_match_table = hisi_pcie_of_match,
.suppress_bind_attrs = true,
},
};
builtin_platform_driver(hisi_pcie_driver);
Expand Down Expand Up @@ -390,6 +391,7 @@ static struct platform_driver hisi_pcie_almost_ecam_driver = {
.driver = {
.name = "hisi-pcie-almost-ecam",
.of_match_table = hisi_pcie_almost_ecam_of_match,
.suppress_bind_attrs = true,
},
};
builtin_platform_driver(hisi_pcie_almost_ecam_driver);
Expand Down
1 change: 1 addition & 0 deletions drivers/pci/dwc/pcie-spear13xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,7 @@ static struct platform_driver spear13xx_pcie_driver = {
.driver = {
.name = "spear-pcie",
.of_match_table = of_match_ptr(spear13xx_pcie_of_match),
.suppress_bind_attrs = true,
},
};

Expand Down
1 change: 1 addition & 0 deletions drivers/pci/host/pci-ftpci100.c
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,7 @@ static struct platform_driver faraday_pci_driver = {
.driver = {
.name = "ftpci100",
.of_match_table = of_match_ptr(faraday_pci_of_match),
.suppress_bind_attrs = true,
},
.probe = faraday_pci_probe,
};
Expand Down
1 change: 1 addition & 0 deletions drivers/pci/host/pci-host-generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ static struct platform_driver gen_pci_driver = {
.driver = {
.name = "pci-host-generic",
.of_match_table = gen_pci_of_match,
.suppress_bind_attrs = true,
},
.probe = gen_pci_probe,
};
Expand Down
1 change: 1 addition & 0 deletions drivers/pci/host/pci-thunder-ecam.c
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,7 @@ static struct platform_driver thunder_ecam_driver = {
.driver = {
.name = KBUILD_MODNAME,
.of_match_table = thunder_ecam_of_match,
.suppress_bind_attrs = true,
},
.probe = thunder_ecam_probe,
};
Expand Down
1 change: 1 addition & 0 deletions drivers/pci/host/pci-thunder-pem.c
Original file line number Diff line number Diff line change
Expand Up @@ -474,6 +474,7 @@ static struct platform_driver thunder_pem_driver = {
.driver = {
.name = KBUILD_MODNAME,
.of_match_table = thunder_pem_of_match,
.suppress_bind_attrs = true,
},
.probe = thunder_pem_probe,
};
Expand Down
1 change: 1 addition & 0 deletions drivers/pci/host/pci-versatile.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,7 @@ static struct platform_driver versatile_pci_driver = {
.driver = {
.name = "versatile-pci",
.of_match_table = versatile_pci_of_match,
.suppress_bind_attrs = true,
},
.probe = versatile_pci_probe,
};
Expand Down
1 change: 1 addition & 0 deletions drivers/pci/host/pci-xgene.c
Original file line number Diff line number Diff line change
Expand Up @@ -697,6 +697,7 @@ static struct platform_driver xgene_pcie_driver = {
.driver = {
.name = "xgene-pcie",
.of_match_table = of_match_ptr(xgene_pcie_match_table),
.suppress_bind_attrs = true,
},
.probe = xgene_pcie_probe_bridge,
};
Expand Down

0 comments on commit a5f40e8

Please sign in to comment.