mirror of
https://github.com/t2linux/kernel.git
synced 2026-04-30 13:48:59 -07:00
Merge tag 'vfio-v3.15-rc1' of git://github.com/awilliam/linux-vfio
Pull VFIO updates from Alex Williamson:
"VFIO updates for v3.15 include:
- Allow the vfio-type1 IOMMU to support multiple domains within a
container
- Plumb path to query whether all domains are cache-coherent
- Wire query into kvm-vfio device to avoid KVM x86 WBINVD emulation
- Always select CONFIG_ANON_INODES, vfio depends on it (Arnd)
The first patch also makes the vfio-type1 IOMMU driver completely
independent of the bus_type of the devices it's handling, which
enables it to be used for both vfio-pci and a future vfio-platform
(and hopefully combinations involving both simultaneously)"
* tag 'vfio-v3.15-rc1' of git://github.com/awilliam/linux-vfio:
vfio: always select ANON_INODES
kvm/vfio: Support for DMA coherent IOMMUs
vfio: Add external user check extension interface
vfio/type1: Add extension to test DMA cache coherence of IOMMU
vfio/iommu_type1: Multi-IOMMU domain support
This commit is contained in:
@@ -13,6 +13,7 @@ menuconfig VFIO
|
||||
depends on IOMMU_API
|
||||
select VFIO_IOMMU_TYPE1 if X86
|
||||
select VFIO_IOMMU_SPAPR_TCE if (PPC_POWERNV || PPC_PSERIES)
|
||||
select ANON_INODES
|
||||
help
|
||||
VFIO provides a framework for secure userspace device drivers.
|
||||
See Documentation/vfio.txt for more details.
|
||||
|
||||
@@ -1413,6 +1413,12 @@ int vfio_external_user_iommu_id(struct vfio_group *group)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vfio_external_user_iommu_id);
|
||||
|
||||
long vfio_external_check_extension(struct vfio_group *group, unsigned long arg)
|
||||
{
|
||||
return vfio_ioctl_check_extension(group->container, arg);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vfio_external_check_extension);
|
||||
|
||||
/**
|
||||
* Module/class support
|
||||
*/
|
||||
|
||||
+365
-311
File diff suppressed because it is too large
Load Diff
@@ -96,5 +96,7 @@ extern void vfio_unregister_iommu_driver(
|
||||
extern struct vfio_group *vfio_group_get_external_user(struct file *filep);
|
||||
extern void vfio_group_put_external_user(struct vfio_group *group);
|
||||
extern int vfio_external_user_iommu_id(struct vfio_group *group);
|
||||
extern long vfio_external_check_extension(struct vfio_group *group,
|
||||
unsigned long arg);
|
||||
|
||||
#endif /* VFIO_H */
|
||||
|
||||
@@ -23,6 +23,12 @@
|
||||
|
||||
#define VFIO_TYPE1_IOMMU 1
|
||||
#define VFIO_SPAPR_TCE_IOMMU 2
|
||||
#define VFIO_TYPE1v2_IOMMU 3
|
||||
/*
|
||||
* IOMMU enforces DMA cache coherence (ex. PCIe NoSnoop stripping). This
|
||||
* capability is subject to change as groups are added or removed.
|
||||
*/
|
||||
#define VFIO_DMA_CC_IOMMU 4
|
||||
|
||||
/*
|
||||
* The IOCTL interface is designed for extensibility by embedding the
|
||||
|
||||
+20
-7
@@ -59,6 +59,22 @@ static void kvm_vfio_group_put_external_user(struct vfio_group *vfio_group)
|
||||
symbol_put(vfio_group_put_external_user);
|
||||
}
|
||||
|
||||
static bool kvm_vfio_group_is_coherent(struct vfio_group *vfio_group)
|
||||
{
|
||||
long (*fn)(struct vfio_group *, unsigned long);
|
||||
long ret;
|
||||
|
||||
fn = symbol_get(vfio_external_check_extension);
|
||||
if (!fn)
|
||||
return false;
|
||||
|
||||
ret = fn(vfio_group, VFIO_DMA_CC_IOMMU);
|
||||
|
||||
symbol_put(vfio_external_check_extension);
|
||||
|
||||
return ret > 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Groups can use the same or different IOMMU domains. If the same then
|
||||
* adding a new group may change the coherency of groups we've previously
|
||||
@@ -75,13 +91,10 @@ static void kvm_vfio_update_coherency(struct kvm_device *dev)
|
||||
mutex_lock(&kv->lock);
|
||||
|
||||
list_for_each_entry(kvg, &kv->group_list, node) {
|
||||
/*
|
||||
* TODO: We need an interface to check the coherency of
|
||||
* the IOMMU domain this group is using. For now, assume
|
||||
* it's always noncoherent.
|
||||
*/
|
||||
noncoherent = true;
|
||||
break;
|
||||
if (!kvm_vfio_group_is_coherent(kvg->vfio_group)) {
|
||||
noncoherent = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (noncoherent != kv->noncoherent) {
|
||||
|
||||
Reference in New Issue
Block a user