Skip to content

Commit

Permalink
iova: Add init_iova_domain_ext()
Browse files Browse the repository at this point in the history
Add extended version of init_iova_domain() which accepts an max opt
iova length argument, and use it to set the rcaches range.

Signed-off-by: John Garry <john.garry@huawei.com>
  • Loading branch information
John Garry authored and intel-lab-lkp committed May 10, 2021
1 parent dd3a8db commit d9a8e3a
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
29 changes: 23 additions & 6 deletions drivers/iommu/iova.c
Expand Up @@ -23,7 +23,7 @@ static bool iova_rcache_insert(struct iova_domain *iovad,
static unsigned long iova_rcache_get(struct iova_domain *iovad,
unsigned long size,
unsigned long limit_pfn);
static void init_iova_rcaches(struct iova_domain *iovad);
static void init_iova_rcaches(struct iova_domain *iovad, unsigned long iova_len);
static void free_cpu_cached_iovas(unsigned int cpu, struct iova_domain *iovad);
static void free_iova_rcaches(struct iova_domain *iovad);
static void fq_destroy_all_entries(struct iova_domain *iovad);
Expand All @@ -47,8 +47,8 @@ static struct iova *to_iova(struct rb_node *node)
}

void
init_iova_domain(struct iova_domain *iovad, unsigned long granule,
unsigned long start_pfn)
__init_iova_domain(struct iova_domain *iovad, unsigned long granule,
unsigned long start_pfn, unsigned long iova_len)
{
/*
* IOVA granularity will normally be equal to the smallest
Expand All @@ -71,7 +71,21 @@ init_iova_domain(struct iova_domain *iovad, unsigned long granule,
rb_link_node(&iovad->anchor.node, NULL, &iovad->rbroot.rb_node);
rb_insert_color(&iovad->anchor.node, &iovad->rbroot);
cpuhp_state_add_instance_nocalls(CPUHP_IOMMU_IOVA_DEAD, &iovad->cpuhp_dead);
init_iova_rcaches(iovad);
init_iova_rcaches(iovad, iova_len);
}

void
init_iova_domain_ext(struct iova_domain *iovad, unsigned long granule,
unsigned long start_pfn, unsigned long iova_len)
{
__init_iova_domain(iovad, granule, start_pfn, iova_len);
}

void
init_iova_domain(struct iova_domain *iovad, unsigned long granule,
unsigned long start_pfn)
{
__init_iova_domain(iovad, granule, start_pfn, 0);
}
EXPORT_SYMBOL_GPL(init_iova_domain);

Expand Down Expand Up @@ -883,14 +897,17 @@ bool iova_domain_len_is_cached(struct iova_domain *iovad, unsigned long iova_len
return iova_len_to_rcache_max(iova_len) == iovad->rcache_max_size;
}

static void init_iova_rcaches(struct iova_domain *iovad)
static void init_iova_rcaches(struct iova_domain *iovad, unsigned long iova_len)
{
struct iova_cpu_rcache *cpu_rcache;
struct iova_rcache *rcache;
unsigned int cpu;
int i;

iovad->rcache_max_size = IOVA_RANGE_CACHE_MAX_SIZE;
if (iova_len)
iovad->rcache_max_size = iova_len_to_rcache_max(iova_len);
else
iovad->rcache_max_size = IOVA_RANGE_CACHE_MAX_SIZE;

iovad->rcaches = kcalloc(iovad->rcache_max_size,
sizeof(*iovad->rcaches), GFP_KERNEL);
Expand Down
9 changes: 9 additions & 0 deletions include/linux/iova.h
Expand Up @@ -154,6 +154,8 @@ struct iova *reserve_iova(struct iova_domain *iovad, unsigned long pfn_lo,
unsigned long pfn_hi);
void init_iova_domain(struct iova_domain *iovad, unsigned long granule,
unsigned long start_pfn);
void init_iova_domain_ext(struct iova_domain *iovad, unsigned long granule,
unsigned long start_pfn, unsigned long iova_len);
int init_iova_flush_queue(struct iova_domain *iovad,
iova_flush_cb flush_cb, iova_entry_dtor entry_dtor);
struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn);
Expand Down Expand Up @@ -222,6 +224,13 @@ static inline void init_iova_domain(struct iova_domain *iovad,
{
}

static inline void init_iova_domain_ext(struct iova_domain *iovad,
unsigned long granule,
unsigned long start_pfn,
unsigned long iova_len)
{
}

static inline int init_iova_flush_queue(struct iova_domain *iovad,
iova_flush_cb flush_cb,
iova_entry_dtor entry_dtor)
Expand Down

0 comments on commit d9a8e3a

Please sign in to comment.