From: Dave Airlie <airl...@redhat.com>

This adds support for adding a obj cgroup to a buffer object,
and passing in the placement flags to make sure it's accounted
properly.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c    |  2 ++
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 13 +++++++++----
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c    |  2 ++
 4 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index e5e33a68d935..d250183bab03 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -198,6 +198,7 @@ static void amdgpu_gem_object_free(struct drm_gem_object 
*gobj)
        struct amdgpu_bo *aobj = gem_to_amdgpu_bo(gobj);
 
        amdgpu_hmm_unregister(aobj);
+       obj_cgroup_put(aobj->tbo.objcg);
        ttm_bo_put(&aobj->tbo);
 }
 
@@ -225,6 +226,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, 
unsigned long size,
        bp.domain = initial_domain;
        bp.bo_ptr_size = sizeof(struct amdgpu_bo);
        bp.xcp_id_plus1 = xcp_id_plus1;
+       bp.objcg = get_obj_cgroup_from_current();
 
        r = amdgpu_bo_create_user(adev, &bp, &ubo);
        if (r)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index 73403744331a..6d5533703b33 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -158,7 +158,7 @@ void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, 
u32 domain)
                places[c].mem_type =
                        abo->flags & AMDGPU_GEM_CREATE_PREEMPTIBLE ?
                        AMDGPU_PL_PREEMPT : TTM_PL_TT;
-               places[c].flags = 0;
+               places[c].flags = TTM_PL_FLAG_MEMCG;
                /*
                 * When GTT is just an alternative to VRAM make sure that we
                 * only use it as fallback and still try to fill up VRAM first.
@@ -173,7 +173,7 @@ void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, 
u32 domain)
                places[c].fpfn = 0;
                places[c].lpfn = 0;
                places[c].mem_type = TTM_PL_SYSTEM;
-               places[c].flags = 0;
+               places[c].flags = TTM_PL_FLAG_MEMCG;
                c++;
        }
 
@@ -657,16 +657,21 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
                size = ALIGN(size, PAGE_SIZE);
        }
 
-       if (!amdgpu_bo_validate_size(adev, size, bp->domain))
+       if (!amdgpu_bo_validate_size(adev, size, bp->domain)) {
+               obj_cgroup_put(bp->objcg);
                return -ENOMEM;
+       }
 
        BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo));
 
        *bo_ptr = NULL;
        bo = kvzalloc(bp->bo_ptr_size, GFP_KERNEL);
-       if (bo == NULL)
+       if (bo == NULL) {
+               obj_cgroup_put(bp->objcg);
                return -ENOMEM;
+       }
        drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size);
+       bo->tbo.objcg = bp->objcg;
        bo->tbo.base.funcs = &amdgpu_gem_object_funcs;
        bo->vm_bo = NULL;
        bo->preferred_domains = bp->preferred_domain ? bp->preferred_domain :
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index 375448627f7b..8ebaf1bc202f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -55,6 +55,7 @@ struct amdgpu_bo_param {
        enum ttm_bo_type                type;
        bool                            no_wait_gpu;
        struct dma_resv                 *resv;
+       struct obj_cgroup               *objcg;
        void                            (*destroy)(struct ttm_buffer_object 
*bo);
        /* xcp partition number plus 1, 0 means any partition */
        int8_t                          xcp_id_plus1;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 920b412156dd..a65e23b8c67e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -151,11 +151,13 @@ static void amdgpu_evict_flags(struct ttm_buffer_object 
*bo,
                        amdgpu_bo_placement_from_domain(abo, 
AMDGPU_GEM_DOMAIN_GTT |
                                                        AMDGPU_GEM_DOMAIN_CPU);
                }
+               abo->placements[0].flags &= ~TTM_PL_FLAG_MEMCG;
                break;
        case TTM_PL_TT:
        case AMDGPU_PL_PREEMPT:
        default:
                amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU);
+               abo->placements[0].flags &= ~TTM_PL_FLAG_MEMCG;
                break;
        }
        *placement = abo->placement;
-- 
2.49.0

Reply via email to