On Mon, Nov 28, 2016 at 10:15:21PM -0600, Bjorn Helgaas wrote: >If we update a VF BAR while it's enabled, there are two potential problems: > > 1) Any driver that's using the VF has a cached BAR value that is stale > after the update, and > > 2) We can't update 64-bit BARs atomically, so the intermediate state > (new lower dword with old upper dword) may conflict with another > device, and an access by a driver unrelated to the VF may cause a bus > error. > >Warn about attempts to update VF BARs while they are enabled. This is a >programming error, so use dev_WARN() to get a backtrace. > >Signed-off-by: Bjorn Helgaas <bhelgaas@xxxxxxxxxx> Reviewed-by: Gavin Shan <gwshan@xxxxxxxxxxxxxxxxxx> >--- > drivers/pci/iov.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > >diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c >index d00ed5c..a800ba2 100644 >--- a/drivers/pci/iov.c >+++ b/drivers/pci/iov.c >@@ -584,6 +584,7 @@ void pci_iov_update_resource(struct pci_dev *dev, int resno) > struct resource *res = dev->resource + resno; > int vf_bar = resno - PCI_IOV_RESOURCES; > struct pci_bus_region region; >+ u16 cmd; > u32 new; > int reg; > >@@ -595,6 +596,13 @@ void pci_iov_update_resource(struct pci_dev *dev, int resno) > if (!iov) > return; > >+ pci_read_config_word(dev, iov->pos + PCI_SRIOV_CTRL, &cmd); >+ if ((cmd & PCI_SRIOV_CTRL_VFE) && (cmd & PCI_SRIOV_CTRL_MSE)) { >+ dev_WARN(&dev->dev, "can't update enabled VF BAR%d %pR\n", >+ vf_bar, res); >+ return; >+ } >+ > /* > * Ignore unimplemented BARs, unused resource slots for 64-bit > * BARs, and non-movable resources, e.g., those described via > >-- >To unsubscribe from this list: send the line "unsubscribe linux-pci" in >the body of a message to majordomo@xxxxxxxxxxxxxxx >More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html