Message ID | 20200806233459.4057784-4-airlied@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/4] drm/amdgpu/ttm: move vram/gtt mgr allocations to mman. | expand |
Hi Dave, I love your patch! Perhaps something to improve: [auto build test WARNING on drm-tip/drm-tip] [cannot apply to drm-intel/for-linux-next tegra-drm/drm/tegra/for-next linus/master drm/drm-next drm-exynos/exynos-drm-next v5.8 next-20200806] [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/Dave-Airlie/drm-amdgpu-ttm-move-vram-gtt-mgr-allocations-to-mman/20200807-083526 base: git://anongit.freedesktop.org/drm/drm-tip drm-tip config: x86_64-randconfig-a015-20200806 (attached as .config) compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42) 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 # install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 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/gpu/drm/radeon/radeon_ttm.c:754:5: warning: no previous prototype for function 'radeon_ttm_init' [-Wmissing-prototypes] int radeon_ttm_init(struct radeon_device *rdev) ^ drivers/gpu/drm/radeon/radeon_ttm.c:754:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int radeon_ttm_init(struct radeon_device *rdev) ^ static drivers/gpu/drm/radeon/radeon_ttm.c:812:6: warning: no previous prototype for function 'radeon_ttm_fini' [-Wmissing-prototypes] void radeon_ttm_fini(struct radeon_device *rdev) ^ drivers/gpu/drm/radeon/radeon_ttm.c:812:1: note: declare 'static' if the function is not intended to be used outside of this translation unit void radeon_ttm_fini(struct radeon_device *rdev) ^ static >> drivers/gpu/drm/radeon/radeon_ttm.c:845:28: warning: variable 'man' is uninitialized when used here [-Wuninitialized] ttm_range_man_adjust_size(man, size >> PAGE_SHIFT); ^~~ drivers/gpu/drm/radeon/radeon_ttm.c:839:34: note: initialize the variable 'man' to silence this warning struct ttm_resource_manager *man; ^ = NULL drivers/gpu/drm/radeon/radeon_ttm.c:872:5: warning: no previous prototype for function 'radeon_mmap' [-Wmissing-prototypes] int radeon_mmap(struct file *filp, struct vm_area_struct *vma) ^ drivers/gpu/drm/radeon/radeon_ttm.c:872:1: note: declare 'static' if the function is not intended to be used outside of this translation unit int radeon_mmap(struct file *filp, struct vm_area_struct *vma) ^ static 4 warnings generated. vim +/man +845 drivers/gpu/drm/radeon/radeon_ttm.c 811 > 812 void radeon_ttm_fini(struct radeon_device *rdev) 813 { 814 int r; 815 816 if (!rdev->mman.initialized) 817 return; 818 radeon_ttm_debugfs_fini(rdev); 819 if (rdev->stolen_vga_memory) { 820 r = radeon_bo_reserve(rdev->stolen_vga_memory, false); 821 if (r == 0) { 822 radeon_bo_unpin(rdev->stolen_vga_memory); 823 radeon_bo_unreserve(rdev->stolen_vga_memory); 824 } 825 radeon_bo_unref(&rdev->stolen_vga_memory); 826 } 827 ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_VRAM); 828 ttm_range_man_fini(&rdev->mman.bdev, TTM_PL_TT); 829 ttm_bo_device_release(&rdev->mman.bdev); 830 radeon_gart_fini(rdev); 831 rdev->mman.initialized = false; 832 DRM_INFO("radeon: ttm finalized\n"); 833 } 834 835 /* this should only be called at bootup or when userspace 836 * isn't running */ 837 void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size) 838 { 839 struct ttm_resource_manager *man; 840 841 if (!rdev->mman.initialized) 842 return; 843 844 /* this just adjusts TTM size idea, which sets lpfn to the correct value */ > 845 ttm_range_man_adjust_size(man, size >> PAGE_SHIFT); 846 } 847 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Dave,
I love your patch! Perhaps something to improve:
[auto build test WARNING on drm-tip/drm-tip]
[cannot apply to drm-intel/for-linux-next tegra-drm/drm/tegra/for-next linus/master drm/drm-next drm-exynos/exynos-drm-next v5.8 next-20200806]
[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/Dave-Airlie/drm-amdgpu-ttm-move-vram-gtt-mgr-allocations-to-mman/20200807-083526
base: git://anongit.freedesktop.org/drm/drm-tip drm-tip
config: arc-randconfig-r005-20200805 (attached as .config)
compiler: arc-elf-gcc (GCC) 9.3.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
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arc
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 >>):
In file included from drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h:29,
from drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.h:26,
from drivers/gpu/drm/amd/amdgpu/amdgpu.h:43,
from drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:38:
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c: In function 'amdgpu_bo_validate_size':
>> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:473:12: warning: format '%llu' expects argument of type 'long long unsigned int', but argument 4 has type 'long unsigned int' [-Wformat=]
473 | DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size,
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/drm/drm_print.h:490:25: note: in definition of macro 'DRM_DEBUG'
490 | __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__)
| ^~~
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:473:54: note: format string is defined here
473 | DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size,
| ~~~^
| |
| long long unsigned int
| %lu
In file included from drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:38:
At top level:
drivers/gpu/drm/amd/amdgpu/amdgpu.h:192:19: warning: 'debug_evictions' defined but not used [-Wunused-const-variable=]
192 | static const bool debug_evictions; /* = false */
| ^~~~~~~~~~~~~~~
drivers/gpu/drm/amd/amdgpu/amdgpu.h:191:18: warning: 'sched_policy' defined but not used [-Wunused-const-variable=]
191 | static const int sched_policy = KFD_SCHED_POLICY_HWS;
| ^~~~~~~~~~~~
In file included from drivers/gpu/drm/amd/amdgpu/../display/dc/dc_types.h:33,
from drivers/gpu/drm/amd/amdgpu/../display/dc/dm_services_types.h:30,
from drivers/gpu/drm/amd/amdgpu/../include/dm_pp_interface.h:26,
from drivers/gpu/drm/amd/amdgpu/amdgpu.h:65,
from drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:38:
drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:76:32: warning: 'dc_fixpt_ln2_div_2' defined but not used [-Wunused-const-variable=]
76 | static const struct fixed31_32 dc_fixpt_ln2_div_2 = { 1488522236LL };
| ^~~~~~~~~~~~~~~~~~
drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:75:32: warning: 'dc_fixpt_ln2' defined but not used [-Wunused-const-variable=]
75 | static const struct fixed31_32 dc_fixpt_ln2 = { 2977044471LL };
| ^~~~~~~~~~~~
drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:74:32: warning: 'dc_fixpt_e' defined but not used [-Wunused-const-variable=]
74 | static const struct fixed31_32 dc_fixpt_e = { 11674931555LL };
| ^~~~~~~~~~
drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:73:32: warning: 'dc_fixpt_two_pi' defined but not used [-Wunused-const-variable=]
73 | static const struct fixed31_32 dc_fixpt_two_pi = { 26986075409LL };
| ^~~~~~~~~~~~~~~
drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:72:32: warning: 'dc_fixpt_pi' defined but not used [-Wunused-const-variable=]
72 | static const struct fixed31_32 dc_fixpt_pi = { 13493037705LL };
| ^~~~~~~~~~~
drivers/gpu/drm/amd/amdgpu/../display/include/fixed31_32.h:67:32: warning: 'dc_fixpt_zero' defined but not used [-Wunused-const-variable=]
67 | static const struct fixed31_32 dc_fixpt_zero = { 0 };
| ^~~~~~~~~~~~~
vim +473 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
aa1d562e645d254 Junwei Zhang 2016-09-08 440
79c631239a83aeb Andrey Grodzovsky 2017-11-10 441 /* Validate bo size is bit bigger then the request domain */
79c631239a83aeb Andrey Grodzovsky 2017-11-10 442 static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
79c631239a83aeb Andrey Grodzovsky 2017-11-10 443 unsigned long size, u32 domain)
79c631239a83aeb Andrey Grodzovsky 2017-11-10 444 {
89e1ba9e4973560 Dave Airlie 2020-08-07 445 unsigned long mgr_size = 0;
79c631239a83aeb Andrey Grodzovsky 2017-11-10 446 /*
79c631239a83aeb Andrey Grodzovsky 2017-11-10 447 * If GTT is part of requested domains the check must succeed to
79c631239a83aeb Andrey Grodzovsky 2017-11-10 448 * allow fall back to GTT
79c631239a83aeb Andrey Grodzovsky 2017-11-10 449 */
79c631239a83aeb Andrey Grodzovsky 2017-11-10 450 if (domain & AMDGPU_GEM_DOMAIN_GTT) {
89e1ba9e4973560 Dave Airlie 2020-08-07 451 mgr_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size;
79c631239a83aeb Andrey Grodzovsky 2017-11-10 452
89e1ba9e4973560 Dave Airlie 2020-08-07 453 if (size < (mgr_size << PAGE_SHIFT))
79c631239a83aeb Andrey Grodzovsky 2017-11-10 454 return true;
79c631239a83aeb Andrey Grodzovsky 2017-11-10 455 else
79c631239a83aeb Andrey Grodzovsky 2017-11-10 456 goto fail;
79c631239a83aeb Andrey Grodzovsky 2017-11-10 457 }
79c631239a83aeb Andrey Grodzovsky 2017-11-10 458
79c631239a83aeb Andrey Grodzovsky 2017-11-10 459 if (domain & AMDGPU_GEM_DOMAIN_VRAM) {
89e1ba9e4973560 Dave Airlie 2020-08-07 460 mgr_size = to_vram_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size;
79c631239a83aeb Andrey Grodzovsky 2017-11-10 461
89e1ba9e4973560 Dave Airlie 2020-08-07 462 if (size < (mgr_size << PAGE_SHIFT))
79c631239a83aeb Andrey Grodzovsky 2017-11-10 463 return true;
79c631239a83aeb Andrey Grodzovsky 2017-11-10 464 else
79c631239a83aeb Andrey Grodzovsky 2017-11-10 465 goto fail;
79c631239a83aeb Andrey Grodzovsky 2017-11-10 466 }
79c631239a83aeb Andrey Grodzovsky 2017-11-10 467
79c631239a83aeb Andrey Grodzovsky 2017-11-10 468
79c631239a83aeb Andrey Grodzovsky 2017-11-10 469 /* TODO add more domains checks, such as AMDGPU_GEM_DOMAIN_CPU */
79c631239a83aeb Andrey Grodzovsky 2017-11-10 470 return true;
79c631239a83aeb Andrey Grodzovsky 2017-11-10 471
79c631239a83aeb Andrey Grodzovsky 2017-11-10 472 fail:
299c776cebb01c1 Michel Dänzer 2017-11-15 @473 DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size,
89e1ba9e4973560 Dave Airlie 2020-08-07 474 mgr_size << PAGE_SHIFT);
79c631239a83aeb Andrey Grodzovsky 2017-11-10 475 return false;
79c631239a83aeb Andrey Grodzovsky 2017-11-10 476 }
79c631239a83aeb Andrey Grodzovsky 2017-11-10 477
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Dave, I love your patch! Perhaps something to improve: [auto build test WARNING on drm-tip/drm-tip] [cannot apply to drm-intel/for-linux-next tegra-drm/drm/tegra/for-next linus/master drm/drm-next drm-exynos/exynos-drm-next v5.8 next-20200806] [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/Dave-Airlie/drm-amdgpu-ttm-move-vram-gtt-mgr-allocations-to-mman/20200807-083526 base: git://anongit.freedesktop.org/drm/drm-tip drm-tip config: x86_64-randconfig-a004-20200805 (attached as .config) compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project aa57cabae2fc5abc08ab3e17b45f2890fc7c9e42) 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 # install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 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/gpu/drm/amd/amdgpu/amdgpu_object.c:474:5: warning: format specifies type 'unsigned long long' but the argument has type 'unsigned long' [-Wformat] mgr_size << PAGE_SHIFT); ^~~~~~~~~~~~~~~~~~~~~~ include/drm/drm_print.h:490:32: note: expanded from macro 'DRM_DEBUG' __drm_dbg(DRM_UT_CORE, fmt, ##__VA_ARGS__) ~~~ ^~~~~~~~~~~ drivers/gpu/drm/amd/amdgpu/amdgpu_object.c:493:2: warning: Please enable CONFIG_MTRR and CONFIG_X86_PAT for better performance thanks to write-combining [-W#warnings] #warning Please enable CONFIG_MTRR and CONFIG_X86_PAT for better performance \ ^ 2 warnings generated. vim +474 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c 440 441 /* Validate bo size is bit bigger then the request domain */ 442 static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, 443 unsigned long size, u32 domain) 444 { 445 unsigned long mgr_size = 0; 446 /* 447 * If GTT is part of requested domains the check must succeed to 448 * allow fall back to GTT 449 */ 450 if (domain & AMDGPU_GEM_DOMAIN_GTT) { 451 mgr_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; 452 453 if (size < (mgr_size << PAGE_SHIFT)) 454 return true; 455 else 456 goto fail; 457 } 458 459 if (domain & AMDGPU_GEM_DOMAIN_VRAM) { 460 mgr_size = to_vram_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; 461 462 if (size < (mgr_size << PAGE_SHIFT)) 463 return true; 464 else 465 goto fail; 466 } 467 468 469 /* TODO add more domains checks, such as AMDGPU_GEM_DOMAIN_CPU */ 470 return true; 471 472 fail: 473 DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, > 474 mgr_size << PAGE_SHIFT); 475 return false; 476 } 477 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Am 07.08.20 um 01:34 schrieb Dave Airlie: > From: Dave Airlie <airlied@redhat.com> > > This is a bit more involved that it looked, the range manager > needs accessors adding and amdgpu needs a bit of a refactor. > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 21 ++++++++----------- > drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 5 +++-- > drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 13 ++++++------ > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 12 +++++++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 16 ++++++-------- > drivers/gpu/drm/nouveau/nouveau_ttm.c | 5 ++--- > drivers/gpu/drm/radeon/radeon_gem.c | 2 +- > drivers/gpu/drm/radeon/radeon_ttm.c | 3 +-- > drivers/gpu/drm/ttm/ttm_bo.c | 7 ++----- > drivers/gpu/drm/ttm/ttm_range_manager.c | 21 +++++++++++++++++-- > drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 2 +- > drivers/gpu/drm/vmwgfx/vmwgfx_thp.c | 9 ++++---- > include/drm/ttm/ttm_bo_api.h | 4 +--- > include/drm/ttm/ttm_bo_driver.h | 20 ++++++++++++++++-- > 15 files changed, 87 insertions(+), 55 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c > index 010518148ef8..b769b43b2fbc 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c > @@ -24,11 +24,6 @@ > > #include "amdgpu.h" > > -static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) > -{ > - return container_of(man, struct amdgpu_gtt_mgr, manager); > -} > - > struct amdgpu_gtt_node { > struct drm_mm_node node; > struct ttm_buffer_object *tbo; > @@ -48,8 +43,9 @@ static ssize_t amdgpu_mem_info_gtt_total_show(struct device *dev, > struct drm_device *ddev = dev_get_drvdata(dev); > struct amdgpu_device *adev = ddev->dev_private; > struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); > - return snprintf(buf, PAGE_SIZE, "%llu\n", > - man->size * PAGE_SIZE); > + struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(man); > + return snprintf(buf, PAGE_SIZE, "%lu\n", > + gtt_mgr->size * PAGE_SIZE); > } > > /** > @@ -96,13 +92,14 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) > man->available_caching = TTM_PL_MASK_CACHING; > man->default_caching = TTM_PL_FLAG_CACHED; > > - ttm_resource_manager_init(man, gtt_size >> PAGE_SHIFT); > + mgr->size = gtt_size >> PAGE_SHIFT; > + ttm_resource_manager_init(man); > > start = AMDGPU_GTT_MAX_TRANSFER_SIZE * AMDGPU_GTT_NUM_TRANSFER_WINDOWS; > size = (adev->gmc.gart_size >> PAGE_SHIFT) - start; > drm_mm_init(&mgr->mm, start, size); > spin_lock_init(&mgr->lock); > - atomic64_set(&mgr->available, gtt_size >> PAGE_SHIFT); > + atomic64_set(&mgr->available, mgr->size); > > ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_total); > if (ret) { > @@ -264,7 +261,7 @@ static void amdgpu_gtt_mgr_del(struct ttm_resource_manager *man, > uint64_t amdgpu_gtt_mgr_usage(struct ttm_resource_manager *man) > { > struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man); > - s64 result = man->size - atomic64_read(&mgr->available); > + s64 result = mgr->size - atomic64_read(&mgr->available); > > return (result > 0 ? result : 0) * PAGE_SIZE; > } > @@ -305,8 +302,8 @@ static void amdgpu_gtt_mgr_debug(struct ttm_resource_manager *man, > drm_mm_print(&mgr->mm, printer); > spin_unlock(&mgr->lock); > > - drm_printf(printer, "man size:%llu pages, gtt available:%lld pages, usage:%lluMB\n", > - man->size, (u64)atomic64_read(&mgr->available), > + drm_printf(printer, "man size:%lu pages, gtt available:%lld pages, usage:%lluMB\n", > + mgr->size, (u64)atomic64_read(&mgr->available), > amdgpu_gtt_mgr_usage(man) >> 20); > } > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c > index fff9c013f337..732e4004777e 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c > @@ -608,7 +608,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file > min(adev->gmc.visible_vram_size - > atomic64_read(&adev->visible_pin_size), > vram_gtt.vram_size); > - vram_gtt.gtt_size = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT)->size; > + vram_gtt.gtt_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; > vram_gtt.gtt_size *= PAGE_SIZE; > vram_gtt.gtt_size -= atomic64_read(&adev->gart_pin_size); > return copy_to_user(out, &vram_gtt, > @@ -620,6 +620,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file > ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); > struct ttm_resource_manager *gtt_man = > ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); > + struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(gtt_man); > memset(&mem, 0, sizeof(mem)); > mem.vram.total_heap_size = adev->gmc.real_vram_size; > mem.vram.usable_heap_size = adev->gmc.real_vram_size - > @@ -640,7 +641,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file > mem.cpu_accessible_vram.max_allocation = > mem.cpu_accessible_vram.usable_heap_size * 3 / 4; > > - mem.gtt.total_heap_size = gtt_man->size; > + mem.gtt.total_heap_size = gtt_mgr->size; > mem.gtt.total_heap_size *= PAGE_SIZE; > mem.gtt.usable_heap_size = mem.gtt.total_heap_size - > atomic64_read(&adev->gart_pin_size); > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > index 43f4966331dd..33957d829197 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c > @@ -442,25 +442,24 @@ void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr, > static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, > unsigned long size, u32 domain) > { > - struct ttm_resource_manager *man = NULL; > - > + unsigned long mgr_size = 0; > /* > * If GTT is part of requested domains the check must succeed to > * allow fall back to GTT > */ > if (domain & AMDGPU_GEM_DOMAIN_GTT) { > - man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); > + mgr_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; > > - if (size < (man->size << PAGE_SHIFT)) > + if (size < (mgr_size << PAGE_SHIFT)) > return true; > else > goto fail; > } > > if (domain & AMDGPU_GEM_DOMAIN_VRAM) { > - man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); > + mgr_size = to_vram_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; > > - if (size < (man->size << PAGE_SHIFT)) > + if (size < (mgr_size << PAGE_SHIFT)) > return true; > else > goto fail; > @@ -472,7 +471,7 @@ static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, > > fail: > DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, > - man->size << PAGE_SHIFT); > + mgr_size << PAGE_SHIFT); > return false; > } > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > index 28557839f132..ca312ef8c2f8 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > @@ -2045,7 +2045,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable) > size = adev->gmc.real_vram_size; > else > size = adev->gmc.visible_vram_size; > - man->size = size >> PAGE_SHIFT; > + to_vram_mgr(man)->size = size >> PAGE_SHIFT; > adev->mman.buffer_funcs_enabled = enable; > } > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > index 4a6d92f27b6e..5636ef2b1707 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h > @@ -47,15 +47,27 @@ struct amdgpu_vram_mgr { > spinlock_t lock; > atomic64_t usage; > atomic64_t vis_usage; > + unsigned long size; > }; > > +static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) > +{ > + return container_of(man, struct amdgpu_vram_mgr, manager); > +} > + > struct amdgpu_gtt_mgr { > struct ttm_resource_manager manager; > struct drm_mm mm; > spinlock_t lock; > atomic64_t available; > + unsigned long size; Those should probably better be uint64_t, same for above. Apart from that looks rather good to me on first glance. Christian. > }; > > +static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) > +{ > + return container_of(man, struct amdgpu_gtt_mgr, manager); > +} > + > struct amdgpu_mman { > struct ttm_bo_device bdev; > bool mem_global_referenced; > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > index 7882efd275d1..d4aa2aa49b4f 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c > @@ -28,11 +28,6 @@ > #include "amdgpu_atomfirmware.h" > #include "atom.h" > > -static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) > -{ > - return container_of(man, struct amdgpu_vram_mgr, manager); > -} > - > static inline struct amdgpu_device *to_amdgpu_device(struct amdgpu_vram_mgr *mgr) > { > return container_of(mgr, struct amdgpu_device, mman.vram_mgr); > @@ -180,11 +175,12 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) > man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC; > man->default_caching = TTM_PL_FLAG_WC; > > - ttm_resource_manager_init(man, adev->gmc.real_vram_size >> PAGE_SHIFT); > + ttm_resource_manager_init(man); > > man->func = &amdgpu_vram_mgr_func; > > - drm_mm_init(&mgr->mm, 0, man->size); > + mgr->size = adev->gmc.real_vram_size >> PAGE_SHIFT; > + drm_mm_init(&mgr->mm, 0, mgr->size); > spin_lock_init(&mgr->lock); > > /* Add the two VRAM-related sysfs files */ > @@ -325,7 +321,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, > > lpfn = place->lpfn; > if (!lpfn) > - lpfn = man->size; > + lpfn = mgr->size; > > max_bytes = adev->gmc.mc_vram_size; > if (tbo->type != ttm_bo_type_kernel) > @@ -600,8 +596,8 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man, > drm_mm_print(&mgr->mm, printer); > spin_unlock(&mgr->lock); > > - drm_printf(printer, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n", > - man->size, amdgpu_vram_mgr_usage(man) >> 20, > + drm_printf(printer, "man size:%lu pages, ram usage:%lluMB, vis usage:%lluMB\n", > + mgr->size, amdgpu_vram_mgr_usage(man) >> 20, > amdgpu_vram_mgr_vis_usage(man) >> 20); > } > > diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c > index e6a30865a00b..93685a376a50 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c > +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c > @@ -175,8 +175,7 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) > man->func = &nouveau_vram_manager; > man->use_io_reserve_lru = true; > > - ttm_resource_manager_init(man, > - drm->gem.vram_available >> PAGE_SHIFT); > + ttm_resource_manager_init(man); > ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, man); > ttm_resource_manager_set_used(man, true); > return 0; > @@ -237,7 +236,7 @@ nouveau_ttm_init_gtt(struct nouveau_drm *drm) > man->available_caching = available_caching; > man->default_caching = default_caching; > man->use_tt = true; > - ttm_resource_manager_init(man, size_pages); > + ttm_resource_manager_init(man); > ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_TT, man); > ttm_resource_manager_set_used(man, true); > return 0; > diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c > index 7f5dfe04789e..00258d158cfe 100644 > --- a/drivers/gpu/drm/radeon/radeon_gem.c > +++ b/drivers/gpu/drm/radeon/radeon_gem.c > @@ -228,7 +228,7 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data, > > man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM); > > - args->vram_size = (u64)man->size << PAGE_SHIFT; > + args->vram_size = (u64)ttm_range_man_size(man) << PAGE_SHIFT; > args->vram_visible = rdev->mc.visible_vram_size; > args->vram_visible -= rdev->vram_pin_size; > args->gart_size = rdev->mc.gtt_size; > diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c > index 3355b69b13d1..e41ec62ff944 100644 > --- a/drivers/gpu/drm/radeon/radeon_ttm.c > +++ b/drivers/gpu/drm/radeon/radeon_ttm.c > @@ -843,9 +843,8 @@ void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size) > if (!rdev->mman.initialized) > return; > > - man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM); > /* this just adjusts TTM size idea, which sets lpfn to the correct value */ > - man->size = size >> PAGE_SHIFT; > + ttm_range_man_adjust_size(man, size >> PAGE_SHIFT); > } > > static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf) > diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c > index ad09329b62d3..cf8176bce4f6 100644 > --- a/drivers/gpu/drm/ttm/ttm_bo.c > +++ b/drivers/gpu/drm/ttm/ttm_bo.c > @@ -82,7 +82,6 @@ void ttm_resource_manager_debug(struct ttm_resource_manager *man, > { > drm_printf(p, " use_type: %d\n", man->use_type); > drm_printf(p, " use_tt: %d\n", man->use_tt); > - drm_printf(p, " size: %llu\n", man->size); > drm_printf(p, " available_caching: 0x%08X\n", man->available_caching); > drm_printf(p, " default_caching: 0x%08X\n", man->default_caching); > if (man->func && man->func->debug) > @@ -1468,8 +1467,7 @@ int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) > } > EXPORT_SYMBOL(ttm_bo_evict_mm); > > -void ttm_resource_manager_init(struct ttm_resource_manager *man, > - unsigned long p_size) > +void ttm_resource_manager_init(struct ttm_resource_manager *man) > { > unsigned i; > > @@ -1477,7 +1475,6 @@ void ttm_resource_manager_init(struct ttm_resource_manager *man, > mutex_init(&man->io_reserve_mutex); > spin_lock_init(&man->move_lock); > INIT_LIST_HEAD(&man->io_reserve_lru); > - man->size = p_size; > > for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) > INIT_LIST_HEAD(&man->lru[i]); > @@ -1590,7 +1587,7 @@ static void ttm_bo_init_sysman(struct ttm_bo_device *bdev) > man->available_caching = TTM_PL_MASK_CACHING; > man->default_caching = TTM_PL_FLAG_CACHED; > > - ttm_resource_manager_init(man, 0); > + ttm_resource_manager_init(man); > ttm_set_driver_manager(bdev, TTM_PL_SYSTEM, man); > ttm_resource_manager_set_used(man, true); > } > diff --git a/drivers/gpu/drm/ttm/ttm_range_manager.c b/drivers/gpu/drm/ttm/ttm_range_manager.c > index 274a05ca13d3..0dc4b17cc3dc 100644 > --- a/drivers/gpu/drm/ttm/ttm_range_manager.c > +++ b/drivers/gpu/drm/ttm/ttm_range_manager.c > @@ -47,6 +47,7 @@ struct ttm_range_manager { > struct ttm_resource_manager manager; > struct drm_mm mm; > spinlock_t lock; > + uint64_t size; > }; > > static inline struct ttm_range_manager *to_range_manager(struct ttm_resource_manager *man) > @@ -68,7 +69,7 @@ static int ttm_range_man_get_node(struct ttm_resource_manager *man, > > lpfn = place->lpfn; > if (!lpfn) > - lpfn = man->size; > + lpfn = rman->size; > > node = kzalloc(sizeof(*node), GFP_KERNEL); > if (!node) > @@ -133,8 +134,9 @@ int ttm_range_man_init(struct ttm_bo_device *bdev, > > man->func = &ttm_range_manager_func; > > - ttm_resource_manager_init(man, p_size); > + ttm_resource_manager_init(man); > > + rman->size = p_size; > drm_mm_init(&rman->mm, 0, p_size); > spin_lock_init(&rman->lock); > > @@ -185,3 +187,18 @@ static const struct ttm_resource_manager_func ttm_range_manager_func = { > .put_node = ttm_range_man_put_node, > .debug = ttm_range_man_debug > }; > + > +void ttm_range_man_adjust_size(struct ttm_resource_manager *man, > + unsigned long size) > +{ > + struct ttm_range_manager *rman = to_range_manager(man); > + rman->size = size; > +} > +EXPORT_SYMBOL(ttm_range_man_adjust_size); > + > +unsigned long ttm_range_man_size(struct ttm_resource_manager *man) > +{ > + struct ttm_range_manager *rman = to_range_manager(man); > + return rman->size; > +} > +EXPORT_SYMBOL(ttm_range_man_size); > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c > index 3fea7a6c7cfa..a7a2deae2277 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c > @@ -116,7 +116,7 @@ int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type) > man->default_caching = TTM_PL_FLAG_CACHED; > /* TODO: This is most likely not correct */ > man->use_tt = true; > - ttm_resource_manager_init(man, 0); > + ttm_resource_manager_init(man); > spin_lock_init(&gman->lock); > gman->used_gmr_pages = 0; > ida_init(&gman->gmr_ida); > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c > index f594e2e6ab7e..74cdee48b191 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c > @@ -19,6 +19,7 @@ struct vmw_thp_manager { > struct ttm_resource_manager manager; > struct drm_mm mm; > spinlock_t lock; > + uint64_t size; > }; > > static struct vmw_thp_manager *to_thp_manager(struct ttm_resource_manager *man) > @@ -63,7 +64,7 @@ static int vmw_thp_get_node(struct ttm_resource_manager *man, > > lpfn = place->lpfn; > if (!lpfn) > - lpfn = man->size; > + lpfn = rman->size; > > mode = DRM_MM_INSERT_BEST; > if (place->flags & TTM_PL_FLAG_TOPDOWN) > @@ -134,10 +135,10 @@ int vmw_thp_init(struct vmw_private *dev_priv) > man->available_caching = TTM_PL_FLAG_CACHED; > man->default_caching = TTM_PL_FLAG_CACHED; > > - ttm_resource_manager_init(man, > - dev_priv->vram_size >> PAGE_SHIFT); > + ttm_resource_manager_init(man); > > - drm_mm_init(&rman->mm, 0, man->size); > + rman->size = dev_priv->vram_size >> PAGE_SHIFT; > + drm_mm_init(&rman->mm, 0, rman->size); > spin_lock_init(&rman->lock); > > ttm_set_driver_manager(&dev_priv->bdev, TTM_PL_VRAM, &rman->manager); > diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h > index 770ad2195875..e4bf93482b59 100644 > --- a/include/drm/ttm/ttm_bo_api.h > +++ b/include/drm/ttm/ttm_bo_api.h > @@ -537,12 +537,10 @@ int ttm_bo_create(struct ttm_bo_device *bdev, unsigned long size, > * ttm_resource_manager_init > * > * @man: memory manager object to init > - * @p_size: size managed area in pages. > * > * Initialise core parts of a manager object. > */ > -void ttm_resource_manager_init(struct ttm_resource_manager *man, > - unsigned long p_size); > +void ttm_resource_manager_init(struct ttm_resource_manager *man); > > /** > * ttm_bo_evict_mm > diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h > index eb1c3312e175..c719b4aa3793 100644 > --- a/include/drm/ttm/ttm_bo_driver.h > +++ b/include/drm/ttm/ttm_bo_driver.h > @@ -116,7 +116,6 @@ struct ttm_resource_manager_func { > * managed by this memory type. > * @gpu_offset: If used, the GPU offset of the first managed page of > * fixed memory or the first managed location in an aperture. > - * @size: Size of the managed region. > * @available_caching: A mask of available caching types, TTM_PL_FLAG_XX, > * as defined in ttm_placement_common.h > * @default_caching: The default caching policy used for a buffer object > @@ -142,7 +141,6 @@ struct ttm_resource_manager { > */ > bool use_type; > bool use_tt; > - uint64_t size; > uint32_t available_caching; > uint32_t default_caching; > const struct ttm_resource_manager_func *func; > @@ -883,4 +881,22 @@ int ttm_range_man_fini(struct ttm_bo_device *bdev, > void ttm_resource_manager_debug(struct ttm_resource_manager *man, > struct drm_printer *p); > > +/** > + * ttm_range_man_adjust_size > + * > + * @man: manager to adjust size for > + * @p_size: new size. > + */ > +void ttm_range_man_adjust_size(struct ttm_resource_manager *man, > + unsigned long p_size); > + > +/** > + * ttm_range_man_size > + * > + * @man: manager to get size for > + * Returns: > + * size of range manager. > + */ > +unsigned long ttm_range_man_size(struct ttm_resource_manager *man); > + > #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c index 010518148ef8..b769b43b2fbc 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c @@ -24,11 +24,6 @@ #include "amdgpu.h" -static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) -{ - return container_of(man, struct amdgpu_gtt_mgr, manager); -} - struct amdgpu_gtt_node { struct drm_mm_node node; struct ttm_buffer_object *tbo; @@ -48,8 +43,9 @@ static ssize_t amdgpu_mem_info_gtt_total_show(struct device *dev, struct drm_device *ddev = dev_get_drvdata(dev); struct amdgpu_device *adev = ddev->dev_private; struct ttm_resource_manager *man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); - return snprintf(buf, PAGE_SIZE, "%llu\n", - man->size * PAGE_SIZE); + struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(man); + return snprintf(buf, PAGE_SIZE, "%lu\n", + gtt_mgr->size * PAGE_SIZE); } /** @@ -96,13 +92,14 @@ int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size) man->available_caching = TTM_PL_MASK_CACHING; man->default_caching = TTM_PL_FLAG_CACHED; - ttm_resource_manager_init(man, gtt_size >> PAGE_SHIFT); + mgr->size = gtt_size >> PAGE_SHIFT; + ttm_resource_manager_init(man); start = AMDGPU_GTT_MAX_TRANSFER_SIZE * AMDGPU_GTT_NUM_TRANSFER_WINDOWS; size = (adev->gmc.gart_size >> PAGE_SHIFT) - start; drm_mm_init(&mgr->mm, start, size); spin_lock_init(&mgr->lock); - atomic64_set(&mgr->available, gtt_size >> PAGE_SHIFT); + atomic64_set(&mgr->available, mgr->size); ret = device_create_file(adev->dev, &dev_attr_mem_info_gtt_total); if (ret) { @@ -264,7 +261,7 @@ static void amdgpu_gtt_mgr_del(struct ttm_resource_manager *man, uint64_t amdgpu_gtt_mgr_usage(struct ttm_resource_manager *man) { struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man); - s64 result = man->size - atomic64_read(&mgr->available); + s64 result = mgr->size - atomic64_read(&mgr->available); return (result > 0 ? result : 0) * PAGE_SIZE; } @@ -305,8 +302,8 @@ static void amdgpu_gtt_mgr_debug(struct ttm_resource_manager *man, drm_mm_print(&mgr->mm, printer); spin_unlock(&mgr->lock); - drm_printf(printer, "man size:%llu pages, gtt available:%lld pages, usage:%lluMB\n", - man->size, (u64)atomic64_read(&mgr->available), + drm_printf(printer, "man size:%lu pages, gtt available:%lld pages, usage:%lluMB\n", + mgr->size, (u64)atomic64_read(&mgr->available), amdgpu_gtt_mgr_usage(man) >> 20); } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index fff9c013f337..732e4004777e 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -608,7 +608,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file min(adev->gmc.visible_vram_size - atomic64_read(&adev->visible_pin_size), vram_gtt.vram_size); - vram_gtt.gtt_size = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT)->size; + vram_gtt.gtt_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; vram_gtt.gtt_size *= PAGE_SIZE; vram_gtt.gtt_size -= atomic64_read(&adev->gart_pin_size); return copy_to_user(out, &vram_gtt, @@ -620,6 +620,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); struct ttm_resource_manager *gtt_man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); + struct amdgpu_gtt_mgr *gtt_mgr = to_gtt_mgr(gtt_man); memset(&mem, 0, sizeof(mem)); mem.vram.total_heap_size = adev->gmc.real_vram_size; mem.vram.usable_heap_size = adev->gmc.real_vram_size - @@ -640,7 +641,7 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file mem.cpu_accessible_vram.max_allocation = mem.cpu_accessible_vram.usable_heap_size * 3 / 4; - mem.gtt.total_heap_size = gtt_man->size; + mem.gtt.total_heap_size = gtt_mgr->size; mem.gtt.total_heap_size *= PAGE_SIZE; mem.gtt.usable_heap_size = mem.gtt.total_heap_size - atomic64_read(&adev->gart_pin_size); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index 43f4966331dd..33957d829197 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -442,25 +442,24 @@ void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr, static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, unsigned long size, u32 domain) { - struct ttm_resource_manager *man = NULL; - + unsigned long mgr_size = 0; /* * If GTT is part of requested domains the check must succeed to * allow fall back to GTT */ if (domain & AMDGPU_GEM_DOMAIN_GTT) { - man = ttm_manager_type(&adev->mman.bdev, TTM_PL_TT); + mgr_size = to_gtt_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; - if (size < (man->size << PAGE_SHIFT)) + if (size < (mgr_size << PAGE_SHIFT)) return true; else goto fail; } if (domain & AMDGPU_GEM_DOMAIN_VRAM) { - man = ttm_manager_type(&adev->mman.bdev, TTM_PL_VRAM); + mgr_size = to_vram_mgr(ttm_manager_type(&adev->mman.bdev, TTM_PL_TT))->size; - if (size < (man->size << PAGE_SHIFT)) + if (size < (mgr_size << PAGE_SHIFT)) return true; else goto fail; @@ -472,7 +471,7 @@ static bool amdgpu_bo_validate_size(struct amdgpu_device *adev, fail: DRM_DEBUG("BO size %lu > total memory in domain: %llu\n", size, - man->size << PAGE_SHIFT); + mgr_size << PAGE_SHIFT); return false; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c index 28557839f132..ca312ef8c2f8 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c @@ -2045,7 +2045,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable) size = adev->gmc.real_vram_size; else size = adev->gmc.visible_vram_size; - man->size = size >> PAGE_SHIFT; + to_vram_mgr(man)->size = size >> PAGE_SHIFT; adev->mman.buffer_funcs_enabled = enable; } diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h index 4a6d92f27b6e..5636ef2b1707 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h @@ -47,15 +47,27 @@ struct amdgpu_vram_mgr { spinlock_t lock; atomic64_t usage; atomic64_t vis_usage; + unsigned long size; }; +static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) +{ + return container_of(man, struct amdgpu_vram_mgr, manager); +} + struct amdgpu_gtt_mgr { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; atomic64_t available; + unsigned long size; }; +static inline struct amdgpu_gtt_mgr *to_gtt_mgr(struct ttm_resource_manager *man) +{ + return container_of(man, struct amdgpu_gtt_mgr, manager); +} + struct amdgpu_mman { struct ttm_bo_device bdev; bool mem_global_referenced; diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c index 7882efd275d1..d4aa2aa49b4f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c @@ -28,11 +28,6 @@ #include "amdgpu_atomfirmware.h" #include "atom.h" -static inline struct amdgpu_vram_mgr *to_vram_mgr(struct ttm_resource_manager *man) -{ - return container_of(man, struct amdgpu_vram_mgr, manager); -} - static inline struct amdgpu_device *to_amdgpu_device(struct amdgpu_vram_mgr *mgr) { return container_of(mgr, struct amdgpu_device, mman.vram_mgr); @@ -180,11 +175,12 @@ int amdgpu_vram_mgr_init(struct amdgpu_device *adev) man->available_caching = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_WC; man->default_caching = TTM_PL_FLAG_WC; - ttm_resource_manager_init(man, adev->gmc.real_vram_size >> PAGE_SHIFT); + ttm_resource_manager_init(man); man->func = &amdgpu_vram_mgr_func; - drm_mm_init(&mgr->mm, 0, man->size); + mgr->size = adev->gmc.real_vram_size >> PAGE_SHIFT; + drm_mm_init(&mgr->mm, 0, mgr->size); spin_lock_init(&mgr->lock); /* Add the two VRAM-related sysfs files */ @@ -325,7 +321,7 @@ static int amdgpu_vram_mgr_new(struct ttm_resource_manager *man, lpfn = place->lpfn; if (!lpfn) - lpfn = man->size; + lpfn = mgr->size; max_bytes = adev->gmc.mc_vram_size; if (tbo->type != ttm_bo_type_kernel) @@ -600,8 +596,8 @@ static void amdgpu_vram_mgr_debug(struct ttm_resource_manager *man, drm_mm_print(&mgr->mm, printer); spin_unlock(&mgr->lock); - drm_printf(printer, "man size:%llu pages, ram usage:%lluMB, vis usage:%lluMB\n", - man->size, amdgpu_vram_mgr_usage(man) >> 20, + drm_printf(printer, "man size:%lu pages, ram usage:%lluMB, vis usage:%lluMB\n", + mgr->size, amdgpu_vram_mgr_usage(man) >> 20, amdgpu_vram_mgr_vis_usage(man) >> 20); } diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c index e6a30865a00b..93685a376a50 100644 --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c @@ -175,8 +175,7 @@ nouveau_ttm_init_vram(struct nouveau_drm *drm) man->func = &nouveau_vram_manager; man->use_io_reserve_lru = true; - ttm_resource_manager_init(man, - drm->gem.vram_available >> PAGE_SHIFT); + ttm_resource_manager_init(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_VRAM, man); ttm_resource_manager_set_used(man, true); return 0; @@ -237,7 +236,7 @@ nouveau_ttm_init_gtt(struct nouveau_drm *drm) man->available_caching = available_caching; man->default_caching = default_caching; man->use_tt = true; - ttm_resource_manager_init(man, size_pages); + ttm_resource_manager_init(man); ttm_set_driver_manager(&drm->ttm.bdev, TTM_PL_TT, man); ttm_resource_manager_set_used(man, true); return 0; diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 7f5dfe04789e..00258d158cfe 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c @@ -228,7 +228,7 @@ int radeon_gem_info_ioctl(struct drm_device *dev, void *data, man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM); - args->vram_size = (u64)man->size << PAGE_SHIFT; + args->vram_size = (u64)ttm_range_man_size(man) << PAGE_SHIFT; args->vram_visible = rdev->mc.visible_vram_size; args->vram_visible -= rdev->vram_pin_size; args->gart_size = rdev->mc.gtt_size; diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 3355b69b13d1..e41ec62ff944 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -843,9 +843,8 @@ void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size) if (!rdev->mman.initialized) return; - man = ttm_manager_type(&rdev->mman.bdev, TTM_PL_VRAM); /* this just adjusts TTM size idea, which sets lpfn to the correct value */ - man->size = size >> PAGE_SHIFT; + ttm_range_man_adjust_size(man, size >> PAGE_SHIFT); } static vm_fault_t radeon_ttm_fault(struct vm_fault *vmf) diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index ad09329b62d3..cf8176bce4f6 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -82,7 +82,6 @@ void ttm_resource_manager_debug(struct ttm_resource_manager *man, { drm_printf(p, " use_type: %d\n", man->use_type); drm_printf(p, " use_tt: %d\n", man->use_tt); - drm_printf(p, " size: %llu\n", man->size); drm_printf(p, " available_caching: 0x%08X\n", man->available_caching); drm_printf(p, " default_caching: 0x%08X\n", man->default_caching); if (man->func && man->func->debug) @@ -1468,8 +1467,7 @@ int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type) } EXPORT_SYMBOL(ttm_bo_evict_mm); -void ttm_resource_manager_init(struct ttm_resource_manager *man, - unsigned long p_size) +void ttm_resource_manager_init(struct ttm_resource_manager *man) { unsigned i; @@ -1477,7 +1475,6 @@ void ttm_resource_manager_init(struct ttm_resource_manager *man, mutex_init(&man->io_reserve_mutex); spin_lock_init(&man->move_lock); INIT_LIST_HEAD(&man->io_reserve_lru); - man->size = p_size; for (i = 0; i < TTM_MAX_BO_PRIORITY; ++i) INIT_LIST_HEAD(&man->lru[i]); @@ -1590,7 +1587,7 @@ static void ttm_bo_init_sysman(struct ttm_bo_device *bdev) man->available_caching = TTM_PL_MASK_CACHING; man->default_caching = TTM_PL_FLAG_CACHED; - ttm_resource_manager_init(man, 0); + ttm_resource_manager_init(man); ttm_set_driver_manager(bdev, TTM_PL_SYSTEM, man); ttm_resource_manager_set_used(man, true); } diff --git a/drivers/gpu/drm/ttm/ttm_range_manager.c b/drivers/gpu/drm/ttm/ttm_range_manager.c index 274a05ca13d3..0dc4b17cc3dc 100644 --- a/drivers/gpu/drm/ttm/ttm_range_manager.c +++ b/drivers/gpu/drm/ttm/ttm_range_manager.c @@ -47,6 +47,7 @@ struct ttm_range_manager { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; + uint64_t size; }; static inline struct ttm_range_manager *to_range_manager(struct ttm_resource_manager *man) @@ -68,7 +69,7 @@ static int ttm_range_man_get_node(struct ttm_resource_manager *man, lpfn = place->lpfn; if (!lpfn) - lpfn = man->size; + lpfn = rman->size; node = kzalloc(sizeof(*node), GFP_KERNEL); if (!node) @@ -133,8 +134,9 @@ int ttm_range_man_init(struct ttm_bo_device *bdev, man->func = &ttm_range_manager_func; - ttm_resource_manager_init(man, p_size); + ttm_resource_manager_init(man); + rman->size = p_size; drm_mm_init(&rman->mm, 0, p_size); spin_lock_init(&rman->lock); @@ -185,3 +187,18 @@ static const struct ttm_resource_manager_func ttm_range_manager_func = { .put_node = ttm_range_man_put_node, .debug = ttm_range_man_debug }; + +void ttm_range_man_adjust_size(struct ttm_resource_manager *man, + unsigned long size) +{ + struct ttm_range_manager *rman = to_range_manager(man); + rman->size = size; +} +EXPORT_SYMBOL(ttm_range_man_adjust_size); + +unsigned long ttm_range_man_size(struct ttm_resource_manager *man) +{ + struct ttm_range_manager *rman = to_range_manager(man); + return rman->size; +} +EXPORT_SYMBOL(ttm_range_man_size); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c index 3fea7a6c7cfa..a7a2deae2277 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c @@ -116,7 +116,7 @@ int vmw_gmrid_man_init(struct vmw_private *dev_priv, int type) man->default_caching = TTM_PL_FLAG_CACHED; /* TODO: This is most likely not correct */ man->use_tt = true; - ttm_resource_manager_init(man, 0); + ttm_resource_manager_init(man); spin_lock_init(&gman->lock); gman->used_gmr_pages = 0; ida_init(&gman->gmr_ida); diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c index f594e2e6ab7e..74cdee48b191 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_thp.c @@ -19,6 +19,7 @@ struct vmw_thp_manager { struct ttm_resource_manager manager; struct drm_mm mm; spinlock_t lock; + uint64_t size; }; static struct vmw_thp_manager *to_thp_manager(struct ttm_resource_manager *man) @@ -63,7 +64,7 @@ static int vmw_thp_get_node(struct ttm_resource_manager *man, lpfn = place->lpfn; if (!lpfn) - lpfn = man->size; + lpfn = rman->size; mode = DRM_MM_INSERT_BEST; if (place->flags & TTM_PL_FLAG_TOPDOWN) @@ -134,10 +135,10 @@ int vmw_thp_init(struct vmw_private *dev_priv) man->available_caching = TTM_PL_FLAG_CACHED; man->default_caching = TTM_PL_FLAG_CACHED; - ttm_resource_manager_init(man, - dev_priv->vram_size >> PAGE_SHIFT); + ttm_resource_manager_init(man); - drm_mm_init(&rman->mm, 0, man->size); + rman->size = dev_priv->vram_size >> PAGE_SHIFT; + drm_mm_init(&rman->mm, 0, rman->size); spin_lock_init(&rman->lock); ttm_set_driver_manager(&dev_priv->bdev, TTM_PL_VRAM, &rman->manager); diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index 770ad2195875..e4bf93482b59 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h @@ -537,12 +537,10 @@ int ttm_bo_create(struct ttm_bo_device *bdev, unsigned long size, * ttm_resource_manager_init * * @man: memory manager object to init - * @p_size: size managed area in pages. * * Initialise core parts of a manager object. */ -void ttm_resource_manager_init(struct ttm_resource_manager *man, - unsigned long p_size); +void ttm_resource_manager_init(struct ttm_resource_manager *man); /** * ttm_bo_evict_mm diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index eb1c3312e175..c719b4aa3793 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h @@ -116,7 +116,6 @@ struct ttm_resource_manager_func { * managed by this memory type. * @gpu_offset: If used, the GPU offset of the first managed page of * fixed memory or the first managed location in an aperture. - * @size: Size of the managed region. * @available_caching: A mask of available caching types, TTM_PL_FLAG_XX, * as defined in ttm_placement_common.h * @default_caching: The default caching policy used for a buffer object @@ -142,7 +141,6 @@ struct ttm_resource_manager { */ bool use_type; bool use_tt; - uint64_t size; uint32_t available_caching; uint32_t default_caching; const struct ttm_resource_manager_func *func; @@ -883,4 +881,22 @@ int ttm_range_man_fini(struct ttm_bo_device *bdev, void ttm_resource_manager_debug(struct ttm_resource_manager *man, struct drm_printer *p); +/** + * ttm_range_man_adjust_size + * + * @man: manager to adjust size for + * @p_size: new size. + */ +void ttm_range_man_adjust_size(struct ttm_resource_manager *man, + unsigned long p_size); + +/** + * ttm_range_man_size + * + * @man: manager to get size for + * Returns: + * size of range manager. + */ +unsigned long ttm_range_man_size(struct ttm_resource_manager *man); + #endif
From: Dave Airlie <airlied@redhat.com> This is a bit more involved that it looked, the range manager needs accessors adding and amdgpu needs a bit of a refactor. --- drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c | 21 ++++++++----------- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 5 +++-- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 13 ++++++------ drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h | 12 +++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c | 16 ++++++-------- drivers/gpu/drm/nouveau/nouveau_ttm.c | 5 ++--- drivers/gpu/drm/radeon/radeon_gem.c | 2 +- drivers/gpu/drm/radeon/radeon_ttm.c | 3 +-- drivers/gpu/drm/ttm/ttm_bo.c | 7 ++----- drivers/gpu/drm/ttm/ttm_range_manager.c | 21 +++++++++++++++++-- drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 2 +- drivers/gpu/drm/vmwgfx/vmwgfx_thp.c | 9 ++++---- include/drm/ttm/ttm_bo_api.h | 4 +--- include/drm/ttm/ttm_bo_driver.h | 20 ++++++++++++++++-- 15 files changed, 87 insertions(+), 55 deletions(-)