On 02.09.25 06:06, Dave Airlie wrote:
> 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 ++
>  mm/memcontrol.c                            |  1 +
>  5 files changed, 15 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
> index d1ccbfcf21fa..a01fe7594e3a 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);

This should probably be in ttm_bo_release() instead and passed in as parameter 
to ttm_bo_init_reserved().

Apart from tha looks good to me.

Regards,
Christian.

>       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 122a88294883..cbd09c680d33 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -159,7 +159,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.
> @@ -174,7 +174,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++;
>       }
>  
> @@ -654,16 +654,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 c316920f3450..8cccbe62e328 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 f71431e8e6b9..a3fa28e5a43e 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;
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> index 3d637c7e10cf..e4dc0cc43bc9 100644
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -2722,6 +2722,7 @@ __always_inline struct obj_cgroup 
> *current_obj_cgroup(void)
>  
>       return objcg;
>  }
> +EXPORT_SYMBOL_GPL(current_obj_cgroup);
>  
>  struct obj_cgroup *get_obj_cgroup_from_folio(struct folio *folio)
>  {

Reply via email to