Message ID | 1620656249-68890-10-git-send-email-john.garry@huawei.com |
---|---|
State | New |
Headers | show |
Series | dma mapping/iommu: Allow IOMMU IOVA rcache range to be configured | expand |
Hi John, I love your patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING on v5.13-rc1 next-20210510] [cannot apply to iommu/next mkp-scsi/for-next scsi/for-next] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch] url: https://github.com/0day-ci/linux/commits/John-Garry/dma-mapping-iommu-Allow-IOMMU-IOVA-rcache-range-to-be-configured/20210510-222805 base: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 6efb943b8616ec53a5e444193dccf1af9ad627b5 config: i386-randconfig-s002-20210510 (attached as .config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 reproduce: # apt-get install sparse # sparse version: v0.6.3-341-g8af24329-dirty # https://github.com/0day-ci/linux/commit/d9a8e3a4ac0070cd3094af3b41e9c6277faf3ea6 git remote add linux-review https://github.com/0day-ci/linux git fetch --no-tags linux-review John-Garry/dma-mapping-iommu-Allow-IOMMU-IOVA-rcache-range-to-be-configured/20210510-222805 git checkout d9a8e3a4ac0070cd3094af3b41e9c6277faf3ea6 # save the attached .config to linux build tree make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' W=1 ARCH=i386 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/iommu/iova.c:50:1: warning: no previous prototype for '__init_iova_domain' [-Wmissing-prototypes] 50 | __init_iova_domain(struct iova_domain *iovad, unsigned long granule, | ^~~~~~~~~~~~~~~~~~ sparse warnings: (new ones prefixed by >>) >> drivers/iommu/iova.c:50:1: sparse: sparse: symbol '__init_iova_domain' was not declared. Should it be static? Please review and possibly fold the followup patch. vim +/__init_iova_domain +50 drivers/iommu/iova.c 48 49 void > 50 __init_iova_domain(struct iova_domain *iovad, unsigned long granule, 51 unsigned long start_pfn, unsigned long iova_len) 52 { 53 /* 54 * IOVA granularity will normally be equal to the smallest 55 * supported IOMMU page size; both *must* be capable of 56 * representing individual CPU pages exactly. 57 */ 58 BUG_ON((granule > PAGE_SIZE) || !is_power_of_2(granule)); 59 60 spin_lock_init(&iovad->iova_rbtree_lock); 61 iovad->rbroot = RB_ROOT; 62 iovad->cached_node = &iovad->anchor.node; 63 iovad->cached32_node = &iovad->anchor.node; 64 iovad->granule = granule; 65 iovad->start_pfn = start_pfn; 66 iovad->dma_32bit_pfn = 1UL << (32 - iova_shift(iovad)); 67 iovad->max32_alloc_size = iovad->dma_32bit_pfn; 68 iovad->flush_cb = NULL; 69 iovad->fq = NULL; 70 iovad->anchor.pfn_lo = iovad->anchor.pfn_hi = IOVA_ANCHOR; 71 rb_link_node(&iovad->anchor.node, NULL, &iovad->rbroot.rb_node); 72 rb_insert_color(&iovad->anchor.node, &iovad->rbroot); 73 cpuhp_state_add_instance_nocalls(CPUHP_IOMMU_IOVA_DEAD, &iovad->cpuhp_dead); 74 init_iova_rcaches(iovad, iova_len); 75 } 76 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/iommu/iova.c b/drivers/iommu/iova.c index 95892a0433cc..273a689006c3 100644 --- a/drivers/iommu/iova.c +++ b/drivers/iommu/iova.c @@ -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); @@ -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 @@ -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); @@ -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); diff --git a/include/linux/iova.h b/include/linux/iova.h index 04cc8eb6de38..cfe416b6a8c7 100644 --- a/include/linux/iova.h +++ b/include/linux/iova.h @@ -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); @@ -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)
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> --- drivers/iommu/iova.c | 29 +++++++++++++++++++++++------ include/linux/iova.h | 9 +++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) -- 2.26.2