mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-16 01:04:08 +08:00
VFIO fixes for v5.12-rc4
- Fix 32-bit issue with new unmap-all flag (Steve Sistare) - Various Kconfig changes for better coverage (Jason Gunthorpe) - Fix to batch pinning support (Daniel Jordan) -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.14 (GNU/Linux) iQIcBAABAgAGBQJgU6PRAAoJECObm247sIsixAQP/RQCvHD4W7jmgrb7ksucE7Hz KaJaJzbonayUCdI5e1W4x4j8BhiclIAJXz+kMbjltN4AqASkKVIBzIlBmDt4nsJ/ AMCN7A1EOmPpG1xX6TpTXxfdw/7VjSRtFk/S8mv0N0NIRdZwue4SBbZd/oXkk7NF vBSsJkVn/nCGrEu1+vb/Ld5T8fecni99slyTaN/WYlEVqIJtTDEZhvPwMrIqNOcu n2UDMrifuUqXmbOKtCRhwPIwpOzEx8E1vNHAWHu3S8KOhdj7g6QXyWij2EmBD0hs rKU+uVnH/KImNVGHnwVqbPrlCxUcBV/RXKAA2XxN6VQiiLYAvhbHISVTtVHt21rQ pwJGcOyOeBmt+FrVw3cLwtkn3y87Nrg6gpQlrw3k3dyuYIUVThlUlBADzpmX0ZM5 40BYpWPsrqdvPQxZzY6ccAvkn838ZTNPDSPac5nnQOJgeYnxR+cWKzKeL4bggJxm kYhoIIQETnbJeUZQYOP4FT8ltJPJkhaMTHYSdKrCvkYhN2Eq3+Wi+gLiMbeEpM+d 6IUH+ZwHfH8DGQGUBfpt6AuKNu5vnUppHAu/xpoXJxl2ITyKHDoXypuEHsD+DRro 4CmS74+ma932WHYc+wwqnKRjyUFlwaDbqmIV7vv54dHRkhMSfGDVbWybCosGNodL NJNR1uFmuVgcyKpcWinq =C+4w -----END PGP SIGNATURE----- Merge tag 'vfio-v5.12-rc4' of git://github.com/awilliam/linux-vfio Pull VFIO fixes from Alex Williamson: - Fix 32-bit issue with new unmap-all flag (Steve Sistare) - Various Kconfig changes for better coverage (Jason Gunthorpe) - Fix to batch pinning support (Daniel Jordan) * tag 'vfio-v5.12-rc4' of git://github.com/awilliam/linux-vfio: vfio/type1: fix vaddr_get_pfns() return in vfio_pin_page_external() vfio: Depend on MMU ARM: amba: Allow some ARM_AMBA users to compile with COMPILE_TEST vfio-platform: Add COMPILE_TEST to VFIO_PLATFORM vfio: IOMMU_API should be selected vfio/type1: fix unmap all on ILP32
This commit is contained in:
commit
dc0337999d
@ -21,8 +21,8 @@ config VFIO_VIRQFD
|
||||
|
||||
menuconfig VFIO
|
||||
tristate "VFIO Non-Privileged userspace driver framework"
|
||||
depends on IOMMU_API
|
||||
select VFIO_IOMMU_TYPE1 if (X86 || S390 || ARM || ARM64)
|
||||
select IOMMU_API
|
||||
select VFIO_IOMMU_TYPE1 if MMU && (X86 || S390 || ARM || ARM64)
|
||||
help
|
||||
VFIO provides a framework for secure userspace device drivers.
|
||||
See Documentation/driver-api/vfio.rst for more details.
|
||||
|
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0-only
|
||||
config VFIO_PLATFORM
|
||||
tristate "VFIO support for platform devices"
|
||||
depends on VFIO && EVENTFD && (ARM || ARM64)
|
||||
depends on VFIO && EVENTFD && (ARM || ARM64 || COMPILE_TEST)
|
||||
select VFIO_VIRQFD
|
||||
help
|
||||
Support for platform devices with VFIO. This is required to make
|
||||
@ -12,7 +12,7 @@ config VFIO_PLATFORM
|
||||
|
||||
config VFIO_AMBA
|
||||
tristate "VFIO support for AMBA devices"
|
||||
depends on VFIO_PLATFORM && ARM_AMBA
|
||||
depends on VFIO_PLATFORM && (ARM_AMBA || COMPILE_TEST)
|
||||
help
|
||||
Support for ARM AMBA devices with VFIO. This is required to make
|
||||
use of ARM AMBA devices present on the system using the VFIO
|
||||
|
@ -189,7 +189,7 @@ static struct vfio_dma *vfio_find_dma(struct vfio_iommu *iommu,
|
||||
}
|
||||
|
||||
static struct rb_node *vfio_find_dma_first_node(struct vfio_iommu *iommu,
|
||||
dma_addr_t start, size_t size)
|
||||
dma_addr_t start, u64 size)
|
||||
{
|
||||
struct rb_node *res = NULL;
|
||||
struct rb_node *node = iommu->dma_list.rb_node;
|
||||
@ -785,7 +785,12 @@ static int vfio_pin_page_external(struct vfio_dma *dma, unsigned long vaddr,
|
||||
return -ENODEV;
|
||||
|
||||
ret = vaddr_get_pfns(mm, vaddr, 1, dma->prot, pfn_base, pages);
|
||||
if (ret == 1 && do_accounting && !is_invalid_reserved_pfn(*pfn_base)) {
|
||||
if (ret != 1)
|
||||
goto out;
|
||||
|
||||
ret = 0;
|
||||
|
||||
if (do_accounting && !is_invalid_reserved_pfn(*pfn_base)) {
|
||||
ret = vfio_lock_acct(dma, 1, true);
|
||||
if (ret) {
|
||||
put_pfn(*pfn_base, dma->prot);
|
||||
@ -797,6 +802,7 @@ static int vfio_pin_page_external(struct vfio_dma *dma, unsigned long vaddr,
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
mmput(mm);
|
||||
return ret;
|
||||
}
|
||||
@ -1288,7 +1294,7 @@ static int vfio_dma_do_unmap(struct vfio_iommu *iommu,
|
||||
int ret = -EINVAL, retries = 0;
|
||||
unsigned long pgshift;
|
||||
dma_addr_t iova = unmap->iova;
|
||||
unsigned long size = unmap->size;
|
||||
u64 size = unmap->size;
|
||||
bool unmap_all = unmap->flags & VFIO_DMA_UNMAP_FLAG_ALL;
|
||||
bool invalidate_vaddr = unmap->flags & VFIO_DMA_UNMAP_FLAG_VADDR;
|
||||
struct rb_node *n, *first_n;
|
||||
@ -1304,14 +1310,12 @@ static int vfio_dma_do_unmap(struct vfio_iommu *iommu,
|
||||
if (unmap_all) {
|
||||
if (iova || size)
|
||||
goto unlock;
|
||||
size = SIZE_MAX;
|
||||
} else if (!size || size & (pgsize - 1)) {
|
||||
size = U64_MAX;
|
||||
} else if (!size || size & (pgsize - 1) ||
|
||||
iova + size - 1 < iova || size > SIZE_MAX) {
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
if (iova + size - 1 < iova || size > SIZE_MAX)
|
||||
goto unlock;
|
||||
|
||||
/* When dirty tracking is enabled, allow only min supported pgsize */
|
||||
if ((unmap->flags & VFIO_DMA_UNMAP_FLAG_GET_DIRTY_BITMAP) &&
|
||||
(!iommu->dirty_page_tracking || (bitmap->pgsize != pgsize))) {
|
||||
|
@ -105,8 +105,19 @@ extern struct bus_type amba_bustype;
|
||||
#define amba_get_drvdata(d) dev_get_drvdata(&d->dev)
|
||||
#define amba_set_drvdata(d,p) dev_set_drvdata(&d->dev, p)
|
||||
|
||||
#ifdef CONFIG_ARM_AMBA
|
||||
int amba_driver_register(struct amba_driver *);
|
||||
void amba_driver_unregister(struct amba_driver *);
|
||||
#else
|
||||
static inline int amba_driver_register(struct amba_driver *drv)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline void amba_driver_unregister(struct amba_driver *drv)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
|
||||
void amba_device_put(struct amba_device *);
|
||||
int amba_device_add(struct amba_device *, struct resource *);
|
||||
|
Loading…
Reference in New Issue
Block a user