diff options
| -rw-r--r-- | drivers/vfio/pci/vfio_pci_config.c | 17 | 
1 files changed, 16 insertions, 1 deletions
| diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c index 8746c943247a..d98843feddce 100644 --- a/drivers/vfio/pci/vfio_pci_config.c +++ b/drivers/vfio/pci/vfio_pci_config.c @@ -398,9 +398,15 @@ static inline void p_setd(struct perm_bits *p, int off, u32 virt, u32 write)  /* Caller should hold memory_lock semaphore */  bool __vfio_pci_memory_enabled(struct vfio_pci_device *vdev)  { +	struct pci_dev *pdev = vdev->pdev;  	u16 cmd = le16_to_cpu(*(__le16 *)&vdev->vconfig[PCI_COMMAND]); -	return cmd & PCI_COMMAND_MEMORY; +	/* +	 * SR-IOV VF memory enable is handled by the MSE bit in the +	 * PF SR-IOV capability, there's therefore no need to trigger +	 * faults based on the virtual value. +	 */ +	return pdev->is_virtfn || (cmd & PCI_COMMAND_MEMORY);  }  /* @@ -1728,6 +1734,15 @@ int vfio_config_init(struct vfio_pci_device *vdev)  				 vconfig[PCI_INTERRUPT_PIN]);  		vconfig[PCI_INTERRUPT_PIN] = 0; /* Gratuitous for good VFs */ + +		/* +		 * VFs do no implement the memory enable bit of the COMMAND +		 * register therefore we'll not have it set in our initial +		 * copy of config space after pci_enable_device().  For +		 * consistency with PFs, set the virtual enable bit here. +		 */ +		*(__le16 *)&vconfig[PCI_COMMAND] |= +					cpu_to_le16(PCI_COMMAND_MEMORY);  	}  	if (!IS_ENABLED(CONFIG_VFIO_PCI_INTX) || vdev->nointx) | 
