[PATCH 2/3] drm/ttm: move memory accounting into vmwgfx v3
Christian König
christian.koenig at amd.com
Tue Feb 2 15:16:58 UTC 2021
Hi Zack,
can you also give it a quick smoke test?
I'm not sure if I wired up all the sysfs magic correctly inside vmwgfx,
but I currently don't have a setup where I can test this.
Thanks,
Christian.
Am 02.02.21 um 16:14 schrieb Zack Rusin:
> Looks good. There’s probably not much reason to call it ttm_memory anymore as it only deals with ttm_mem_glob, we’ll likely fold it in after you submit. Thanks.
>
> Reviewed-by: Zack Rusin <zackr at vmware.com>
>
> z
>
>> On Feb 2, 2021, at 08:04, Christian König <christian.koenig at amd.com> wrote:
>>
>> Ping?
>>
>> Especially Roland and Zack do you have any objections to this?
>>
>> Regards,
>> Christian.
>>
>> Am 28.01.21 um 14:16 schrieb Christian König:
>>> This is just another feature which is only used by VMWGFX, so move
>>> it into the driver instead.
>>>
>>> I've tried to add the accounting sysfs file to the kobject of the drm
>>> minor, but I'm not 100% sure if this works as expected.
>>>
>>> v2: fix typo in KFD and avoid 64bit divide
>>> v3: fix init order in VMWGFX
>>>
>>> Signed-off-by: Christian König <christian.koenig at amd.com>
>>> ---
>>> .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 16 ++++++---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 8 ++---
>>> drivers/gpu/drm/drm_gem_vram_helper.c | 6 ++--
>>> drivers/gpu/drm/nouveau/nouveau_bo.c | 7 ++--
>>> drivers/gpu/drm/nouveau/nouveau_drv.h | 1 -
>>> drivers/gpu/drm/qxl/qxl_object.c | 4 +--
>>> drivers/gpu/drm/radeon/radeon_object.c | 8 ++---
>>> drivers/gpu/drm/ttm/Makefile | 7 ++--
>>> drivers/gpu/drm/ttm/ttm_bo.c | 33 +------------------
>>> drivers/gpu/drm/ttm/ttm_bo_util.c | 1 -
>>> drivers/gpu/drm/ttm/ttm_device.c | 22 ++++++++++---
>>> drivers/gpu/drm/ttm/ttm_pool.c | 13 +-------
>>> drivers/gpu/drm/vmwgfx/Makefile | 2 +-
>>> drivers/gpu/drm/{ttm => vmwgfx}/ttm_memory.c | 19 ++++-------
>>> .../gpu/drm/vmwgfx}/ttm_memory.h | 5 +--
>>> drivers/gpu/drm/vmwgfx/ttm_object.h | 3 +-
>>> drivers/gpu/drm/vmwgfx/vmwgfx_bo.c | 22 ++++++++++---
>>> drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 5 +++
>>> drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c | 28 +++++++++++++++-
>>> include/drm/ttm/ttm_bo_api.h | 13 ++------
>>> include/drm/ttm/ttm_bo_driver.h | 1 -
>>> include/drm/ttm/ttm_tt.h | 1 +
>>> 22 files changed, 110 insertions(+), 115 deletions(-)
>>> rename drivers/gpu/drm/{ttm => vmwgfx}/ttm_memory.c (97%)
>>> rename {include/drm/ttm => drivers/gpu/drm/vmwgfx}/ttm_memory.h (97%)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> index 0849b68e784f..e440af37dde8 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
>>> @@ -118,6 +118,16 @@ void amdgpu_amdkfd_gpuvm_init_mem_limits(void)
>>> */
>>> #define ESTIMATE_PT_SIZE(mem_size) ((mem_size) >> 14)
>>> +static size_t amdgpu_amdkfd_acc_size(uint64_t size)
>>> +{
>>> + size >>= PAGE_SHIFT;
>>> + size *= sizeof(dma_addr_t) + sizeof(void *);
>>> +
>>> + return __roundup_pow_of_two(sizeof(struct amdgpu_bo)) +
>>> + __roundup_pow_of_two(sizeof(struct ttm_tt)) +
>>> + PAGE_ALIGN(size);
>>> +}
>>> +
>>> static int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
>>> uint64_t size, u32 domain, bool sg)
>>> {
>>> @@ -126,8 +136,7 @@ static int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
>>> size_t acc_size, system_mem_needed, ttm_mem_needed, vram_needed;
>>> int ret = 0;
>>> - acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size,
>>> - sizeof(struct amdgpu_bo));
>>> + acc_size = amdgpu_amdkfd_acc_size(size);
>>> vram_needed = 0;
>>> if (domain == AMDGPU_GEM_DOMAIN_GTT) {
>>> @@ -174,8 +183,7 @@ static void unreserve_mem_limit(struct amdgpu_device *adev,
>>> {
>>> size_t acc_size;
>>> - acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size,
>>> - sizeof(struct amdgpu_bo));
>>> + acc_size = amdgpu_amdkfd_acc_size(size);
>>> spin_lock(&kfd_mem_limit.mem_limit_lock);
>>> if (domain == AMDGPU_GEM_DOMAIN_GTT) {
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> index 6cc9919b12cc..599c9a132eb6 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
>>> @@ -523,7 +523,6 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
>>> };
>>> struct amdgpu_bo *bo;
>>> unsigned long page_align, size = bp->size;
>>> - size_t acc_size;
>>> int r;
>>> /* Note that GDS/GWS/OA allocates 1 page per byte/resource. */
>>> @@ -546,9 +545,6 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
>>> *bo_ptr = NULL;
>>> - acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size,
>>> - sizeof(struct amdgpu_bo));
>>> -
>>> bo = kzalloc(sizeof(struct amdgpu_bo), GFP_KERNEL);
>>> if (bo == NULL)
>>> return -ENOMEM;
>>> @@ -577,8 +573,8 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
>>> bo->tbo.priority = 1;
>>> r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
>>> - &bo->placement, page_align, &ctx, acc_size,
>>> - NULL, bp->resv, &amdgpu_bo_destroy);
>>> + &bo->placement, page_align, &ctx, NULL,
>>> + bp->resv, &amdgpu_bo_destroy);
>>> if (unlikely(r != 0))
>>> return r;
>>> diff --git a/drivers/gpu/drm/drm_gem_vram_helper.c b/drivers/gpu/drm/drm_gem_vram_helper.c
>>> index 0b13c8507688..a0992f0b8afd 100644
>>> --- a/drivers/gpu/drm/drm_gem_vram_helper.c
>>> +++ b/drivers/gpu/drm/drm_gem_vram_helper.c
>>> @@ -189,7 +189,6 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
>>> struct drm_vram_mm *vmm = dev->vram_mm;
>>> struct ttm_device *bdev;
>>> int ret;
>>> - size_t acc_size;
>>> if (WARN_ONCE(!vmm, "VRAM MM not initialized"))
>>> return ERR_PTR(-EINVAL);
>>> @@ -216,7 +215,6 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
>>> }
>>> bdev = &vmm->bdev;
>>> - acc_size = ttm_bo_dma_acc_size(bdev, size, sizeof(*gbo));
>>> gbo->bo.bdev = bdev;
>>> drm_gem_vram_placement(gbo, DRM_GEM_VRAM_PL_FLAG_SYSTEM);
>>> @@ -226,8 +224,8 @@ struct drm_gem_vram_object *drm_gem_vram_create(struct drm_device *dev,
>>> * to release gbo->bo.base and kfree gbo.
>>> */
>>> ret = ttm_bo_init(bdev, &gbo->bo, size, ttm_bo_type_device,
>>> - &gbo->placement, pg_align, false, acc_size,
>>> - NULL, NULL, ttm_buffer_object_destroy);
>>> + &gbo->placement, pg_align, false, NULL, NULL,
>>> + ttm_buffer_object_destroy);
>>> if (ret)
>>> return ERR_PTR(ret);
>>> diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
>>> index c177940d6e2c..ca2a8ae1938e 100644
>>> --- a/drivers/gpu/drm/nouveau/nouveau_bo.c
>>> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
>>> @@ -300,18 +300,15 @@ nouveau_bo_init(struct nouveau_bo *nvbo, u64 size, int align, u32 domain,
>>> struct sg_table *sg, struct dma_resv *robj)
>>> {
>>> int type = sg ? ttm_bo_type_sg : ttm_bo_type_device;
>>> - size_t acc_size;
>>> int ret;
>>> - acc_size = ttm_bo_dma_acc_size(nvbo->bo.bdev, size, sizeof(*nvbo));
>>> -
>>> nvbo->bo.mem.num_pages = size >> PAGE_SHIFT;
>>> nouveau_bo_placement_set(nvbo, domain, 0);
>>> INIT_LIST_HEAD(&nvbo->io_reserve_lru);
>>> ret = ttm_bo_init(nvbo->bo.bdev, &nvbo->bo, size, type,
>>> - &nvbo->placement, align >> PAGE_SHIFT, false,
>>> - acc_size, sg, robj, nouveau_bo_del_ttm);
>>> + &nvbo->placement, align >> PAGE_SHIFT, false, sg,
>>> + robj, nouveau_bo_del_ttm);
>>> if (ret) {
>>> /* ttm will call nouveau_bo_del_ttm if it fails.. */
>>> return ret;
>>> diff --git a/drivers/gpu/drm/nouveau/nouveau_drv.h b/drivers/gpu/drm/nouveau/nouveau_drv.h
>>> index edf9d1ee9d58..a491c2c1c56e 100644
>>> --- a/drivers/gpu/drm/nouveau/nouveau_drv.h
>>> +++ b/drivers/gpu/drm/nouveau/nouveau_drv.h
>>> @@ -54,7 +54,6 @@
>>> #include <drm/ttm/ttm_bo_api.h>
>>> #include <drm/ttm/ttm_bo_driver.h>
>>> #include <drm/ttm/ttm_placement.h>
>>> -#include <drm/ttm/ttm_memory.h>
>>> #include <drm/drm_audio_component.h>
>>> diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c
>>> index ceebc5881f68..705b51535492 100644
>>> --- a/drivers/gpu/drm/qxl/qxl_object.c
>>> +++ b/drivers/gpu/drm/qxl/qxl_object.c
>>> @@ -138,8 +138,8 @@ int qxl_bo_create(struct qxl_device *qdev,
>>> qxl_ttm_placement_from_domain(bo, domain);
>>> r = ttm_bo_init_reserved(&qdev->mman.bdev, &bo->tbo, size, type,
>>> - &bo->placement, 0, &ctx, size,
>>> - NULL, NULL, &qxl_ttm_bo_destroy);
>>> + &bo->placement, 0, &ctx, NULL, NULL,
>>> + &qxl_ttm_bo_destroy);
>>> if (unlikely(r != 0)) {
>>> if (r != -ERESTARTSYS)
>>> dev_err(qdev->ddev.dev,
>>> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
>>> index 6a336284466f..804f7a427be7 100644
>>> --- a/drivers/gpu/drm/radeon/radeon_object.c
>>> +++ b/drivers/gpu/drm/radeon/radeon_object.c
>>> @@ -159,7 +159,6 @@ int radeon_bo_create(struct radeon_device *rdev,
>>> struct radeon_bo *bo;
>>> enum ttm_bo_type type;
>>> unsigned long page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
>>> - size_t acc_size;
>>> int r;
>>> size = ALIGN(size, PAGE_SIZE);
>>> @@ -173,9 +172,6 @@ int radeon_bo_create(struct radeon_device *rdev,
>>> }
>>> *bo_ptr = NULL;
>>> - acc_size = ttm_bo_dma_acc_size(&rdev->mman.bdev, size,
>>> - sizeof(struct radeon_bo));
>>> -
>>> bo = kzalloc(sizeof(struct radeon_bo), GFP_KERNEL);
>>> if (bo == NULL)
>>> return -ENOMEM;
>>> @@ -230,8 +226,8 @@ int radeon_bo_create(struct radeon_device *rdev,
>>> /* Kernel allocation are uninterruptible */
>>> down_read(&rdev->pm.mclk_lock);
>>> r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
>>> - &bo->placement, page_align, !kernel, acc_size,
>>> - sg, resv, &radeon_ttm_bo_destroy);
>>> + &bo->placement, page_align, !kernel, sg, resv,
>>> + &radeon_ttm_bo_destroy);
>>> up_read(&rdev->pm.mclk_lock);
>>> if (unlikely(r != 0)) {
>>> return r;
>>> diff --git a/drivers/gpu/drm/ttm/Makefile b/drivers/gpu/drm/ttm/Makefile
>>> index 8e6437eadabe..40e5e9da7953 100644
>>> --- a/drivers/gpu/drm/ttm/Makefile
>>> +++ b/drivers/gpu/drm/ttm/Makefile
>>> @@ -2,10 +2,9 @@
>>> #
>>> # Makefile for the drm device driver. This driver provides support for the
>>> -ttm-y := ttm_memory.o ttm_tt.o ttm_bo.o \
>>> - ttm_bo_util.o ttm_bo_vm.o ttm_module.o \
>>> - ttm_execbuf_util.o ttm_range_manager.o \
>>> - ttm_resource.o ttm_pool.o ttm_device.o
>>> +ttm-y := ttm_tt.o ttm_bo.o ttm_bo_util.o ttm_bo_vm.o ttm_module.o \
>>> + ttm_execbuf_util.o ttm_range_manager.o ttm_resource.o ttm_pool.o \
>>> + ttm_device.o
>>> ttm-$(CONFIG_AGP) += ttm_agp_backend.o
>>> obj-$(CONFIG_DRM_TTM) += ttm.o
>>> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
>>> index 643befc1a6f2..e38102282fd5 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_bo.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
>>> @@ -425,7 +425,6 @@ static void ttm_bo_release(struct kref *kref)
>>> struct ttm_buffer_object *bo =
>>> container_of(kref, struct ttm_buffer_object, kref);
>>> struct ttm_device *bdev = bo->bdev;
>>> - size_t acc_size = bo->acc_size;
>>> int ret;
>>> if (!bo->deleted) {
>>> @@ -485,7 +484,6 @@ static void ttm_bo_release(struct kref *kref)
>>> if (!ttm_bo_uses_embedded_gem_object(bo))
>>> dma_resv_fini(&bo->base._resv);
>>> bo->destroy(bo);
>>> - ttm_mem_global_free(&ttm_mem_glob, acc_size);
>>> }
>>> void ttm_bo_put(struct ttm_buffer_object *bo)
>>> @@ -1046,25 +1044,13 @@ int ttm_bo_init_reserved(struct ttm_device *bdev,
>>> struct ttm_placement *placement,
>>> uint32_t page_alignment,
>>> struct ttm_operation_ctx *ctx,
>>> - size_t acc_size,
>>> struct sg_table *sg,
>>> struct dma_resv *resv,
>>> void (*destroy) (struct ttm_buffer_object *))
>>> {
>>> - struct ttm_mem_global *mem_glob = &ttm_mem_glob;
>>> bool locked;
>>> int ret = 0;
>>> - ret = ttm_mem_global_alloc(mem_glob, acc_size, ctx);
>>> - if (ret) {
>>> - pr_err("Out of kernel memory\n");
>>> - if (destroy)
>>> - (*destroy)(bo);
>>> - else
>>> - kfree(bo);
>>> - return -ENOMEM;
>>> - }
>>> -
>>> bo->destroy = destroy ? destroy : ttm_bo_default_destroy;
>>> kref_init(&bo->kref);
>>> @@ -1081,7 +1067,6 @@ int ttm_bo_init_reserved(struct ttm_device *bdev,
>>> bo->mem.bus.addr = NULL;
>>> bo->moving = NULL;
>>> bo->mem.placement = 0;
>>> - bo->acc_size = acc_size;
>>> bo->pin_count = 0;
>>> bo->sg = sg;
>>> if (resv) {
>>> @@ -1142,7 +1127,6 @@ int ttm_bo_init(struct ttm_device *bdev,
>>> struct ttm_placement *placement,
>>> uint32_t page_alignment,
>>> bool interruptible,
>>> - size_t acc_size,
>>> struct sg_table *sg,
>>> struct dma_resv *resv,
>>> void (*destroy) (struct ttm_buffer_object *))
>>> @@ -1151,8 +1135,7 @@ int ttm_bo_init(struct ttm_device *bdev,
>>> int ret;
>>> ret = ttm_bo_init_reserved(bdev, bo, size, type, placement,
>>> - page_alignment, &ctx, acc_size,
>>> - sg, resv, destroy);
>>> + page_alignment, &ctx, sg, resv, destroy);
>>> if (ret)
>>> return ret;
>>> @@ -1163,20 +1146,6 @@ int ttm_bo_init(struct ttm_device *bdev,
>>> }
>>> EXPORT_SYMBOL(ttm_bo_init);
>>> -size_t ttm_bo_dma_acc_size(struct ttm_device *bdev,
>>> - unsigned long bo_size,
>>> - unsigned struct_size)
>>> -{
>>> - unsigned npages = (PAGE_ALIGN(bo_size)) >> PAGE_SHIFT;
>>> - size_t size = 0;
>>> -
>>> - size += ttm_round_pot(struct_size);
>>> - size += ttm_round_pot(npages * (2*sizeof(void *) + sizeof(dma_addr_t)));
>>> - size += ttm_round_pot(sizeof(struct ttm_tt));
>>> - return size;
>>> -}
>>> -EXPORT_SYMBOL(ttm_bo_dma_acc_size);
>>> -
>>> /*
>>> * buffer object vm functions.
>>> */
>>> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c
>>> index db0f2661d504..031e5819fec4 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
>>> @@ -309,7 +309,6 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
>>> kref_init(&fbo->base.kref);
>>> fbo->base.destroy = &ttm_transfered_destroy;
>>> - fbo->base.acc_size = 0;
>>> fbo->base.pin_count = 0;
>>> if (bo->type != ttm_bo_type_sg)
>>> fbo->base.base.resv = &fbo->base.base._resv;
>>> diff --git a/drivers/gpu/drm/ttm/ttm_device.c b/drivers/gpu/drm/ttm/ttm_device.c
>>> index ac0903c9e60a..6bde344e5da7 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_device.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_device.c
>>> @@ -27,9 +27,12 @@
>>> #define pr_fmt(fmt) "[TTM DEVICE] " fmt
>>> +#include <linux/mm.h>
>>> +
>>> #include <drm/ttm/ttm_device.h>
>>> -#include <drm/ttm/ttm_memory.h>
>>> +#include <drm/ttm/ttm_tt.h>
>>> #include <drm/ttm/ttm_placement.h>
>>> +#include <drm/ttm/ttm_bo_api.h>
>>> #include "ttm_module.h"
>>> @@ -49,9 +52,11 @@ static void ttm_global_release(void)
>>> if (--ttm_glob_use_count > 0)
>>> goto out;
>>> + ttm_pool_mgr_fini();
>>> + ttm_tt_mgr_fini();
>>> +
>>> kobject_del(&glob->kobj);
>>> kobject_put(&glob->kobj);
>>> - ttm_mem_global_release(&ttm_mem_glob);
>>> __free_page(glob->dummy_read_page);
>>> memset(glob, 0, sizeof(*glob));
>>> out:
>>> @@ -61,6 +66,8 @@ static void ttm_global_release(void)
>>> static int ttm_global_init(void)
>>> {
>>> struct ttm_global *glob = &ttm_glob;
>>> + unsigned long num_pages;
>>> + struct sysinfo si;
>>> int ret = 0;
>>> unsigned i;
>>> @@ -68,9 +75,14 @@ static int ttm_global_init(void)
>>> if (++ttm_glob_use_count > 1)
>>> goto out;
>>> - ret = ttm_mem_global_init(&ttm_mem_glob);
>>> - if (ret)
>>> - goto out;
>>> + si_meminfo(&si);
>>> +
>>> + /* Limit the number of pages in the pool to about 50% of the total
>>> + * system memory.
>>> + */
>>> + num_pages = ((u64)si.totalram * si.mem_unit) >> PAGE_SHIFT;
>>> + ttm_pool_mgr_init(num_pages * 50 / 100);
>>> + ttm_tt_mgr_init();
>>> spin_lock_init(&glob->lru_lock);
>>> glob->dummy_read_page = alloc_page(__GFP_ZERO | GFP_DMA32);
>>> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c b/drivers/gpu/drm/ttm/ttm_pool.c
>>> index e0617717113f..6b0f957d63d5 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_pool.c
>>> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
>>> @@ -404,16 +404,10 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
>>> caching = pages + (1 << order);
>>> }
>>> - r = ttm_mem_global_alloc_page(&ttm_mem_glob, p,
>>> - (1 << order) * PAGE_SIZE,
>>> - ctx);
>>> - if (r)
>>> - goto error_free_page;
>>> -
>>> if (dma_addr) {
>>> r = ttm_pool_map(pool, order, p, &dma_addr);
>>> if (r)
>>> - goto error_global_free;
>>> + goto error_free_page;
>>> }
>>> num_pages -= 1 << order;
>>> @@ -427,9 +421,6 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
>>> return 0;
>>> -error_global_free:
>>> - ttm_mem_global_free_page(&ttm_mem_glob, p, (1 << order) * PAGE_SIZE);
>>> -
>>> error_free_page:
>>> ttm_pool_free_page(pool, tt->caching, order, p);
>>> @@ -464,8 +455,6 @@ void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt)
>>> order = ttm_pool_page_order(pool, p);
>>> num_pages = 1ULL << order;
>>> - ttm_mem_global_free_page(&ttm_mem_glob, p,
>>> - num_pages * PAGE_SIZE);
>>> if (tt->dma_address)
>>> ttm_pool_unmap(pool, tt->dma_address[i], num_pages);
>>> diff --git a/drivers/gpu/drm/vmwgfx/Makefile b/drivers/gpu/drm/vmwgfx/Makefile
>>> index cc4cdca7176e..8c02fa5852e7 100644
>>> --- a/drivers/gpu/drm/vmwgfx/Makefile
>>> +++ b/drivers/gpu/drm/vmwgfx/Makefile
>>> @@ -9,7 +9,7 @@ vmwgfx-y := vmwgfx_execbuf.o vmwgfx_gmr.o vmwgfx_kms.o vmwgfx_drv.o \
>>> vmwgfx_cotable.o vmwgfx_so.o vmwgfx_binding.o vmwgfx_msg.o \
>>> vmwgfx_simple_resource.o vmwgfx_va.o vmwgfx_blit.o \
>>> vmwgfx_validation.o vmwgfx_page_dirty.o vmwgfx_streamoutput.o \
>>> - ttm_object.o ttm_lock.o
>>> + ttm_object.o ttm_lock.o ttm_memory.o
>>> vmwgfx-$(CONFIG_TRANSPARENT_HUGEPAGE) += vmwgfx_thp.o
>>> obj-$(CONFIG_DRM_VMWGFX) := vmwgfx.o
>>> diff --git a/drivers/gpu/drm/ttm/ttm_memory.c b/drivers/gpu/drm/vmwgfx/ttm_memory.c
>>> similarity index 97%
>>> rename from drivers/gpu/drm/ttm/ttm_memory.c
>>> rename to drivers/gpu/drm/vmwgfx/ttm_memory.c
>>> index 634a85c2dc4c..1306d9e0f095 100644
>>> --- a/drivers/gpu/drm/ttm/ttm_memory.c
>>> +++ b/drivers/gpu/drm/vmwgfx/ttm_memory.c
>>> @@ -28,7 +28,6 @@
>>> #define pr_fmt(fmt) "[TTM] " fmt
>>> -#include <drm/ttm/ttm_memory.h>
>>> #include <linux/spinlock.h>
>>> #include <linux/sched.h>
>>> #include <linux/wait.h>
>>> @@ -36,10 +35,11 @@
>>> #include <linux/module.h>
>>> #include <linux/slab.h>
>>> #include <linux/swap.h>
>>> -#include <drm/ttm/ttm_pool.h>
>>> -#include <drm/ttm/ttm_tt.h>
>>> -#include "ttm_module.h"
>>> +#include <drm/drm_device.h>
>>> +#include <drm/drm_file.h>
>>> +
>>> +#include "ttm_memory.h"
>>> #define TTM_MEMORY_ALLOC_RETRIES 4
>>> @@ -414,7 +414,7 @@ static int ttm_mem_init_dma32_zone(struct ttm_mem_global *glob,
>>> }
>>> #endif
>>> -int ttm_mem_global_init(struct ttm_mem_global *glob)
>>> +int ttm_mem_global_init(struct ttm_mem_global *glob, struct drm_device *dev)
>>> {
>>> struct sysinfo si;
>>> int ret;
>>> @@ -425,7 +425,8 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
>>> glob->swap_queue = create_singlethread_workqueue("ttm_swap");
>>> INIT_WORK(&glob->work, ttm_shrink_work);
>>> ret = kobject_init_and_add(
>>> - &glob->kobj, &ttm_mem_glob_kobj_type, ttm_get_kobj(), "memory_accounting");
>>> + &glob->kobj, &ttm_mem_glob_kobj_type, &dev->primary->kdev->kobj,
>>> + "memory_accounting");
>>> if (unlikely(ret != 0)) {
>>> kobject_put(&glob->kobj);
>>> return ret;
>>> @@ -453,8 +454,6 @@ int ttm_mem_global_init(struct ttm_mem_global *glob)
>>> pr_info("Zone %7s: Available graphics memory: %llu KiB\n",
>>> zone->name, (unsigned long long)zone->max_mem >> 10);
>>> }
>>> - ttm_pool_mgr_init(glob->zone_kernel->max_mem/(2*PAGE_SIZE));
>>> - ttm_tt_mgr_init();
>>> return 0;
>>> out_no_zone:
>>> ttm_mem_global_release(glob);
>>> @@ -466,10 +465,6 @@ void ttm_mem_global_release(struct ttm_mem_global *glob)
>>> struct ttm_mem_zone *zone;
>>> unsigned int i;
>>> - /* let the page allocator first stop the shrink work. */
>>> - ttm_pool_mgr_fini();
>>> - ttm_tt_mgr_fini();
>>> -
>>> flush_workqueue(glob->swap_queue);
>>> destroy_workqueue(glob->swap_queue);
>>> glob->swap_queue = NULL;
>>> diff --git a/include/drm/ttm/ttm_memory.h b/drivers/gpu/drm/vmwgfx/ttm_memory.h
>>> similarity index 97%
>>> rename from include/drm/ttm/ttm_memory.h
>>> rename to drivers/gpu/drm/vmwgfx/ttm_memory.h
>>> index c1f167881e33..850ee6c867da 100644
>>> --- a/include/drm/ttm/ttm_memory.h
>>> +++ b/drivers/gpu/drm/vmwgfx/ttm_memory.h
>>> @@ -35,7 +35,8 @@
>>> #include <linux/errno.h>
>>> #include <linux/kobject.h>
>>> #include <linux/mm.h>
>>> -#include "ttm_bo_api.h"
>>> +
>>> +#include <drm/ttm/ttm_bo_api.h>
>>> /**
>>> * struct ttm_mem_global - Global memory accounting structure.
>>> @@ -79,7 +80,7 @@ extern struct ttm_mem_global {
>>> #endif
>>> } ttm_mem_glob;
>>> -int ttm_mem_global_init(struct ttm_mem_global *glob);
>>> +int ttm_mem_global_init(struct ttm_mem_global *glob, struct drm_device *dev);
>>> void ttm_mem_global_release(struct ttm_mem_global *glob);
>>> int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory,
>>> struct ttm_operation_ctx *ctx);
>>> diff --git a/drivers/gpu/drm/vmwgfx/ttm_object.h b/drivers/gpu/drm/vmwgfx/ttm_object.h
>>> index ede26df87c93..49b064f0cb19 100644
>>> --- a/drivers/gpu/drm/vmwgfx/ttm_object.h
>>> +++ b/drivers/gpu/drm/vmwgfx/ttm_object.h
>>> @@ -43,7 +43,8 @@
>>> #include <linux/rcupdate.h>
>>> #include <drm/drm_hashtab.h>
>>> -#include <drm/ttm/ttm_memory.h>
>>> +
>>> +#include "ttm_memory.h"
>>> /**
>>> * enum ttm_ref_type
>>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
>>> index 6b3bfd8c678a..50e529a01677 100644
>>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
>>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_bo.c
>>> @@ -507,11 +507,16 @@ int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size,
>>> acc_size = ttm_round_pot(sizeof(*bo));
>>> acc_size += ttm_round_pot(npages * sizeof(void *));
>>> acc_size += ttm_round_pot(sizeof(struct ttm_tt));
>>> +
>>> + ret = ttm_mem_global_alloc(&ttm_mem_glob, acc_size, &ctx);
>>> + if (unlikely(ret))
>>> + goto error_free;
>>> +
>>> ret = ttm_bo_init_reserved(&dev_priv->bdev, bo, size,
>>> ttm_bo_type_device, placement, 0,
>>> - &ctx, acc_size, NULL, NULL, NULL);
>>> + &ctx, NULL, NULL, NULL);
>>> if (unlikely(ret))
>>> - goto error_free;
>>> + goto error_account;
>>> ttm_bo_pin(bo);
>>> ttm_bo_unreserve(bo);
>>> @@ -519,6 +524,9 @@ int vmw_bo_create_kernel(struct vmw_private *dev_priv, unsigned long size,
>>> return 0;
>>> +error_account:
>>> + ttm_mem_global_free(&ttm_mem_glob, acc_size);
>>> +
>>> error_free:
>>> kfree(bo);
>>> return ret;
>>> @@ -558,11 +566,17 @@ int vmw_bo_init(struct vmw_private *dev_priv,
>>> vmw_bo->base.priority = 3;
>>> vmw_bo->res_tree = RB_ROOT;
>>> + ret = ttm_mem_global_alloc(&ttm_mem_glob, acc_size, &ctx);
>>> + if (unlikely(ret))
>>> + return ret;
>>> +
>>> ret = ttm_bo_init_reserved(bdev, &vmw_bo->base, size,
>>> ttm_bo_type_device, placement,
>>> - 0, &ctx, acc_size, NULL, NULL, bo_free);
>>> - if (unlikely(ret))
>>> + 0, &ctx, NULL, NULL, bo_free);
>>> + if (unlikely(ret)) {
>>> + ttm_mem_global_free(&ttm_mem_glob, acc_size);
>>> return ret;
>>> + }
>>> if (pin)
>>> ttm_bo_pin(&vmw_bo->base);
>>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
>>> index 710ba5169a74..6c0ca1011629 100644
>>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
>>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
>>> @@ -1268,6 +1268,7 @@ static void vmw_remove(struct pci_dev *pdev)
>>> {
>>> struct drm_device *dev = pci_get_drvdata(pdev);
>>> + ttm_mem_global_release(&ttm_mem_glob);
>>> drm_dev_unregister(dev);
>>> vmw_driver_unload(dev);
>>> }
>>> @@ -1518,6 +1519,10 @@ static int vmw_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>>> pci_set_drvdata(pdev, &vmw->drm);
>>> + ret = ttm_mem_global_init(&ttm_mem_glob, &vmw->drm);
>>> + if (ret)
>>> + return ret;
>>> +
>>> ret = vmw_driver_load(vmw, ent->device);
>>> if (ret)
>>> return ret;
>>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
>>> index d1bfa59579f1..63f10c865061 100644
>>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
>>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
>>> @@ -576,11 +576,31 @@ static void vmw_ttm_destroy(struct ttm_device *bdev, struct ttm_tt *ttm)
>>> static int vmw_ttm_populate(struct ttm_device *bdev,
>>> struct ttm_tt *ttm, struct ttm_operation_ctx *ctx)
>>> {
>>> + unsigned int i;
>>> + int ret;
>>> +
>>> /* TODO: maybe completely drop this ? */
>>> if (ttm_tt_is_populated(ttm))
>>> return 0;
>>> - return ttm_pool_alloc(&bdev->pool, ttm, ctx);
>>> + ret = ttm_pool_alloc(&bdev->pool, ttm, ctx);
>>> + if (ret)
>>> + return ret;
>>> +
>>> + for (i = 0; i < ttm->num_pages; ++i) {
>>> + ret = ttm_mem_global_alloc_page(&ttm_mem_glob, ttm->pages[i],
>>> + PAGE_SIZE, ctx);
>>> + if (ret)
>>> + goto error;
>>> + }
>>> + return 0;
>>> +
>>> +error:
>>> + while (i--)
>>> + ttm_mem_global_free_page(&ttm_mem_glob, ttm->pages[i],
>>> + PAGE_SIZE);
>>> + ttm_pool_free(&bdev->pool, ttm);
>>> + return ret;
>>> }
>>> static void vmw_ttm_unpopulate(struct ttm_device *bdev,
>>> @@ -588,6 +608,7 @@ static void vmw_ttm_unpopulate(struct ttm_device *bdev,
>>> {
>>> struct vmw_ttm_tt *vmw_tt = container_of(ttm, struct vmw_ttm_tt,
>>> dma_ttm);
>>> + unsigned int i;
>>> if (vmw_tt->mob) {
>>> vmw_mob_destroy(vmw_tt->mob);
>>> @@ -595,6 +616,11 @@ static void vmw_ttm_unpopulate(struct ttm_device *bdev,
>>> }
>>> vmw_ttm_unmap_dma(vmw_tt);
>>> +
>>> + for (i = 0; i < ttm->num_pages; ++i)
>>> + ttm_mem_global_free_page(&ttm_mem_glob, ttm->pages[i],
>>> + PAGE_SIZE);
>>> +
>>> ttm_pool_free(&bdev->pool, ttm);
>>> }
>>> diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
>>> index 1297a8fb7ccb..4fb523dfab32 100644
>>> --- a/include/drm/ttm/ttm_bo_api.h
>>> +++ b/include/drm/ttm/ttm_bo_api.h
>>> @@ -88,7 +88,6 @@ struct ttm_tt;
>>> * @type: The bo type.
>>> * @destroy: Destruction function. If NULL, kfree is used.
>>> * @num_pages: Actual number of pages.
>>> - * @acc_size: Accounted size for this object.
>>> * @kref: Reference count of this buffer object. When this refcount reaches
>>> * zero, the object is destroyed or put on the delayed delete list.
>>> * @mem: structure describing current placement.
>>> @@ -125,7 +124,6 @@ struct ttm_buffer_object {
>>> struct ttm_device *bdev;
>>> enum ttm_bo_type type;
>>> void (*destroy) (struct ttm_buffer_object *);
>>> - size_t acc_size;
>>> /**
>>> * Members not needing protection.
>>> @@ -357,10 +355,6 @@ void ttm_bo_unlock_delayed_workqueue(struct ttm_device *bdev, int resched);
>>> bool ttm_bo_eviction_valuable(struct ttm_buffer_object *bo,
>>> const struct ttm_place *place);
>>> -size_t ttm_bo_dma_acc_size(struct ttm_device *bdev,
>>> - unsigned long bo_size,
>>> - unsigned struct_size);
>>> -
>>> /**
>>> * ttm_bo_init_reserved
>>> *
>>> @@ -371,7 +365,6 @@ size_t ttm_bo_dma_acc_size(struct ttm_device *bdev,
>>> * @flags: Initial placement flags.
>>> * @page_alignment: Data alignment in pages.
>>> * @ctx: TTM operation context for memory allocation.
>>> - * @acc_size: Accounted size for this object.
>>> * @resv: Pointer to a dma_resv, or NULL to let ttm allocate one.
>>> * @destroy: Destroy function. Use NULL for kfree().
>>> *
>>> @@ -402,8 +395,7 @@ int ttm_bo_init_reserved(struct ttm_device *bdev,
>>> struct ttm_placement *placement,
>>> uint32_t page_alignment,
>>> struct ttm_operation_ctx *ctx,
>>> - size_t acc_size, struct sg_table *sg,
>>> - struct dma_resv *resv,
>>> + struct sg_table *sg, struct dma_resv *resv,
>>> void (*destroy) (struct ttm_buffer_object *));
>>> /**
>>> @@ -421,7 +413,6 @@ int ttm_bo_init_reserved(struct ttm_device *bdev,
>>> * holds a pointer to a persistent shmem object. Typically, this would
>>> * point to the shmem object backing a GEM object if TTM is used to back a
>>> * GEM user interface.
>>> - * @acc_size: Accounted size for this object.
>>> * @resv: Pointer to a dma_resv, or NULL to let ttm allocate one.
>>> * @destroy: Destroy function. Use NULL for kfree().
>>> *
>>> @@ -446,7 +437,7 @@ int ttm_bo_init_reserved(struct ttm_device *bdev,
>>> int ttm_bo_init(struct ttm_device *bdev, struct ttm_buffer_object *bo,
>>> size_t size, enum ttm_bo_type type,
>>> struct ttm_placement *placement,
>>> - uint32_t page_alignment, bool interrubtible, size_t acc_size,
>>> + uint32_t page_alignment, bool interrubtible,
>>> struct sg_table *sg, struct dma_resv *resv,
>>> void (*destroy) (struct ttm_buffer_object *));
>>> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
>>> index 1c9bf993e252..8959c0075cfd 100644
>>> --- a/include/drm/ttm/ttm_bo_driver.h
>>> +++ b/include/drm/ttm/ttm_bo_driver.h
>>> @@ -40,7 +40,6 @@
>>> #include <drm/ttm/ttm_device.h>
>>> #include "ttm_bo_api.h"
>>> -#include "ttm_memory.h"
>>> #include "ttm_placement.h"
>>> #include "ttm_tt.h"
>>> #include "ttm_pool.h"
>>> diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
>>> index cce57fb49e2c..069f8130241a 100644
>>> --- a/include/drm/ttm/ttm_tt.h
>>> +++ b/include/drm/ttm/ttm_tt.h
>>> @@ -30,6 +30,7 @@
>>> #include <linux/types.h>
>>> #include <drm/ttm/ttm_caching.h>
>>> +struct ttm_bo_device;
>>> struct ttm_tt;
>>> struct ttm_resource;
>>> struct ttm_buffer_object;
More information about the dri-devel
mailing list