Intel-XE Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "Thomas Hellström" <thomas.hellstrom@linux.intel.com>
To: Dave Airlie <airlied@gmail.com>,
	dri-devel@lists.freedesktop.org,  tj@kernel.org,
	christian.koenig@amd.com, Johannes Weiner <hannes@cmpxchg.org>,
	 Michal Hocko <mhocko@kernel.org>,
	Roman Gushchin <roman.gushchin@linux.dev>,
	Shakeel Butt	 <shakeel.butt@linux.dev>,
	Muchun Song <muchun.song@linux.dev>
Cc: cgroups@vger.kernel.org, Waiman Long <longman@redhat.com>,
	simona@ffwll.ch, 	intel-xe@lists.freedesktop.org
Subject: Re: [PATCH 02/10] ttm: add a memcg accounting flag to the alloc/populate APIs
Date: Wed, 22 Jul 2026 17:08:52 +0200	[thread overview]
Message-ID: <1c4e53bef3e6cdce4edf97352d9f5e04ce0c69a6.camel@linux.intel.com> (raw)
In-Reply-To: <20260706052330.1110909-3-airlied@gmail.com>

On Mon, 2026-07-06 at 15:22 +1000, Dave Airlie wrote:
> From: Dave Airlie <airlied@redhat.com>
> 
> This flag does nothing yet, but this just changes the APIs to accept
> it in the future across all users.
> 
> This flag will eventually be filled out with when to account a tt
> populate to a memcg.

I agree with Matt Brost's comment about the ttm_operation_ctx.

There are also some sashiko comments that appear valid:
https://sashiko.dev/#/message/20260706053512.D207E1F000E9%40smtp.kernel.org

Thanks,
Thomas


