Skip to content

Commit

Permalink
iommu: Consolidate IOVA allocator code
Browse files Browse the repository at this point in the history
In order to share the IOVA allocator with other architectures, break
the unnecssary dependency on the Intel IOMMU driver and move the
remaining IOVA internals to iova.c

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
  • Loading branch information
Robin Murphy authored and Joerg Roedel committed Jan 19, 2015
1 parent 114150d commit 85b4545
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 31 deletions.
33 changes: 2 additions & 31 deletions drivers/iommu/intel-iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -485,7 +485,6 @@ __setup("intel_iommu=", intel_iommu_setup);

static struct kmem_cache *iommu_domain_cache;
static struct kmem_cache *iommu_devinfo_cache;
static struct kmem_cache *iommu_iova_cache;

static inline void *alloc_pgtable_page(int node)
{
Expand Down Expand Up @@ -523,16 +522,6 @@ static inline void free_devinfo_mem(void *vaddr)
kmem_cache_free(iommu_devinfo_cache, vaddr);
}

struct iova *alloc_iova_mem(void)
{
return kmem_cache_alloc(iommu_iova_cache, GFP_ATOMIC);
}

void free_iova_mem(struct iova *iova)
{
kmem_cache_free(iommu_iova_cache, iova);
}

static inline int domain_type_is_vm(struct dmar_domain *domain)
{
return domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE;
Expand Down Expand Up @@ -3427,23 +3416,6 @@ static inline int iommu_devinfo_cache_init(void)
return ret;
}

static inline int iommu_iova_cache_init(void)
{
int ret = 0;

iommu_iova_cache = kmem_cache_create("iommu_iova",
sizeof(struct iova),
0,
SLAB_HWCACHE_ALIGN,
NULL);
if (!iommu_iova_cache) {
printk(KERN_ERR "Couldn't create iova cache\n");
ret = -ENOMEM;
}

return ret;
}

static int __init iommu_init_mempool(void)
{
int ret;
Expand All @@ -3461,7 +3433,7 @@ static int __init iommu_init_mempool(void)

kmem_cache_destroy(iommu_domain_cache);
domain_error:
kmem_cache_destroy(iommu_iova_cache);
iommu_iova_cache_destroy();

return -ENOMEM;
}
Expand All @@ -3470,8 +3442,7 @@ static void __init iommu_exit_mempool(void)
{
kmem_cache_destroy(iommu_devinfo_cache);
kmem_cache_destroy(iommu_domain_cache);
kmem_cache_destroy(iommu_iova_cache);

iommu_iova_cache_destroy();
}

static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev)
Expand Down
35 changes: 35 additions & 0 deletions drivers/iommu/iova.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,41 @@
*/

#include <linux/iova.h>
#include <linux/slab.h>

static struct kmem_cache *iommu_iova_cache;

int iommu_iova_cache_init(void)
{
int ret = 0;

iommu_iova_cache = kmem_cache_create("iommu_iova",
sizeof(struct iova),
0,
SLAB_HWCACHE_ALIGN,
NULL);
if (!iommu_iova_cache) {
pr_err("Couldn't create iova cache\n");
ret = -ENOMEM;
}

return ret;
}

void iommu_iova_cache_destroy(void)
{
kmem_cache_destroy(iommu_iova_cache);
}

struct iova *alloc_iova_mem(void)
{
return kmem_cache_alloc(iommu_iova_cache, GFP_ATOMIC);
}

void free_iova_mem(struct iova *iova)
{
kmem_cache_free(iommu_iova_cache, iova);
}

void
init_iova_domain(struct iova_domain *iovad, unsigned long pfn_32bit)
Expand Down
3 changes: 3 additions & 0 deletions include/linux/iova.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ static inline unsigned long iova_size(struct iova *iova)
return iova->pfn_hi - iova->pfn_lo + 1;
}

int iommu_iova_cache_init(void);
void iommu_iova_cache_destroy(void);

struct iova *alloc_iova_mem(void);
void free_iova_mem(struct iova *iova);
void free_iova(struct iova_domain *iovad, unsigned long pfn);
Expand Down

0 comments on commit 85b4545

Please sign in to comment.