[PATCH v9] drm/amdgpu: add drm buddy support to amdgpu

kernel test robot lkp at intel.com
Wed Mar 2 02:51:07 UTC 2022


Hi Arunpravin,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on drm/drm-next]
[also build test WARNING on drm-tip/drm-tip]
[cannot apply to drm-intel/for-linux-next v5.17-rc6 next-20220301]
[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/Arunpravin/drm-amdgpu-add-drm-buddy-support-to-amdgpu/20220302-043936
base:   git://anongit.freedesktop.org/drm/drm drm-next
config: ia64-randconfig-r011-20220301 (https://download.01.org/0day-ci/archive/20220302/202203020700.yfCUTgQZ-lkp@intel.com/config)
compiler: ia64-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/22a06757ae067e29c09a9d95eaf2b9053833740f
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Arunpravin/drm-amdgpu-add-drm-buddy-support-to-amdgpu/20220302-043936
        git checkout 22a06757ae067e29c09a9d95eaf2b9053833740f
        # save the config file to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/gpu/drm/amd/amdgpu/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>

All warnings (new ones prefixed by >>):

   drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c: In function 'amdgpu_vram_mgr_new':
>> drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c:360:28: warning: variable 'mem_bytes' set but not used [-Wunused-but-set-variable]
     360 |         u64 vis_usage = 0, mem_bytes, max_bytes, min_page_size;
         |                            ^~~~~~~~~


vim +/mem_bytes +360 drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c

   343	
   344	/**
   345	 * amdgpu_vram_mgr_new - allocate new ranges
   346	 *
   347	 * @man: TTM memory type manager
   348	 * @tbo: TTM BO we need this range for
   349	 * @place: placement flags and restrictions
   350	 * @res: the resulting mem object
   351	 *
   352	 * Allocate VRAM for the given BO.
   353	 */
   354	static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man,
   355				       struct ttm_buffer_object *tbo,
   356				       const struct ttm_place *place,
   357				       struct ttm_resource **res)
   358	{
   359		unsigned long lpfn, pages_per_node, pages_left, pages;
 > 360		u64 vis_usage = 0, mem_bytes, max_bytes, min_page_size;
   361		struct amdgpu_vram_mgr *mgr = to_vram_mgr(man);
   362		struct amdgpu_device *adev = to_amdgpu_device(mgr);
   363		struct amdgpu_vram_mgr_node *node;
   364		struct drm_buddy *mm = &mgr->mm;
   365		struct drm_buddy_block *block;
   366		unsigned i;
   367		int r;
   368	
   369		lpfn = place->lpfn;
   370		if (!lpfn)
   371			lpfn = man->size >> PAGE_SHIFT;
   372	
   373		max_bytes = adev->gmc.mc_vram_size;
   374		if (tbo->type != ttm_bo_type_kernel)
   375			max_bytes -= AMDGPU_VM_RESERVED_VRAM;
   376	
   377		mem_bytes = tbo->base.size;
   378		if (place->flags & TTM_PL_FLAG_CONTIGUOUS) {
   379			pages_per_node = ~0ul;
   380		} else {
   381	#ifdef CONFIG_TRANSPARENT_HUGEPAGE
   382			pages_per_node = HPAGE_PMD_NR;
   383	#else
   384			/* default to 2MB */
   385			pages_per_node = 2UL << (20UL - PAGE_SHIFT);
   386	#endif
   387			pages_per_node = max_t(uint32_t, pages_per_node,
   388					       tbo->page_alignment);
   389		}
   390	
   391		node = kzalloc(sizeof(*node), GFP_KERNEL);
   392		if (!node)
   393			return -ENOMEM;
   394	
   395		ttm_resource_init(tbo, place, &node->base);
   396	
   397		/* bail out quickly if there's likely not enough VRAM for this BO */
   398		if (ttm_resource_manager_usage(man) > max_bytes) {
   399			r = -ENOSPC;
   400			goto error_fini;
   401		}
   402	
   403		INIT_LIST_HEAD(&node->blocks);
   404	
   405		if (place->flags & TTM_PL_FLAG_TOPDOWN)
   406			node->flags |= DRM_BUDDY_TOPDOWN_ALLOCATION;
   407	
   408		if (place->fpfn || lpfn != man->size >> PAGE_SHIFT)
   409			/* Allocate blocks in desired range */
   410			node->flags |= DRM_BUDDY_RANGE_ALLOCATION;
   411	
   412		BUG_ON(!node->base.num_pages);
   413		pages_left = node->base.num_pages;
   414	
   415		i = 0;
   416		while (pages_left) {
   417			if (tbo->page_alignment)
   418				min_page_size = tbo->page_alignment << PAGE_SHIFT;
   419			else
   420				min_page_size = mgr->default_page_size;
   421	
   422			/* Limit maximum size to 2GB due to SG table limitations */
   423			pages = min(pages_left, 2UL << (30 - PAGE_SHIFT));
   424	
   425			if (pages >= pages_per_node)
   426				min_page_size = pages_per_node << PAGE_SHIFT;
   427	
   428			if (place->flags & TTM_PL_FLAG_CONTIGUOUS) {
   429				pages = roundup_pow_of_two(pages);
   430				min_page_size = pages << PAGE_SHIFT;
   431	
   432				if (pages > lpfn)
   433					lpfn = pages;
   434			}
   435	
   436			BUG_ON(min_page_size < mm->chunk_size);
   437	
   438			mutex_lock(&mgr->lock);
   439			r = drm_buddy_alloc_blocks(mm, (u64)place->fpfn << PAGE_SHIFT,
   440						   (u64)lpfn << PAGE_SHIFT,
   441						   (u64)pages << PAGE_SHIFT,
   442						   min_page_size,
   443						   &node->blocks,
   444						   node->flags);
   445			mutex_unlock(&mgr->lock);
   446			if (unlikely(r))
   447				goto error_free_blocks;
   448	
   449			++i;
   450	
   451			if (pages > pages_left)
   452				pages_left = 0;
   453			else
   454				pages_left -= pages;
   455		}
   456	
   457		/* Free unused pages for contiguous allocation */
   458		if (place->flags & TTM_PL_FLAG_CONTIGUOUS) {
   459			u64 actual_size = (u64)node->base.num_pages << PAGE_SHIFT;
   460	
   461			mutex_lock(&mgr->lock);
   462			drm_buddy_block_trim(mm,
   463					     actual_size,
   464					     &node->blocks);
   465			mutex_unlock(&mgr->lock);
   466		}
   467	
   468		list_for_each_entry(block, &node->blocks, link)
   469			vis_usage += amdgpu_vram_mgr_vis_size(adev, block);
   470	
   471		block = amdgpu_get_node(&node->blocks);
   472		if (!block) {
   473			r = -EINVAL;
   474			goto error_fini;
   475		}
   476	
   477		node->base.start = amdgpu_node_start(block) >> PAGE_SHIFT;
   478	
   479		if (i == 1 && place->flags & TTM_PL_FLAG_CONTIGUOUS)
   480			node->base.placement |= TTM_PL_FLAG_CONTIGUOUS;
   481	
   482		if (adev->gmc.xgmi.connected_to_cpu)
   483			node->base.bus.caching = ttm_cached;
   484		else
   485			node->base.bus.caching = ttm_write_combined;
   486	
   487		atomic64_add(vis_usage, &mgr->vis_usage);
   488		*res = &node->base;
   489		return 0;
   490	
   491	error_free_blocks:
   492		mutex_lock(&mgr->lock);
   493		drm_buddy_free_list(mm, &node->blocks);
   494		mutex_unlock(&mgr->lock);
   495	error_fini:
   496		ttm_resource_fini(man, &node->base);
   497		kfree(node);
   498	
   499		return r;
   500	}
   501	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org


More information about the amd-gfx mailing list