> 
> Signed-off-by: Dave Airlie <airlied@redhat.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c          |  3 ++-
>  drivers/gpu/drm/i915/gem/i915_gem_ttm.c          |  5 +++--
>  drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c     |  2 +-
>  drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c       |  4 ++--
>  drivers/gpu/drm/loongson/lsdc_ttm.c              |  3 ++-
>  drivers/gpu/drm/nouveau/nouveau_bo.c             |  6 ++++--
>  drivers/gpu/drm/radeon/radeon_ttm.c              |  3 ++-
>  drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c |  2 +-
>  drivers/gpu/drm/ttm/tests/ttm_pool_test.c        | 16 ++++++++------
> --
>  drivers/gpu/drm/ttm/tests/ttm_tt_test.c          | 12 ++++++------
>  drivers/gpu/drm/ttm/ttm_bo.c                     |  7 ++++---
>  drivers/gpu/drm/ttm/ttm_bo_util.c                |  6 +++---
>  drivers/gpu/drm/ttm/ttm_bo_vm.c                  |  4 +++-
>  drivers/gpu/drm/ttm/ttm_pool.c                   |  6 ++++--
>  drivers/gpu/drm/ttm/ttm_tt.c                     |  8 +++++---
>  drivers/gpu/drm/vmwgfx/vmwgfx_blit.c             |  4 ++--
>  drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c       |  7 ++++---
>  drivers/gpu/drm/xe/xe_bo.c                       |  5 +++--
>  include/drm/ttm/ttm_bo.h                         |  1 +
>  include/drm/ttm/ttm_device.h                     |  1 +
>  include/drm/ttm/ttm_pool.h                       |  1 +
>  include/drm/ttm/ttm_tt.h                         |  1 +
>  22 files changed, 63 insertions(+), 44 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> index 025625e7e800..8062b3d61157 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
> @@ -1220,6 +1220,7 @@ static struct ttm_tt
> *amdgpu_ttm_tt_create(struct ttm_buffer_object *bo,
>   */
>  static int amdgpu_ttm_tt_populate(struct ttm_device *bdev,
>  				  struct ttm_tt *ttm,
> +				  bool memcg_account,
>  				  struct ttm_operation_ctx *ctx)
>  {
>  	struct amdgpu_device *adev = amdgpu_ttm_adev(bdev);
> @@ -1243,7 +1244,7 @@ static int amdgpu_ttm_tt_populate(struct
> ttm_device *bdev,
>  		pool = &adev->mman.ttm_pools[gtt->pool_id];
>  	else
>  		pool = &adev->mman.bdev.pool;
> -	ret = ttm_pool_alloc(pool, ttm, ctx);
> +	ret = ttm_pool_alloc(pool, ttm, memcg_account, ctx);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> index df3fcc2b1248..d45ccede78a4 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c
> @@ -317,6 +317,7 @@ static struct ttm_tt *i915_ttm_tt_create(struct
> ttm_buffer_object *bo,
>  
>  static int i915_ttm_tt_populate(struct ttm_device *bdev,
>  				struct ttm_tt *ttm,
> +				bool memcg_account,
>  				struct ttm_operation_ctx *ctx)
>  {
>  	struct i915_ttm_tt *i915_tt = container_of(ttm,
> typeof(*i915_tt), ttm);
> @@ -324,7 +325,7 @@ static int i915_ttm_tt_populate(struct ttm_device
> *bdev,
>  	if (i915_tt->is_shmem)
>  		return i915_ttm_tt_shmem_populate(bdev, ttm, ctx);
>  
> -	return ttm_pool_alloc(&bdev->pool, ttm, ctx);
> +	return ttm_pool_alloc(&bdev->pool, ttm, memcg_account, ctx);
>  }
>  
>  static void i915_ttm_tt_unpopulate(struct ttm_device *bdev, struct
> ttm_tt *ttm)
> @@ -815,7 +816,7 @@ static int __i915_ttm_get_pages(struct
> drm_i915_gem_object *obj,
>  	}
>  
>  	if (bo->ttm && !ttm_tt_is_populated(bo->ttm)) {
> -		ret = ttm_bo_populate(bo, &ctx);
> +		ret = ttm_bo_populate(bo, false, &ctx);
>  		if (ret)
>  			return ret;
>  
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
> b/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
> index 56489cc127d6..b81c9df2d7eb 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm_move.c
> @@ -624,7 +624,7 @@ int i915_ttm_move(struct ttm_buffer_object *bo,
> bool evict,
>  
>  	/* Populate ttm with pages if needed. Typically system
> memory. */
>  	if (ttm && (dst_man->use_tt || (ttm->page_flags &
> TTM_TT_FLAG_SWAPPED))) {
> -		ret = ttm_bo_populate(bo, ctx);
> +		ret = ttm_bo_populate(bo, false, ctx);
>  		if (ret)
>  			return ret;
>  	}
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c
> b/drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c
> index 4824f948daed..d951e58f78ea 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm_pm.c
> @@ -91,7 +91,7 @@ static int i915_ttm_backup(struct
> i915_gem_apply_to_region *apply,
>  		goto out_no_lock;
>  
>  	backup_bo = i915_gem_to_ttm(backup);
> -	err = ttm_bo_populate(backup_bo, &ctx);
> +	err = ttm_bo_populate(backup_bo, false, &ctx);
>  	if (err)
>  		goto out_no_populate;
>  
> @@ -190,7 +190,7 @@ static int i915_ttm_restore(struct
> i915_gem_apply_to_region *apply,
>  	if (!backup_bo->resource)
>  		err = ttm_bo_validate(backup_bo,
> i915_ttm_sys_placement(), &ctx);
>  	if (!err)
> -		err = ttm_bo_populate(backup_bo, &ctx);
> +		err = ttm_bo_populate(backup_bo, false, &ctx);
>  	if (!err) {
>  		err = i915_gem_obj_copy_ttm(obj, backup, pm_apply-
> >allow_gpu,
>  					    false);
> diff --git a/drivers/gpu/drm/loongson/lsdc_ttm.c
> b/drivers/gpu/drm/loongson/lsdc_ttm.c
> index d7441d96a0dc..bfb5f1b1ec91 100644
> --- a/drivers/gpu/drm/loongson/lsdc_ttm.c
> +++ b/drivers/gpu/drm/loongson/lsdc_ttm.c
> @@ -111,6 +111,7 @@ lsdc_ttm_tt_create(struct ttm_buffer_object *tbo,
> uint32_t page_flags)
>  
>  static int lsdc_ttm_tt_populate(struct ttm_device *bdev,
>  				struct ttm_tt *ttm,
> +				bool memcg_account,
>  				struct ttm_operation_ctx *ctx)
>  {
>  	bool slave = !!(ttm->page_flags & TTM_TT_FLAG_EXTERNAL);
> @@ -123,7 +124,7 @@ static int lsdc_ttm_tt_populate(struct ttm_device
> *bdev,
>  		return 0;
>  	}
>  
> -	return ttm_pool_alloc(&bdev->pool, ttm, ctx);
> +	return ttm_pool_alloc(&bdev->pool, ttm, memcg_account, ctx);
>  }
>  
>  static void lsdc_ttm_tt_unpopulate(struct ttm_device *bdev,
> diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c
> b/drivers/gpu/drm/nouveau/nouveau_bo.c
> index 0e8de6d4b36f..a38c19f1d6dc 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_bo.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
> @@ -1417,7 +1417,9 @@ vm_fault_t
> nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
>  
>  static int
>  nouveau_ttm_tt_populate(struct ttm_device *bdev,
> -			struct ttm_tt *ttm, struct ttm_operation_ctx
> *ctx)
> +			struct ttm_tt *ttm,
> +			bool memcg_account,
> +			struct ttm_operation_ctx *ctx)
>  {
>  	struct ttm_tt *ttm_dma = (void *)ttm;
>  	struct nouveau_drm *drm;
> @@ -1434,7 +1436,7 @@ nouveau_ttm_tt_populate(struct ttm_device
> *bdev,
>  
>  	drm = nouveau_bdev(bdev);
>  
> -	return ttm_pool_alloc(&drm->ttm.bdev.pool, ttm, ctx);
> +	return ttm_pool_alloc(&drm->ttm.bdev.pool, ttm,
> memcg_account, ctx);
>  }
>  
>  static void
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c
> b/drivers/gpu/drm/radeon/radeon_ttm.c
> index e7ab8162ac69..98b09463abc2 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -526,6 +526,7 @@ static struct radeon_ttm_tt
> *radeon_ttm_tt_to_gtt(struct radeon_device *rdev,
>  
>  static int radeon_ttm_tt_populate(struct ttm_device *bdev,
>  				  struct ttm_tt *ttm,
> +				  bool memcg_account,
>  				  struct ttm_operation_ctx *ctx)
>  {
>  	struct radeon_device *rdev = radeon_get_rdev(bdev);
> @@ -547,7 +548,7 @@ static int radeon_ttm_tt_populate(struct
> ttm_device *bdev,
>  		return 0;
>  	}
>  
> -	return ttm_pool_alloc(&rdev->mman.bdev.pool, ttm, ctx);
> +	return ttm_pool_alloc(&rdev->mman.bdev.pool, ttm,
> memcg_account, ctx);
>  }
>  
>  static void radeon_ttm_tt_unpopulate(struct ttm_device *bdev, struct
> ttm_tt *ttm)
> diff --git a/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
> b/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
> index 2db221f6fc3a..0cbf732eebf3 100644
> --- a/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
> +++ b/drivers/gpu/drm/ttm/tests/ttm_bo_validate_test.c
> @@ -538,7 +538,7 @@ static void
> ttm_bo_validate_no_placement_signaled(struct kunit *test)
>  
>  	if (params->with_ttm) {
>  		old_tt = priv->ttm_dev->funcs->ttm_tt_create(bo, 0);
> -		ttm_pool_alloc(&priv->ttm_dev->pool, old_tt, &ctx);
> +		ttm_pool_alloc(&priv->ttm_dev->pool, old_tt, false,
> &ctx);
>  		bo->ttm = old_tt;
>  	}
>  
> diff --git a/drivers/gpu/drm/ttm/tests/ttm_pool_test.c
> b/drivers/gpu/drm/ttm/tests/ttm_pool_test.c
> index be75c8abf388..af235d64b970 100644
> --- a/drivers/gpu/drm/ttm/tests/ttm_pool_test.c
> +++ b/drivers/gpu/drm/ttm/tests/ttm_pool_test.c
> @@ -89,7 +89,7 @@ static struct ttm_pool
> *ttm_pool_pre_populated(struct kunit *test,
>  
>  	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE,
> TTM_ALLOCATION_POOL_USE_DMA_ALLOC);
>  
> -	err = ttm_pool_alloc(pool, tt, &simple_ctx);
> +	err = ttm_pool_alloc(pool, tt, false, &simple_ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  
>  	ttm_pool_free(pool, tt);
> @@ -157,7 +157,7 @@ static void ttm_pool_alloc_basic(struct kunit
> *test)
>  	KUNIT_ASSERT_EQ(test, pool->nid, NUMA_NO_NODE);
>  	KUNIT_ASSERT_EQ(test, pool->alloc_flags, params-
> >alloc_flags);
>  
> -	err = ttm_pool_alloc(pool, tt, &simple_ctx);
> +	err = ttm_pool_alloc(pool, tt, false, &simple_ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  	KUNIT_ASSERT_EQ(test, tt->num_pages, expected_num_pages);
>  
> @@ -220,7 +220,7 @@ static void ttm_pool_alloc_basic_dma_addr(struct
> kunit *test)
>  
>  	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE,
> TTM_ALLOCATION_POOL_USE_DMA_ALLOC);
>  
> -	err = ttm_pool_alloc(pool, tt, &simple_ctx);
> +	err = ttm_pool_alloc(pool, tt, false, &simple_ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  	KUNIT_ASSERT_EQ(test, tt->num_pages, expected_num_pages);
>  
> @@ -253,7 +253,7 @@ static void
> ttm_pool_alloc_order_caching_match(struct kunit *test)
>  	tt = ttm_tt_kunit_init(test, 0, caching, size);
>  	KUNIT_ASSERT_NOT_NULL(test, tt);
>  
> -	err = ttm_pool_alloc(pool, tt, &simple_ctx);
> +	err = ttm_pool_alloc(pool, tt, false, &simple_ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  
>  	KUNIT_ASSERT_TRUE(test, !list_lru_count(&pt->pages));
> @@ -285,7 +285,7 @@ static void
> ttm_pool_alloc_caching_mismatch(struct kunit *test)
>  	KUNIT_ASSERT_FALSE(test, !list_lru_count(&pt_pool->pages));
>  	KUNIT_ASSERT_TRUE(test, !list_lru_count(&pt_tt->pages));
>  
> -	err = ttm_pool_alloc(pool, tt, &simple_ctx);
> +	err = ttm_pool_alloc(pool, tt, false, &simple_ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  
>  	ttm_pool_free(pool, tt);
> @@ -319,7 +319,7 @@ static void ttm_pool_alloc_order_mismatch(struct
> kunit *test)
>  	KUNIT_ASSERT_FALSE(test, !list_lru_count(&pt_pool->pages));
>  	KUNIT_ASSERT_TRUE(test, !list_lru_count(&pt_tt->pages));
>  
> -	err = ttm_pool_alloc(pool, tt, &simple_ctx);
> +	err = ttm_pool_alloc(pool, tt, false, &simple_ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  
>  	ttm_pool_free(pool, tt);
> @@ -349,7 +349,7 @@ static void ttm_pool_free_dma_alloc(struct kunit
> *test)
>  	KUNIT_ASSERT_NOT_NULL(test, pool);
>  
>  	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE,
> TTM_ALLOCATION_POOL_USE_DMA_ALLOC);
> -	ttm_pool_alloc(pool, tt, &simple_ctx);
> +	ttm_pool_alloc(pool, tt, false, &simple_ctx);
>  
>  	pt = &pool->caching[caching].orders[order];
>  	KUNIT_ASSERT_TRUE(test, !list_lru_count(&pt->pages));
> @@ -379,7 +379,7 @@ static void ttm_pool_free_no_dma_alloc(struct
> kunit *test)
>  	KUNIT_ASSERT_NOT_NULL(test, pool);
>  
>  	ttm_pool_init(pool, devs->dev, NUMA_NO_NODE, 0);
> -	ttm_pool_alloc(pool, tt, &simple_ctx);
> +	ttm_pool_alloc(pool, tt, false, &simple_ctx);
>  
>  	ttm_pool_free(pool, tt);
>  	ttm_tt_fini(tt);
> diff --git a/drivers/gpu/drm/ttm/tests/ttm_tt_test.c
> b/drivers/gpu/drm/ttm/tests/ttm_tt_test.c
> index bd5f7d0b9b62..dfa38bbfd829 100644
> --- a/drivers/gpu/drm/ttm/tests/ttm_tt_test.c
> +++ b/drivers/gpu/drm/ttm/tests/ttm_tt_test.c
> @@ -262,7 +262,7 @@ static void ttm_tt_populate_null_ttm(struct kunit
> *test)
>  	struct ttm_operation_ctx ctx = { };
>  	int err;
>  
> -	err = ttm_tt_populate(devs->ttm_dev, NULL, &ctx);
> +	err = ttm_tt_populate(devs->ttm_dev, NULL, false, &ctx);
>  	KUNIT_ASSERT_EQ(test, err, -EINVAL);
>  }
>  
> @@ -283,11 +283,11 @@ static void
> ttm_tt_populate_populated_ttm(struct kunit *test)
>  	err = ttm_tt_init(tt, bo, 0, ttm_cached, 0);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  
> -	err = ttm_tt_populate(devs->ttm_dev, tt, &ctx);
> +	err = ttm_tt_populate(devs->ttm_dev, tt, false, &ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  	populated_page = *tt->pages;
>  
> -	err = ttm_tt_populate(devs->ttm_dev, tt, &ctx);
> +	err = ttm_tt_populate(devs->ttm_dev, tt, false, &ctx);
>  	KUNIT_ASSERT_PTR_EQ(test, populated_page, *tt->pages);
>  }
>  
> @@ -307,7 +307,7 @@ static void ttm_tt_unpopulate_basic(struct kunit
> *test)
>  	err = ttm_tt_init(tt, bo, 0, ttm_cached, 0);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  
> -	err = ttm_tt_populate(devs->ttm_dev, tt, &ctx);
> +	err = ttm_tt_populate(devs->ttm_dev, tt, false, &ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  	KUNIT_ASSERT_TRUE(test, ttm_tt_is_populated(tt));
>  
> @@ -351,7 +351,7 @@ static void ttm_tt_swapin_basic(struct kunit
> *test)
>  	err = ttm_tt_init(tt, bo, 0, ttm_cached, 0);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  
> -	err = ttm_tt_populate(devs->ttm_dev, tt, &ctx);
> +	err = ttm_tt_populate(devs->ttm_dev, tt, false, &ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  	KUNIT_ASSERT_TRUE(test, ttm_tt_is_populated(tt));
>  
> @@ -361,7 +361,7 @@ static void ttm_tt_swapin_basic(struct kunit
> *test)
>  	KUNIT_ASSERT_TRUE(test, tt->page_flags &
> TTM_TT_FLAG_SWAPPED);
>  
>  	/* Swapout depopulates TT, allocate pages and then swap them
> in */
> -	err = ttm_pool_alloc(&devs->ttm_dev->pool, tt, &ctx);
> +	err = ttm_pool_alloc(&devs->ttm_dev->pool, tt, false, &ctx);
>  	KUNIT_ASSERT_EQ(test, err, 0);
>  
>  	err = ttm_tt_swapin(tt);
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c
> b/drivers/gpu/drm/ttm/ttm_bo.c
> index bcd76f6bb7f0..cf4ab2b5521a 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -145,7 +145,7 @@ static int ttm_bo_handle_move_mem(struct
> ttm_buffer_object *bo,
>  			goto out_err;
>  
>  		if (mem->mem_type != TTM_PL_SYSTEM) {
> -			ret = ttm_bo_populate(bo, ctx);
> +			ret = ttm_bo_populate(bo, false, ctx);
>  			if (ret)
>  				goto out_err;
>  		}
> @@ -1255,6 +1255,7 @@ void ttm_bo_tt_destroy(struct ttm_buffer_object
> *bo)
>   * is set to true.
>   */
>  int ttm_bo_populate(struct ttm_buffer_object *bo,
> +		    bool memcg_account,
>  		    struct ttm_operation_ctx *ctx)
>  {
>  	struct ttm_device *bdev = bo->bdev;
> @@ -1268,7 +1269,7 @@ int ttm_bo_populate(struct ttm_buffer_object
> *bo,
>  		return 0;
>  
>  	swapped = ttm_tt_is_swapped(tt);
> -	ret = ttm_tt_populate(bdev, tt, ctx);
> +	ret = ttm_tt_populate(bdev, tt, memcg_account, ctx);
>  	if (ret)
>  		return ret;
>  
> @@ -1293,7 +1294,7 @@ int ttm_bo_setup_export(struct
> ttm_buffer_object *bo,
>  	if (ret != 0)
>  		return ret;
>  
> -	ret = ttm_bo_populate(bo, ctx);
> +	ret = ttm_bo_populate(bo, false, ctx);
>  	ttm_bo_unreserve(bo);
>  	return ret;
>  }
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c
> b/drivers/gpu/drm/ttm/ttm_bo_util.c
> index 3e3c201a0222..62dad6c05dff 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_util.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c
> @@ -167,7 +167,7 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object
> *bo,
>  	src_man = ttm_manager_type(bdev, src_mem->mem_type);
>  	if (ttm && ((ttm->page_flags & TTM_TT_FLAG_SWAPPED) ||
>  		    dst_man->use_tt)) {
> -		ret = ttm_bo_populate(bo, ctx);
> +		ret = ttm_bo_populate(bo, false, ctx);
>  		if (ret)
>  			return ret;
>  	}
> @@ -352,7 +352,7 @@ static int ttm_bo_kmap_ttm(struct
> ttm_buffer_object *bo,
>  
>  	BUG_ON(!ttm);
>  
> -	ret = ttm_bo_populate(bo, &ctx);
> +	ret = ttm_bo_populate(bo, false, &ctx);
>  	if (ret)
>  		return ret;
>  
> @@ -533,7 +533,7 @@ int ttm_bo_vmap(struct ttm_buffer_object *bo,
> struct iosys_map *map)
>  		pgprot_t prot;
>  		void *vaddr;
>  
> -		ret = ttm_bo_populate(bo, &ctx);
> +		ret = ttm_bo_populate(bo, false, &ctx);
>  		if (ret)
>  			return ret;
>  
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_vm.c
> b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> index a80510489c45..2e59836b6085 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_vm.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_vm.c
> @@ -224,7 +224,9 @@ vm_fault_t ttm_bo_vm_fault_reserved(struct
> vm_fault *vmf,
>  		};
>  
>  		ttm = bo->ttm;
> -		err = ttm_bo_populate(bo, &ctx);
> +		err = ttm_bo_populate(bo,
> +				      false,
> +				      &ctx);
>  		if (err) {
>  			if (err == -EINTR || err == -ERESTARTSYS ||
>  			    err == -EAGAIN)
> diff --git a/drivers/gpu/drm/ttm/ttm_pool.c
> b/drivers/gpu/drm/ttm/ttm_pool.c
> index 278bbe7a11ad..e4dbf4c93091 100644
> --- a/drivers/gpu/drm/ttm/ttm_pool.c
> +++ b/drivers/gpu/drm/ttm/ttm_pool.c
> @@ -761,6 +761,7 @@ static unsigned int
> ttm_pool_alloc_find_order(unsigned int highest,
>  }
>  
>  static int __ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt
> *tt,
> +			    bool memcg_account,
>  			    const struct ttm_operation_ctx *ctx,
>  			    struct ttm_pool_alloc_state *alloc,
>  			    struct ttm_pool_tt_restore *restore)
> @@ -871,6 +872,7 @@ static int __ttm_pool_alloc(struct ttm_pool
> *pool, struct ttm_tt *tt,
>   * Returns: 0 on successe, negative error code otherwise.
>   */
>  int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> +		   bool memcg_account,

Regardless whether memcg_account is passed as a separate parameter or
part of @ctx, needs kerneldoc update.


Thanks,
Thomas



>  		   struct ttm_operation_ctx *ctx)
>  {
>  	struct ttm_pool_alloc_state alloc;
> @@ -880,7 +882,7 @@ int ttm_pool_alloc(struct ttm_pool *pool, struct
> ttm_tt *tt,
>  
>  	ttm_pool_alloc_state_init(tt, &alloc);
>  
> -	return __ttm_pool_alloc(pool, tt, ctx, &alloc, NULL);
> +	return __ttm_pool_alloc(pool, tt, memcg_account, ctx,
> &alloc, NULL);
>  }
>  EXPORT_SYMBOL(ttm_pool_alloc);
>  
> @@ -935,7 +937,7 @@ int ttm_pool_restore_and_alloc(struct ttm_pool
> *pool, struct ttm_tt *tt,
>  			return 0;
>  	}
>  
> -	return __ttm_pool_alloc(pool, tt, ctx, &alloc, restore);
> +	return __ttm_pool_alloc(pool, tt, false, ctx, &alloc,
> restore);
>  }
>  
>  /**
> diff --git a/drivers/gpu/drm/ttm/ttm_tt.c
> b/drivers/gpu/drm/ttm/ttm_tt.c
> index b645a1818184..aa0f17fca770 100644
> --- a/drivers/gpu/drm/ttm/ttm_tt.c
> +++ b/drivers/gpu/drm/ttm/ttm_tt.c
> @@ -368,7 +368,9 @@ int ttm_tt_swapout(struct ttm_device *bdev,
> struct ttm_tt *ttm,
>  EXPORT_SYMBOL_FOR_TESTS_ONLY(ttm_tt_swapout);
>  
>  int ttm_tt_populate(struct ttm_device *bdev,
> -		    struct ttm_tt *ttm, struct ttm_operation_ctx
> *ctx)
> +		    struct ttm_tt *ttm,
> +		    bool memcg_account,
> +		    struct ttm_operation_ctx *ctx)
>  {
>  	int ret;
>  
> @@ -397,9 +399,9 @@ int ttm_tt_populate(struct ttm_device *bdev,
>  	}
>  
>  	if (bdev->funcs->ttm_tt_populate)
> -		ret = bdev->funcs->ttm_tt_populate(bdev, ttm, ctx);
> +		ret = bdev->funcs->ttm_tt_populate(bdev, ttm,
> memcg_account, ctx);
>  	else
> -		ret = ttm_pool_alloc(&bdev->pool, ttm, ctx);
> +		ret = ttm_pool_alloc(&bdev->pool, ttm,
> memcg_account, ctx);
>  	if (ret)
>  		goto error;
>  
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
> b/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
> index 135b75a3e013..baa1c3fdb12c 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_blit.c
> @@ -569,13 +569,13 @@ int vmw_bo_cpu_blit(struct vmw_bo *vmw_dst,
>  		dma_resv_assert_held(src->base.resv);
>  
>  	if (!ttm_tt_is_populated(dst->ttm)) {
> -		ret = dst->bdev->funcs->ttm_tt_populate(dst->bdev,
> dst->ttm, &ctx);
> +		ret = dst->bdev->funcs->ttm_tt_populate(dst->bdev,
> dst->ttm, false, &ctx);
>  		if (ret)
>  			return ret;
>  	}
>  
>  	if (!ttm_tt_is_populated(src->ttm)) {
> -		ret = src->bdev->funcs->ttm_tt_populate(src->bdev,
> src->ttm, &ctx);
> +		ret = src->bdev->funcs->ttm_tt_populate(src->bdev,
> src->ttm, false, &ctx);
>  		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 dfd08ee19041..368701756119 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ttm_buffer.c
> @@ -360,7 +360,8 @@ 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)
> +			    struct ttm_tt *ttm, bool memcg_account,
> +			    struct ttm_operation_ctx *ctx)
>  {
>  	bool external = (ttm->page_flags & TTM_TT_FLAG_EXTERNAL) !=
> 0;
>  
> @@ -372,7 +373,7 @@ static int vmw_ttm_populate(struct ttm_device
> *bdev,
>  						       ttm-
> >dma_address,
>  						       ttm-
> >num_pages);
>  
> -	return ttm_pool_alloc(&bdev->pool, ttm, ctx);
> +	return ttm_pool_alloc(&bdev->pool, ttm, memcg_account, ctx);
>  }
>  
>  static void vmw_ttm_unpopulate(struct ttm_device *bdev,
> @@ -580,7 +581,7 @@ int vmw_bo_create_and_populate(struct vmw_private
> *dev_priv,
>  	if (unlikely(ret != 0))
>  		return ret;
>  
> -	ret = vmw_ttm_populate(vbo->tbo.bdev, vbo->tbo.ttm, &ctx);
> +	ret = vmw_ttm_populate(vbo->tbo.bdev, vbo->tbo.ttm, false,
> &ctx);
>  	if (likely(ret == 0)) {
>  		struct vmw_ttm_tt *vmw_tt =
>  			container_of(vbo->tbo.ttm, struct
> vmw_ttm_tt, dma_ttm);
> diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c
> index 4c80bac67622..20a10a174d1d 100644
> --- a/drivers/gpu/drm/xe/xe_bo.c
> +++ b/drivers/gpu/drm/xe/xe_bo.c
> @@ -536,6 +536,7 @@ static struct ttm_tt *xe_ttm_tt_create(struct
> ttm_buffer_object *ttm_bo,
>  }
>  
>  static int xe_ttm_tt_populate(struct ttm_device *ttm_dev, struct
> ttm_tt *tt,
> +			      bool memcg_account,
>  			      struct ttm_operation_ctx *ctx)
>  {
>  	struct xe_ttm_tt *xe_tt = container_of(tt, struct xe_ttm_tt,
> ttm);
> @@ -553,7 +554,7 @@ static int xe_ttm_tt_populate(struct ttm_device
> *ttm_dev, struct ttm_tt *tt,
>  		err = ttm_tt_restore(ttm_dev, tt, ctx);
>  	} else {
>  		ttm_tt_clear_backed_up(tt);
> -		err = ttm_pool_alloc(&ttm_dev->pool, tt, ctx);
> +		err = ttm_pool_alloc(&ttm_dev->pool, tt,
> memcg_account, ctx);
>  	}
>  	if (err)
>  		return err;
> @@ -1926,7 +1927,7 @@ static int xe_bo_fault_migrate(struct xe_bo
> *bo, struct ttm_operation_ctx *ctx,
>  	if (ttm_manager_type(tbo->bdev, tbo->resource->mem_type)-
> >use_tt) {
>  		err = xe_bo_wait_usage_kernel(bo, ctx);
>  		if (!err)
> -			err = ttm_bo_populate(&bo->ttm, ctx);
> +			err = ttm_bo_populate(&bo->ttm, false, ctx);
>  	} else if (should_migrate_to_smem(bo)) {
>  		xe_assert(xe_bo_device(bo), bo->flags &
> XE_BO_FLAG_SYSTEM);
>  		err = xe_bo_migrate(bo, XE_PL_TT, ctx, exec);
> diff --git a/include/drm/ttm/ttm_bo.h b/include/drm/ttm/ttm_bo.h
> index 8310bc3d55f9..535ba37aff88 100644
> --- a/include/drm/ttm/ttm_bo.h
> +++ b/include/drm/ttm/ttm_bo.h
> @@ -475,6 +475,7 @@ pgprot_t ttm_io_prot(struct ttm_buffer_object
> *bo, struct ttm_resource *res,
>  		     pgprot_t tmp);
>  void ttm_bo_tt_destroy(struct ttm_buffer_object *bo);
>  int ttm_bo_populate(struct ttm_buffer_object *bo,
> +		    bool memcg_account,
>  		    struct ttm_operation_ctx *ctx);
>  int ttm_bo_setup_export(struct ttm_buffer_object *bo,
>  			struct ttm_operation_ctx *ctx);
> diff --git a/include/drm/ttm/ttm_device.h
> b/include/drm/ttm/ttm_device.h
> index 5618aef462f2..a4bd23988ee0 100644
> --- a/include/drm/ttm/ttm_device.h
> +++ b/include/drm/ttm/ttm_device.h
> @@ -85,6 +85,7 @@ struct ttm_device_funcs {
>  	 */
>  	int (*ttm_tt_populate)(struct ttm_device *bdev,
>  			       struct ttm_tt *ttm,
> +			       bool memcg_account,
>  			       struct ttm_operation_ctx *ctx);
>  
>  	/**
> diff --git a/include/drm/ttm/ttm_pool.h b/include/drm/ttm/ttm_pool.h
> index 26ee592e1994..7f3f168c536c 100644
> --- a/include/drm/ttm/ttm_pool.h
> +++ b/include/drm/ttm/ttm_pool.h
> @@ -78,6 +78,7 @@ struct ttm_pool {
>  };
>  
>  int ttm_pool_alloc(struct ttm_pool *pool, struct ttm_tt *tt,
> +		   bool memcg_account,
>  		   struct ttm_operation_ctx *ctx);
>  void ttm_pool_free(struct ttm_pool *pool, struct ttm_tt *tt);
>  
> diff --git a/include/drm/ttm/ttm_tt.h b/include/drm/ttm/ttm_tt.h
> index 406437ad674b..15d4019685f6 100644
> --- a/include/drm/ttm/ttm_tt.h
> +++ b/include/drm/ttm/ttm_tt.h
> @@ -250,6 +250,7 @@ int ttm_tt_swapout(struct ttm_device *bdev,
> struct ttm_tt *ttm,
>   * Calls the driver method to allocate pages for a ttm
>   */
>  int ttm_tt_populate(struct ttm_device *bdev, struct ttm_tt *ttm,
> +		    bool memcg_account,
>  		    struct ttm_operation_ctx *ctx);
>  
>  /**

  parent reply	other threads:[~2026-07-22 15:09 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-06  5:22 drm/ttm/memcg/lru: enable memcg tracking for ttm, xe and amdgpu driver (part 2) (v2) Dave Airlie
2026-07-06  5:22 ` [PATCH 01/10] memcg: add support for GPU page counters. (v5) Dave Airlie
2026-07-22 14:38   ` Thomas Hellström
2026-07-06  5:22 ` [PATCH 02/10] ttm: add a memcg accounting flag to the alloc/populate APIs Dave Airlie
2026-07-06 16:24   ` Matthew Brost
2026-07-22 15:08   ` Thomas Hellström [this message]
2026-07-06  5:22 ` [PATCH 03/10] ttm/pool: initialise the shrinker earlier (v2) Dave Airlie
2026-07-22 15:33   ` Thomas Hellström
2026-07-06  5:22 ` [PATCH 04/10] ttm: add objcg pointer to bo and tt (v3) Dave Airlie
2026-07-06  5:22 ` [PATCH 05/10] ttm/pool: enable memcg tracking and shrinker. (v3) Dave Airlie
2026-07-06  5:22 ` [PATCH 06/10] ttm: hook up memcg placement flags Dave Airlie
2026-07-06  5:22 ` [PATCH 07/10] memcontrol: allow objcg api when memcg is config off Dave Airlie
2026-07-06  5:22 ` [PATCH 08/10] amdgpu: add support for memory cgroups Dave Airlie
2026-07-06  5:22 ` [PATCH 09/10] ttm: add support for a module option to disable memcg integration Dave Airlie
2026-07-06  5:22 ` [PATCH 10/10] xe: create a flag to enable memcg accounting for XE as well Dave Airlie
2026-07-06  7:55 ` drm/ttm/memcg/lru: enable memcg tracking for ttm, xe and amdgpu driver (part 2) (v2) Dave Airlie
2026-07-06 14:28   ` Thomas Hellström
2026-07-22 14:34 ` Thomas Hellström
  -- strict thread matches above, loose matches on Subject: below --
2026-07-06  2:36 drm/ttm/memcg/lru: enable memcg tracking for ttm, xe and amdgpu driver (part 2) Dave Airlie
2026-07-06  2:36 ` [PATCH 02/10] ttm: add a memcg accounting flag to the alloc/populate APIs Dave Airlie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1c4e53bef3e6cdce4edf97352d9f5e04ce0c69a6.camel@linux.intel.com \
    --to=thomas.hellstrom@linux.intel.com \
    --cc=airlied@gmail.com \
    --cc=cgroups@vger.kernel.org \
    --cc=christian.koenig@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hannes@cmpxchg.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=longman@redhat.com \
    --cc=mhocko@kernel.org \
    --cc=muchun.song@linux.dev \
    --cc=roman.gushchin@linux.dev \
    --cc=shakeel.butt@linux.dev \
    --cc=simona@ffwll.ch \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox