[Linux-graphics-maintainer] [PATCH 2/3] drm/ttm: move memory accounting into vmwgfx v3

Daniel Vetter daniel at ffwll.ch
Mon Feb 8 13:39:54 UTC 2021


On Mon, Feb 8, 2021 at 2:35 PM Christian König <christian.koenig at amd.com> wrote:
>
> Hi Zack,
>
> ok we figured out how to do this correctly.
>
> Basically using the pdev->kobj instead of the drm->primary->kdev->kobj
> pointer worked quite well.

Note drm_device->pdev is gone, so make sure everything still compiles.
You need drm_device->dev->kobj now (they've always pointed at the same
object anyway, just different casts for historical reasons).
-Daniel

> I've just send the latest patches to the mailing list. If you don't have
> any objections I will commit that tomorrow with your and Daniels rb.
>
> Thanks,
> Christian.
>
> Am 03.02.21 um 09:20 schrieb Christian König:
> > Hi Zack,
> >
> > thanks I can take over again from here on.
> >
> > Quite busy today, but I think I can go over the code once more tomorrow.
> >
> > Thanks for the help,
> > Christian.
> >
> > Am 03.02.21 um 03:45 schrieb Zack Rusin:
> >> Just had a quick peek. The issue is that you can’t attach to the drm
> >> device (card0) because it hasn’t been registered yet (drm device
> >> registration is last in the vmw_probe in vmwgfx_drv.c via the
> >> drm_dev_register). So dev->primary->kdev->kobj that you’re using as
> >> argument to kobject_init_and_add in ttm_mem_global_init hasn’t been
> >> initialized yet. So that particular sysfs code would likely have to
> >> be refactored out of ttm_mem_global_init to another function that
> >> could be called after drm registraction. I could take this on but not
> >> until Friday or so.
> >>
> >> z
> >>
> >>
> >>> On Feb 2, 2021, at 12:42, Zack Rusin <zackr at vmware.com> wrote:
> >>>
> >>> Ah, yes, sorry, I missed that. I just double checked and it fails with:
> >>>
> >>> kobject_add_internal failed for memory_accounting (error: -2 parent:
> >>> card0)
> >>>
> >>> which breaks the probe and the driver won’t load. I won’t have time
> >>> to look into it until tomorrow though.
> >>>
> >>> z
> >>>
> >>>> On Feb 2, 2021, at 10:16, Christian König
> >>>> <christian.koenig at amd.com> wrote:
> >>>>
> >>>> 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;
> >>>
> >>>
> >>> ----------
> >>>
> >>> You're receiving this message because you're a member of the
> >>> Linux-graphics-maintainer group from VMware, Inc..
> >>>
> >>> Leave group:
> >>> https://nam11.safelinks.protection.outlook.com/?url=https%3A%2F%2Foutlook.office365.com%2Fowa%2FLinux-graphics-maintainer%40vmware.com%2Fgroupsubscription.ashx%3Fsource%3DEscalatedMessage%26action%3Dleave%26GuestId%3D69d3bf6f-5242-4be4-b863-b7949752f363&data=04%7C01%7Cchristian.koenig%40amd.com%7Cccf900e6d23648ef0b0808d8c7edb760%7C3dd8961fe4884e608e11a82d994e183d%7C0%7C0%7C637479171103384072%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C1000&sdata=f8Y%2ByzBnt9Gxxmm7XZ3hpZqTdbY05og9yloArLCLIx0%3D&reserved=0
> >>>
> >>> _______________________________________________
> >>> Sent to linux-graphics-maintainer at vmware.com
> >
>


-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list