diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2020-06-27 15:17:21 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2020-06-27 15:17:21 -0700 | 
| commit | c322f5399fc36300ae870db8fbcf793e063aaae5 (patch) | |
| tree | 6dcb4270971b933db314e5805d37626fd3e47af6 | |
| parent | 8bf9865187f6c3130b5c748a3212d591c9d563de (diff) | |
| parent | ebfa440ce38b7e2e04c3124aa89c8a9f4094cf21 (diff) | |
Merge tag 'vfio-v5.8-rc3' of git://github.com/awilliam/linux-vfio
Pull VFIO fixes from Alex Williamson:
 - Fix double free of eventfd ctx (Alex Williamson)
 - Fix duplicate use of capability ID (Alex Williamson)
 - Fix SR-IOV VF memory enable handling (Alex Williamson)
* tag 'vfio-v5.8-rc3' of git://github.com/awilliam/linux-vfio:
  vfio/pci: Fix SR-IOV VF handling with MMIO blocking
  vfio/type1: Fix migration info capability ID
  vfio/pci: Clear error and request eventfd ctx after releasing
| -rw-r--r-- | drivers/vfio/pci/vfio_pci.c | 8 | ||||
| -rw-r--r-- | drivers/vfio/pci/vfio_pci_config.c | 17 | ||||
| -rw-r--r-- | include/uapi/linux/vfio.h | 2 | 
3 files changed, 23 insertions, 4 deletions
| diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c index 7c0779018b1b..f634c81998bb 100644 --- a/drivers/vfio/pci/vfio_pci.c +++ b/drivers/vfio/pci/vfio_pci.c @@ -521,10 +521,14 @@ static void vfio_pci_release(void *device_data)  		vfio_pci_vf_token_user_add(vdev, -1);  		vfio_spapr_pci_eeh_release(vdev->pdev);  		vfio_pci_disable(vdev); -		if (vdev->err_trigger) +		if (vdev->err_trigger) {  			eventfd_ctx_put(vdev->err_trigger); -		if (vdev->req_trigger) +			vdev->err_trigger = NULL; +		} +		if (vdev->req_trigger) {  			eventfd_ctx_put(vdev->req_trigger); +			vdev->req_trigger = NULL; +		}  	}  	mutex_unlock(&vdev->reflck->lock); 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) diff --git a/include/uapi/linux/vfio.h b/include/uapi/linux/vfio.h index eca6692667a3..920470502329 100644 --- a/include/uapi/linux/vfio.h +++ b/include/uapi/linux/vfio.h @@ -1030,7 +1030,7 @@ struct vfio_iommu_type1_info_cap_iova_range {   * size in bytes that can be used by user applications when getting the dirty   * bitmap.   */ -#define VFIO_IOMMU_TYPE1_INFO_CAP_MIGRATION  1 +#define VFIO_IOMMU_TYPE1_INFO_CAP_MIGRATION  2  struct vfio_iommu_type1_info_cap_migration {  	struct	vfio_info_cap_header header; | 
