diff mbox series

[v9,02/10] drm/sched: store the drm client_id in drm_sched_fence

Message ID 20250424083834.15518-3-pierre-eric.pelloux-prayer@amd.com
State New
Headers show
Series None | expand

Commit Message

Pierre-Eric Pelloux-Prayer April 24, 2025, 8:38 a.m. UTC
This will be used in a later commit to trace the drm client_id in
some of the gpu_scheduler trace events.

This requires changing all the users of drm_sched_job_init to
add an extra parameter.

The newly added drm_client_id field in the drm_sched_fence is a bit
of a duplicate of the owner one. One suggestion I received was to
merge those 2 fields - this can't be done right now as amdgpu uses
some special values (AMDGPU_FENCE_OWNER_*) that can't really be
translated into a client id. Christian is working on getting rid of
those; when it's done we should be able to squash owner/drm_client_id
together.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
---
 drivers/accel/amdxdna/aie2_ctx.c                 |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c       |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c           |  3 ++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_job.c          |  8 +++++---
 drivers/gpu/drm/amd/amdgpu/amdgpu_job.h          |  3 ++-
 drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c     |  2 +-
 drivers/gpu/drm/imagination/pvr_job.c            |  2 +-
 drivers/gpu/drm/imagination/pvr_queue.c          |  5 +++--
 drivers/gpu/drm/imagination/pvr_queue.h          |  2 +-
 drivers/gpu/drm/lima/lima_gem.c                  |  2 +-
 drivers/gpu/drm/lima/lima_sched.c                |  6 ++++--
 drivers/gpu/drm/lima/lima_sched.h                |  3 ++-
 drivers/gpu/drm/msm/msm_gem_submit.c             |  8 +++++---
 drivers/gpu/drm/nouveau/nouveau_sched.c          |  3 ++-
 drivers/gpu/drm/panfrost/panfrost_drv.c          |  2 +-
 drivers/gpu/drm/panthor/panthor_drv.c            |  3 ++-
 drivers/gpu/drm/panthor/panthor_mmu.c            |  2 +-
 drivers/gpu/drm/panthor/panthor_sched.c          |  5 +++--
 drivers/gpu/drm/panthor/panthor_sched.h          |  3 ++-
 drivers/gpu/drm/scheduler/sched_fence.c          |  4 +++-
 drivers/gpu/drm/scheduler/sched_internal.h       |  2 +-
 drivers/gpu/drm/scheduler/sched_main.c           |  6 ++++--
 drivers/gpu/drm/scheduler/tests/mock_scheduler.c |  2 +-
 drivers/gpu/drm/v3d/v3d_submit.c                 |  2 +-
 drivers/gpu/drm/xe/xe_sched_job.c                |  3 ++-
 include/drm/gpu_scheduler.h                      | 10 +++++++++-
 26 files changed, 62 insertions(+), 34 deletions(-)

Comments

Philipp Stanner May 14, 2025, 12:44 p.m. UTC | #1
On Thu, 2025-04-24 at 10:38 +0200, Pierre-Eric Pelloux-Prayer wrote:
> This will be used in a later commit to trace the drm client_id in
> some of the gpu_scheduler trace events.
> 
> This requires changing all the users of drm_sched_job_init to
> add an extra parameter.
> 
> The newly added drm_client_id field in the drm_sched_fence is a bit
> of a duplicate of the owner one. One suggestion I received was to
> merge those 2 fields - this can't be done right now as amdgpu uses
> some special values (AMDGPU_FENCE_OWNER_*) that can't really be
> translated into a client id. Christian is working on getting rid of
> those; when it's done we should be able to squash owner/drm_client_id
> together.
> 
> Reviewed-by: Christian König <christian.koenig@amd.com>
> Signed-off-by: Pierre-Eric Pelloux-Prayer
> <pierre-eric.pelloux-prayer@amd.com>
> ---
>  drivers/accel/amdxdna/aie2_ctx.c                 |  3 ++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c       |  2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c           |  3 ++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_job.c          |  8 +++++---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_job.h          |  3 ++-
>  drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c     |  2 +-
>  drivers/gpu/drm/imagination/pvr_job.c            |  2 +-
>  drivers/gpu/drm/imagination/pvr_queue.c          |  5 +++--
>  drivers/gpu/drm/imagination/paac             |  8 +++++---
>  drivers/gpu/drm/nouveau/nouveau_sched.c          |  3 ++-
>  drivers/gpu/drm/panfrost/panfrost_drv.c          |  2 +-
>  drivers/gpu/drm/panthor/panthor_drv.c            |  3 ++-
>  drivers/gpu/drm/panthor/panthor_mmu.c            |  2 +-
>  drivers/gpu/drm/panthor/panthor_sched.c          |  5 +++--
>  drivers/gpu/drm/panthor/panthor_sched.h          |  3 ++-
>  drivers/gpu/drm/scheduler/sched_fence.c          |  4 ++
>  drivers/gpu/drm/scheduler/sched_internal.h       |  2 +-
>  drivers/gpu/drm/scheduler/sched_main.c           |  6 ++++--
>  drivers/gpu/drm/scheduler/tests/mock_scheduler.c |  2 +-
>  drivers/gpu/drm/v3d/v3d_submit.c                 |  2 +-
>  drivers/gpu/drm/xe/xe_sched_job.c                |  3 ++-
>  include/drm/gpu_scheduler.h                      | 10 +++++++++-
>  26 files changed, 62 insertions(+), 34 deletions(-)

I think last time I asked about what your merge plan for this is, since
it touches so many drivers. Should I take that?

Besides one comment below, scheduler bits look fine.

> 
> diff --git a/drivers/accel/amdxdna/aie2_ctx.c
> b/drivers/accel/amdxdna/aie2_ctx.c
> index e04549f64d69..3e38a5f637ea 100644
> --- a/drivers/accel/amdxdna/aie2_ctx.c
> +++ b/drivers/accel/amdxdna/aie2_ctx.c
> @@ -848,7 +848,8 @@ int aie2_cmd_submit(struct amdxdna_hwctx *hwctx,
> struct amdxdna_sched_job *job,
>  		goto up_sem;
>  	}
>  
> -	ret = drm_sched_job_init(&job->base, &hwctx->priv->entity,
> 1, hwctx);
> +	ret = drm_sched_job_init(&job->base, &hwctx->priv->entity,
> 1, hwctx,
> +				 hwctx->client->filp->client_id);
>  	if (ret) {
>  		XDNA_ERR(xdna, "DRM job init failed, ret %d", ret);
>  		goto free_chain;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> index 4cec3a873995..1a77ba7036c9 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
> @@ -639,7 +639,7 @@ int amdgpu_amdkfd_submit_ib(struct amdgpu_device
> *adev,
>  		goto err;
>  	}
>  
> -	ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job);
> +	ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job, 0);
>  	if (ret)
>  		goto err;
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index 82df06a72ee0..5a231b997d65 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -293,7 +293,8 @@ static int amdgpu_cs_pass1(struct
> amdgpu_cs_parser *p,
>  
>  	for (i = 0; i < p->gang_size; ++i) {
>  		ret = amdgpu_job_alloc(p->adev, vm, p->entities[i],
> vm,
> -				       num_ibs[i], &p->jobs[i]);
> +				       num_ibs[i], &p->jobs[i],
> +				       p->filp->client_id);
>  		if (ret)
>  			goto free_all_kdata;
>  		p->jobs[i]->enforce_isolation = p->adev-
> >enforce_isolation[fpriv->xcp_id];
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> index acb21fc8b3ce..75262ce8db27 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
> @@ -204,7 +204,8 @@ static enum drm_gpu_sched_stat
> amdgpu_job_timedout(struct drm_sched_job *s_job)
>  
>  int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm
> *vm,
>  		     struct drm_sched_entity *entity, void *owner,
> -		     unsigned int num_ibs, struct amdgpu_job **job)
> +		     unsigned int num_ibs, struct amdgpu_job **job,
> +		     u64 drm_client_id)
>  {
>  	if (num_ibs == 0)
>  		return -EINVAL;
> @@ -222,7 +223,8 @@ int amdgpu_job_alloc(struct amdgpu_device *adev,
> struct amdgpu_vm *vm,
>  	if (!entity)
>  		return 0;
>  
> -	return drm_sched_job_init(&(*job)->base, entity, 1, owner);
> +	return drm_sched_job_init(&(*job)->base, entity, 1, owner,
> +				  drm_client_id);
>  }
>  
>  int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev,
> @@ -232,7 +234,7 @@ int amdgpu_job_alloc_with_ib(struct amdgpu_device
> *adev,
>  {
>  	int r;
>  
> -	r = amdgpu_job_alloc(adev, NULL, entity, owner, 1, job);
> +	r = amdgpu_job_alloc(adev, NULL, entity, owner, 1, job, 0);
>  	if (r)
>  		return r;
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
> index ce6b9ba967ff..5a8bc6342222 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
> @@ -90,7 +90,8 @@ static inline struct amdgpu_ring
> *amdgpu_job_ring(struct amdgpu_job *job)
>  
>  int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm
> *vm,
>  		     struct drm_sched_entity *entity, void *owner,
> -		     unsigned int num_ibs, struct amdgpu_job **job);
> +		     unsigned int num_ibs, struct amdgpu_job **job,
> +		     u64 drm_client_id);
>  int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev,
>  			     struct drm_sched_entity *entity, void
> *owner,
>  			     size_t size, enum amdgpu_ib_pool_type
> pool_type,
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> index 3c0a5c3e0e3d..76c742328edb 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> @@ -534,7 +534,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device
> *dev, void *data,
>  
>  	ret = drm_sched_job_init(&submit->sched_job,
>  				 &ctx->sched_entity[args->pipe],
> -				 1, submit->ctx);
> +				 1, submit->ctx, file->client_id);
>  	if (ret)
>  		goto err_submit_put;
>  
> diff --git a/drivers/gpu/drm/imagination/pvr_job.c
> b/drivers/gpu/drm/imagination/pvr_job.c
> index 59b334d094fa..7564b0f21b42 100644
> --- a/drivers/gpu/drm/imagination/pvr_job.c
> +++ b/drivers/gpu/drm/imagination/pvr_job.c
> @@ -446,7 +446,7 @@ create_job(struct pvr_device *pvr_dev,
>  	if (err)
>  		goto err_put_job;
>  
> -	err = pvr_queue_job_init(job);
> +	err = pvr_queue_job_init(job, pvr_file->file->client_id);
>  	if (err)
>  		goto err_put_job;
>  
> diff --git a/drivers/gpu/drm/imagination/pvr_queue.c
> b/drivers/gpu/drm/imagination/pvr_queue.c
> index 5e9bc0992824..5a41ee79fed6 100644
> --- a/drivers/gpu/drm/imagination/pvr_queue.c
> +++ b/drivers/gpu/drm/imagination/pvr_queue.c
> @@ -1073,6 +1073,7 @@ static int pvr_queue_cleanup_fw_context(struct
> pvr_queue *queue)
>  /**
>   * pvr_queue_job_init() - Initialize queue related fields in a
> pvr_job object.
>   * @job: The job to initialize.
> + * @drm_client_id: drm_file.client_id submitting the job
>   *
>   * Bind the job to a queue and allocate memory to guarantee
> pvr_queue_job_arm()
>   * and pvr_queue_job_push() can't fail. We also make sure the
> context type is
> @@ -1082,7 +1083,7 @@ static int pvr_queue_cleanup_fw_context(struct
> pvr_queue *queue)
>   *  * 0 on success, or
>   *  * An error code if something failed.
>   */
> -int pvr_queue_job_init(struct pvr_job *job)
> +int pvr_queue_job_init(struct pvr_job *job, u64 drm_client_id)
>  {
>  	/* Fragment jobs need at least one native fence wait on the
> geometry job fence. */
>  	u32 min_native_dep_count = job->type ==
> DRM_PVR_JOB_TYPE_FRAGMENT ? 1 : 0;
> @@ -1099,7 +1100,7 @@ int pvr_queue_job_init(struct pvr_job *job)
>  	if (!pvr_cccb_cmdseq_can_fit(&queue->cccb,
> job_cmds_size(job, min_native_dep_count)))
>  		return -E2BIG;
>  
> -	err = drm_sched_job_init(&job->base, &queue->entity, 1,
> THIS_MODULE);
> +	err = drm_sched_job_init(&job->base, &queue->entity, 1,
> THIS_MODULE, drm_client_id);
>  	if (err)
>  		return err;
>  
> diff --git a/drivers/gpu/drm/imagination/pvr_queue.h
> b/drivers/gpu/drm/imagination/pvr_queue.h
> index 93fe9ac9f58c..fc1986d73fc8 100644
> --- a/drivers/gpu/drm/imagination/pvr_queue.h
> +++ b/drivers/gpu/drm/imagination/pvr_queue.h
> @@ -143,7 +143,7 @@ struct pvr_queue {
>  
>  bool pvr_queue_fence_is_ufo_backed(struct dma_fence *f);
>  
> -int pvr_queue_job_init(struct pvr_job *job);
> +int pvr_queue_job_init(struct pvr_job *job, u64 drm_client_id);
>  
>  void pvr_queue_job_cleanup(struct pvr_job *job);
>  
> diff --git a/drivers/gpu/drm/lima/lima_gem.c
> b/drivers/gpu/drm/lima/lima_gem.c
> index 5deec673c11e..9722b847a539 100644
> --- a/drivers/gpu/drm/lima/lima_gem.c
> +++ b/drivers/gpu/drm/lima/lima_gem.c
> @@ -341,7 +341,7 @@ int lima_gem_submit(struct drm_file *file, struct
> lima_submit *submit)
>  
>  	err = lima_sched_task_init(
>  		submit->task, submit->ctx->context + submit->pipe,
> -		bos, submit->nr_bos, vm);
> +		bos, submit->nr_bos, vm, file->client_id);
>  	if (err)
>  		goto err_out1;
>  
> diff --git a/drivers/gpu/drm/lima/lima_sched.c
> b/drivers/gpu/drm/lima/lima_sched.c
> index 7934098e651b..954f4325b859 100644
> --- a/drivers/gpu/drm/lima/lima_sched.c
> +++ b/drivers/gpu/drm/lima/lima_sched.c
> @@ -113,7 +113,8 @@ static inline struct lima_sched_pipe
> *to_lima_pipe(struct drm_gpu_scheduler *sch
>  int lima_sched_task_init(struct lima_sched_task *task,
>  			 struct lima_sched_context *context,
>  			 struct lima_bo **bos, int num_bos,
> -			 struct lima_vm *vm)
> +			 struct lima_vm *vm,
> +			 u64 drm_client_id)
>  {
>  	int err, i;
>  
> @@ -124,7 +125,8 @@ int lima_sched_task_init(struct lima_sched_task
> *task,
>  	for (i = 0; i < num_bos; i++)
>  		drm_gem_object_get(&bos[i]->base.base);
>  
> -	err = drm_sched_job_init(&task->base, &context->base, 1,
> vm);
> +	err = drm_sched_job_init(&task->base, &context->base, 1, vm,
> +				 drm_client_id);
>  	if (err) {
>  		kfree(task->bos);
>  		return err;
> diff --git a/drivers/gpu/drm/lima/lima_sched.h
> b/drivers/gpu/drm/lima/lima_sched.h
> index 85b23ba901d5..1a08faf8a529 100644
> --- a/drivers/gpu/drm/lima/lima_sched.h
> +++ b/drivers/gpu/drm/lima/lima_sched.h
> @@ -88,7 +88,8 @@ struct lima_sched_pipe {
>  int lima_sched_task_init(struct lima_sched_task *task,
>  			 struct lima_sched_context *context,
>  			 struct lima_bo **bos, int num_bos,
> -			 struct lima_vm *vm);
> +			 struct lima_vm *vm,
> +			 u64 drm_client_id);
>  void lima_sched_task_fini(struct lima_sched_task *task);
>  
>  int lima_sched_context_init(struct lima_sched_pipe *pipe,
> diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c
> b/drivers/gpu/drm/msm/msm_gem_submit.c
> index 3e9aa2cc38ef..d9be0fe3d674 100644
> --- a/drivers/gpu/drm/msm/msm_gem_submit.c
> +++ b/drivers/gpu/drm/msm/msm_gem_submit.c
> @@ -30,7 +30,7 @@
>  static struct msm_gem_submit *submit_create(struct drm_device *dev,
>  		struct msm_gpu *gpu,
>  		struct msm_gpu_submitqueue *queue, uint32_t nr_bos,
> -		uint32_t nr_cmds)
> +		uint32_t nr_cmds, u64 drm_client_id)
>  {
>  	static atomic_t ident = ATOMIC_INIT(0);
>  	struct msm_gem_submit *submit;
> @@ -54,7 +54,8 @@ static struct msm_gem_submit *submit_create(struct
> drm_device *dev,
>  		return ERR_PTR(ret);
>  	}
>  
> -	ret = drm_sched_job_init(&submit->base, queue->entity, 1,
> queue);
> +	ret = drm_sched_job_init(&submit->base, queue->entity, 1,
> queue,
> +				 drm_client_id);
>  	if (ret) {
>  		kfree(submit->hw_fence);
>  		kfree(submit);
> @@ -693,7 +694,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev,
> void *data,
>  		}
>  	}
>  
> -	submit = submit_create(dev, gpu, queue, args->nr_bos, args-
> >nr_cmds);
> +	submit = submit_create(dev, gpu, queue, args->nr_bos, args-
> >nr_cmds,
> +			       file->client_id);
>  	if (IS_ERR(submit)) {
>  		ret = PTR_ERR(submit);
>  		goto out_post_unlock;
> diff --git a/drivers/gpu/drm/nouveau/nouveau_sched.c
> b/drivers/gpu/drm/nouveau/nouveau_sched.c
> index d326e55d2d24..460a5fb02412 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_sched.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_sched.c
> @@ -87,7 +87,8 @@ nouveau_job_init(struct nouveau_job *job,
>  	}
>  
>  	ret = drm_sched_job_init(&job->base, &sched->entity,
> -				 args->credits, NULL);
> +				 args->credits, NULL,
> +				 job->file_priv->client_id);
>  	if (ret)
>  		goto err_free_chains;
>  
> diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c
> b/drivers/gpu/drm/panfrost/panfrost_drv.c
> index b87f83e94eda..d5c2c6530ed8 100644
> --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
> +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
> @@ -312,7 +312,7 @@ static int panfrost_ioctl_submit(struct
> drm_device *dev, void *data,
>  
>  	ret = drm_sched_job_init(&job->base,
>  				 &file_priv->sched_entity[slot],
> -				 1, NULL);
> +				 1, NULL, file->client_id);
>  	if (ret)
>  		goto out_put_job;
>  
> diff --git a/drivers/gpu/drm/panthor/panthor_drv.c
> b/drivers/gpu/drm/panthor/panthor_drv.c
> index 06fe46e32073..bd8e1900c919 100644
> --- a/drivers/gpu/drm/panthor/panthor_drv.c
> +++ b/drivers/gpu/drm/panthor/panthor_drv.c
> @@ -989,7 +989,8 @@ static int panthor_ioctl_group_submit(struct
> drm_device *ddev, void *data,
>  		const struct drm_panthor_queue_submit *qsubmit =
> &jobs_args[i];
>  		struct drm_sched_job *job;
>  
> -		job = panthor_job_create(pfile, args->group_handle,
> qsubmit);
> +		job = panthor_job_create(pfile, args->group_handle,
> qsubmit,
> +					 file->client_id);
>  		if (IS_ERR(job)) {
>  			ret = PTR_ERR(job);
>  			goto out_cleanup_submit_ctx;
> diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c
> b/drivers/gpu/drm/panthor/panthor_mmu.c
> index 12a02e28f50f..e0c79bd2d173 100644
> --- a/drivers/gpu/drm/panthor/panthor_mmu.c
> +++ b/drivers/gpu/drm/panthor/panthor_mmu.c
> @@ -2516,7 +2516,7 @@ panthor_vm_bind_job_create(struct drm_file
> *file,
>  	kref_init(&job->refcount);
>  	job->vm = panthor_vm_get(vm);
>  
> -	ret = drm_sched_job_init(&job->base, &vm->entity, 1, vm);
> +	ret = drm_sched_job_init(&job->base, &vm->entity, 1, vm,
> file->client_id);
>  	if (ret)
>  		goto err_put_job;
>  
> diff --git a/drivers/gpu/drm/panthor/panthor_sched.c
> b/drivers/gpu/drm/panthor/panthor_sched.c
> index 446ec780eb4a..2af860c9068a 100644
> --- a/drivers/gpu/drm/panthor/panthor_sched.c
> +++ b/drivers/gpu/drm/panthor/panthor_sched.c
> @@ -3729,7 +3729,8 @@ struct panthor_vm *panthor_job_vm(struct
> drm_sched_job *sched_job)
>  struct drm_sched_job *
>  panthor_job_create(struct panthor_file *pfile,
>  		   u16 group_handle,
> -		   const struct drm_panthor_queue_submit *qsubmit)
> +		   const struct drm_panthor_queue_submit *qsubmit,
> +		   u64 drm_client_id)
>  {
>  	struct panthor_group_pool *gpool = pfile->groups;
>  	struct panthor_job *job;
> @@ -3801,7 +3802,7 @@ panthor_job_create(struct panthor_file *pfile,
>  
>  	ret = drm_sched_job_init(&job->base,
>  				 &job->group->queues[job-
> >queue_idx]->entity,
> -				 credits, job->group);
> +				 credits, job->group,
> drm_client_id);
>  	if (ret)
>  		goto err_put_job;
>  
> diff --git a/drivers/gpu/drm/panthor/panthor_sched.h
> b/drivers/gpu/drm/panthor/panthor_sched.h
> index e650a445cf50..742b0b4ff3a3 100644
> --- a/drivers/gpu/drm/panthor/panthor_sched.h
> +++ b/drivers/gpu/drm/panthor/panthor_sched.h
> @@ -29,7 +29,8 @@ int panthor_group_get_state(struct panthor_file
> *pfile,
>  struct drm_sched_job *
>  panthor_job_create(struct panthor_file *pfile,
>  		   u16 group_handle,
> -		   const struct drm_panthor_queue_submit *qsubmit);
> +		   const struct drm_panthor_queue_submit *qsubmit,
> +		   u64 drm_client_id);
>  struct drm_sched_job *panthor_job_get(struct drm_sched_job *job);
>  struct panthor_vm *panthor_job_vm(struct drm_sched_job *sched_job);
>  void panthor_job_put(struct drm_sched_job *job);
> diff --git a/drivers/gpu/drm/scheduler/sched_fence.c
> b/drivers/gpu/drm/scheduler/sched_fence.c
> index e971528504a5..d208d384d38d 100644
> --- a/drivers/gpu/drm/scheduler/sched_fence.c
> +++ b/drivers/gpu/drm/scheduler/sched_fence.c
> @@ -206,7 +206,8 @@ struct drm_sched_fence *to_drm_sched_fence(struct
> dma_fence *f)
>  EXPORT_SYMBOL(to_drm_sched_fence);
>  
>  struct drm_sched_fence *drm_sched_fence_alloc(struct
> drm_sched_entity *entity,
> -					      void *owner)
> +					      void *owner,
> +					      u64 drm_client_id)
>  {
>  	struct drm_sched_fence *fence = NULL;
>  
> @@ -215,6 +216,7 @@ struct drm_sched_fence
> *drm_sched_fence_alloc(struct drm_sched_entity *entity,
>  		return NULL;
>  
>  	fence->owner = owner;
> +	fence->drm_client_id = drm_client_id;
>  	spin_lock_init(&fence->lock);
>  
>  	return fence;
> diff --git a/drivers/gpu/drm/scheduler/sched_internal.h
> b/drivers/gpu/drm/scheduler/sched_internal.h
> index 599cf6e1bb74..7ea5a6736f98 100644
> --- a/drivers/gpu/drm/scheduler/sched_internal.h
> +++ b/drivers/gpu/drm/scheduler/sched_internal.h
> @@ -24,7 +24,7 @@ void drm_sched_entity_select_rq(struct
> drm_sched_entity *entity);
>  struct drm_sched_job *drm_sched_entity_pop_job(struct
> drm_sched_entity *entity);
>  
>  struct drm_sched_fence *drm_sched_fence_alloc(struct
> drm_sched_entity *s_entity,
> -					      void *owner);
> +					      void *owner, u64
> drm_client_id);
>  void drm_sched_fence_init(struct drm_sched_fence *fence,
>  			  struct drm_sched_entity *entity);
>  void drm_sched_fence_free(struct drm_sched_fence *fence);
> diff --git a/drivers/gpu/drm/scheduler/sched_main.c
> b/drivers/gpu/drm/scheduler/sched_main.c
> index 829579c41c6b..60611618f3ab 100644
> --- a/drivers/gpu/drm/scheduler/sched_main.c
> +++ b/drivers/gpu/drm/scheduler/sched_main.c
> @@ -764,6 +764,7 @@ EXPORT_SYMBOL(drm_sched_resubmit_jobs);
>   * @credits: the number of credits this job contributes to the
> schedulers
>   * credit limit
>   * @owner: job owner for debugging
> + * @drm_client_id: drm_file.client_id of the owner

For the docu generation to link that properly it must be written as

&struct drm_file.client_id

Besides, if this were an optional parameter, one should document it.
I'm not sure if it is, I haven't used these client_id's before.

P.

>   *
>   * Refer to drm_sched_entity_push_job() documentation
>   * for locking considerations.
> @@ -784,7 +785,8 @@ EXPORT_SYMBOL(drm_sched_resubmit_jobs);
>   */
>  int drm_sched_job_init(struct drm_sched_job *job,
>  		       struct drm_sched_entity *entity,
> -		       u32 credits, void *owner)
> +		       u32 credits, void *owner,
> +		       uint64_t drm_client_id)
>  {
>  	if (!entity->rq) {
>  		/* This will most likely be followed by missing
> frames
> @@ -810,7 +812,7 @@ int drm_sched_job_init(struct drm_sched_job *job,
>  
>  	job->entity = entity;
>  	job->credits = credits;
> -	job->s_fence = drm_sched_fence_alloc(entity, owner);
> +	job->s_fence = drm_sched_fence_alloc(entity, owner,
> drm_client_id);
>  	if (!job->s_fence)
>  		return -ENOMEM;
>  
> diff --git a/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
> b/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
> index f999c8859cf7..09ffbdb32d76 100644
> --- a/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
> +++ b/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
> @@ -35,7 +35,7 @@ drm_mock_sched_entity_new(struct kunit *test,
>  	ret = drm_sched_entity_init(&entity->base,
>  				    priority,
>  				    &drm_sched, 1,
> -				    NULL);
> +				    NULL, 1);
>  	KUNIT_ASSERT_EQ(test, ret, 0);
>  
>  	entity->test = test;
> diff --git a/drivers/gpu/drm/v3d/v3d_submit.c
> b/drivers/gpu/drm/v3d/v3d_submit.c
> index 4ff5de46fb22..5171ffe9012d 100644
> --- a/drivers/gpu/drm/v3d/v3d_submit.c
> +++ b/drivers/gpu/drm/v3d/v3d_submit.c
> @@ -169,7 +169,7 @@ v3d_job_init(struct v3d_dev *v3d, struct drm_file
> *file_priv,
>  	job->file = file_priv;
>  
>  	ret = drm_sched_job_init(&job->base, &v3d_priv-
> >sched_entity[queue],
> -				 1, v3d_priv);
> +				 1, v3d_priv, file_priv->client_id);
>  	if (ret)
>  		return ret;
>  
> diff --git a/drivers/gpu/drm/xe/xe_sched_job.c
> b/drivers/gpu/drm/xe/xe_sched_job.c
> index 1905ca590965..f4679cb9a56b 100644
> --- a/drivers/gpu/drm/xe/xe_sched_job.c
> +++ b/drivers/gpu/drm/xe/xe_sched_job.c
> @@ -113,7 +113,8 @@ struct xe_sched_job *xe_sched_job_create(struct
> xe_exec_queue *q,
>  	kref_init(&job->refcount);
>  	xe_exec_queue_get(job->q);
>  
> -	err = drm_sched_job_init(&job->drm, q->entity, 1, NULL);
> +	err = drm_sched_job_init(&job->drm, q->entity, 1, NULL,
> +				 q->xef->drm->client_id);
>  	if (err)
>  		goto err_free;
>  
> diff --git a/include/drm/gpu_scheduler.h
> b/include/drm/gpu_scheduler.h
> index 1a7e377d4cbb..6fe3b4c0cffb 100644
> --- a/include/drm/gpu_scheduler.h
> +++ b/include/drm/gpu_scheduler.h
> @@ -305,6 +305,13 @@ struct drm_sched_fence {
>           * @owner: job owner for debugging
>           */
>  	void				*owner;
> +
> +	/**
> +	 * @drm_client_id:
> +	 *
> +	 * The client_id of the drm_file which owns the job.
> +	 */
> +	uint64_t			drm_client_id;
>  };
>  
>  struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f);
> @@ -629,7 +636,8 @@ drm_sched_pick_best(struct drm_gpu_scheduler
> **sched_list,
>  
>  int drm_sched_job_init(struct drm_sched_job *job,
>  		       struct drm_sched_entity *entity,
> -		       u32 credits, void *owner);
> +		       u32 credits, void *owner,
> +		       u64 drm_client_id);
>  void drm_sched_job_arm(struct drm_sched_job *job);
>  void drm_sched_entity_push_job(struct drm_sched_job *sched_job);
>  int drm_sched_job_add_dependency(struct drm_sched_job *job,
Pierre-Eric Pelloux-Prayer May 15, 2025, 6:53 a.m. UTC | #2
Hi,

Le 14/05/2025 à 14:44, Philipp Stanner a écrit :
> On Thu, 2025-04-24 at 10:38 +0200, Pierre-Eric Pelloux-Prayer wrote:
>> This will be used in a later commit to trace the drm client_id in
>> some of the gpu_scheduler trace events.
>>
>> This requires changing all the users of drm_sched_job_init to
>> add an extra parameter.
>>
>> The newly added drm_client_id field in the drm_sched_fence is a bit
>> of a duplicate of the owner one. One suggestion I received was to
>> merge those 2 fields - this can't be done right now as amdgpu uses
>> some special values (AMDGPU_FENCE_OWNER_*) that can't really be
>> translated into a client id. Christian is working on getting rid of
>> those; when it's done we should be able to squash owner/drm_client_id
>> together.
>>
>> Reviewed-by: Christian König <christian.koenig@amd.com>
>> Signed-off-by: Pierre-Eric Pelloux-Prayer
>> <pierre-eric.pelloux-prayer@amd.com>
>> ---
>>   drivers/accel/amdxdna/aie2_ctx.c                 |  3 ++-
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c       |  2 +-
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c           |  3 ++-
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_job.c          |  8 +++++---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_job.h          |  3 ++-
>>   drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c     |  2 +-
>>   drivers/gpu/drm/imagination/pvr_job.c            |  2 +-
>>   drivers/gpu/drm/imagination/pvr_queue.c          |  5 +++--
>>   drivers/gpu/drm/imagination/paac             |  8 +++++---
>>   drivers/gpu/drm/nouveau/nouveau_sched.c          |  3 ++-
>>   drivers/gpu/drm/panfrost/panfrost_drv.c          |  2 +-
>>   drivers/gpu/drm/panthor/panthor_drv.c            |  3 ++-
>>   drivers/gpu/drm/panthor/panthor_mmu.c            |  2 +-
>>   drivers/gpu/drm/panthor/panthor_sched.c          |  5 +++--
>>   drivers/gpu/drm/panthor/panthor_sched.h          |  3 ++-
>>   drivers/gpu/drm/scheduler/sched_fence.c          |  4 ++
>>   drivers/gpu/drm/scheduler/sched_internal.h       |  2 +-
>>   drivers/gpu/drm/scheduler/sched_main.c           |  6 ++++--
>>   drivers/gpu/drm/scheduler/tests/mock_scheduler.c |  2 +-
>>   drivers/gpu/drm/v3d/v3d_submit.c                 |  2 +-
>>   drivers/gpu/drm/xe/xe_sched_job.c                |  3 ++-
>>   include/drm/gpu_scheduler.h                      | 10 +++++++++-
>>   26 files changed, 62 insertions(+), 34 deletions(-)
> 
> I think last time I asked about what your merge plan for this is, since
> it touches so many drivers. Should I take that?

Based on:

https://drm.pages.freedesktop.org/maintainer-tools/committer/committer-drm-misc.html

"drm-misc is for drm core (non-driver) patches, subsystem-wide refactorings,
and small trivial patches all over (including drivers)."

I assume it should go through drm-misc.


> 
> Besides one comment below, scheduler bits look fine.
> 
>>
>> diff --git a/drivers/accel/amdxdna/aie2_ctx.c
>> b/drivers/accel/amdxdna/aie2_ctx.c
>> index e04549f64d69..3e38a5f637ea 100644
>> --- a/drivers/accel/amdxdna/aie2_ctx.c
>> +++ b/drivers/accel/amdxdna/aie2_ctx.c
>> @@ -848,7 +848,8 @@ int aie2_cmd_submit(struct amdxdna_hwctx *hwctx,
>> struct amdxdna_sched_job *job,
>>   		goto up_sem;
>>   	}
>>   
>> -	ret = drm_sched_job_init(&job->base, &hwctx->priv->entity,
>> 1, hwctx);
>> +	ret = drm_sched_job_init(&job->base, &hwctx->priv->entity,
>> 1, hwctx,
>> +				 hwctx->client->filp->client_id);
>>   	if (ret) {
>>   		XDNA_ERR(xdna, "DRM job init failed, ret %d", ret);
>>   		goto free_chain;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
>> index 4cec3a873995..1a77ba7036c9 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
>> @@ -639,7 +639,7 @@ int amdgpu_amdkfd_submit_ib(struct amdgpu_device
>> *adev,
>>   		goto err;
>>   	}
>>   
>> -	ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job);
>> +	ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job, 0);
>>   	if (ret)
>>   		goto err;
>>   
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> index 82df06a72ee0..5a231b997d65 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> @@ -293,7 +293,8 @@ static int amdgpu_cs_pass1(struct
>> amdgpu_cs_parser *p,
>>   
>>   	for (i = 0; i < p->gang_size; ++i) {
>>   		ret = amdgpu_job_alloc(p->adev, vm, p->entities[i],
>> vm,
>> -				       num_ibs[i], &p->jobs[i]);
>> +				       num_ibs[i], &p->jobs[i],
>> +				       p->filp->client_id);
>>   		if (ret)
>>   			goto free_all_kdata;
>>   		p->jobs[i]->enforce_isolation = p->adev-
>>> enforce_isolation[fpriv->xcp_id];
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>> index acb21fc8b3ce..75262ce8db27 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>> @@ -204,7 +204,8 @@ static enum drm_gpu_sched_stat
>> amdgpu_job_timedout(struct drm_sched_job *s_job)
>>   
>>   int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm
>> *vm,
>>   		     struct drm_sched_entity *entity, void *owner,
>> -		     unsigned int num_ibs, struct amdgpu_job **job)
>> +		     unsigned int num_ibs, struct amdgpu_job **job,
>> +		     u64 drm_client_id)
>>   {
>>   	if (num_ibs == 0)
>>   		return -EINVAL;
>> @@ -222,7 +223,8 @@ int amdgpu_job_alloc(struct amdgpu_device *adev,
>> struct amdgpu_vm *vm,
>>   	if (!entity)
>>   		return 0;
>>   
>> -	return drm_sched_job_init(&(*job)->base, entity, 1, owner);
>> +	return drm_sched_job_init(&(*job)->base, entity, 1, owner,
>> +				  drm_client_id);
>>   }
>>   
>>   int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev,
>> @@ -232,7 +234,7 @@ int amdgpu_job_alloc_with_ib(struct amdgpu_device
>> *adev,
>>   {
>>   	int r;
>>   
>> -	r = amdgpu_job_alloc(adev, NULL, entity, owner, 1, job);
>> +	r = amdgpu_job_alloc(adev, NULL, entity, owner, 1, job, 0);
>>   	if (r)
>>   		return r;
>>   
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
>> index ce6b9ba967ff..5a8bc6342222 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
>> @@ -90,7 +90,8 @@ static inline struct amdgpu_ring
>> *amdgpu_job_ring(struct amdgpu_job *job)
>>   
>>   int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm
>> *vm,
>>   		     struct drm_sched_entity *entity, void *owner,
>> -		     unsigned int num_ibs, struct amdgpu_job **job);
>> +		     unsigned int num_ibs, struct amdgpu_job **job,
>> +		     u64 drm_client_id);
>>   int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev,
>>   			     struct drm_sched_entity *entity, void
>> *owner,
>>   			     size_t size, enum amdgpu_ib_pool_type
>> pool_type,
>> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
>> b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
>> index 3c0a5c3e0e3d..76c742328edb 100644
>> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
>> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
>> @@ -534,7 +534,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device
>> *dev, void *data,
>>   
>>   	ret = drm_sched_job_init(&submit->sched_job,
>>   				 &ctx->sched_entity[args->pipe],
>> -				 1, submit->ctx);
>> +				 1, submit->ctx, file->client_id);
>>   	if (ret)
>>   		goto err_submit_put;
>>   
>> diff --git a/drivers/gpu/drm/imagination/pvr_job.c
>> b/drivers/gpu/drm/imagination/pvr_job.c
>> index 59b334d094fa..7564b0f21b42 100644
>> --- a/drivers/gpu/drm/imagination/pvr_job.c
>> +++ b/drivers/gpu/drm/imagination/pvr_job.c
>> @@ -446,7 +446,7 @@ create_job(struct pvr_device *pvr_dev,
>>   	if (err)
>>   		goto err_put_job;
>>   
>> -	err = pvr_queue_job_init(job);
>> +	err = pvr_queue_job_init(job, pvr_file->file->client_id);
>>   	if (err)
>>   		goto err_put_job;
>>   
>> diff --git a/drivers/gpu/drm/imagination/pvr_queue.c
>> b/drivers/gpu/drm/imagination/pvr_queue.c
>> index 5e9bc0992824..5a41ee79fed6 100644
>> --- a/drivers/gpu/drm/imagination/pvr_queue.c
>> +++ b/drivers/gpu/drm/imagination/pvr_queue.c
>> @@ -1073,6 +1073,7 @@ static int pvr_queue_cleanup_fw_context(struct
>> pvr_queue *queue)
>>   /**
>>    * pvr_queue_job_init() - Initialize queue related fields in a
>> pvr_job object.
>>    * @job: The job to initialize.
>> + * @drm_client_id: drm_file.client_id submitting the job
>>    *
>>    * Bind the job to a queue and allocate memory to guarantee
>> pvr_queue_job_arm()
>>    * and pvr_queue_job_push() can't fail. We also make sure the
>> context type is
>> @@ -1082,7 +1083,7 @@ static int pvr_queue_cleanup_fw_context(struct
>> pvr_queue *queue)
>>    *  * 0 on success, or
>>    *  * An error code if something failed.
>>    */
>> -int pvr_queue_job_init(struct pvr_job *job)
>> +int pvr_queue_job_init(struct pvr_job *job, u64 drm_client_id)
>>   {
>>   	/* Fragment jobs need at least one native fence wait on the
>> geometry job fence. */
>>   	u32 min_native_dep_count = job->type ==
>> DRM_PVR_JOB_TYPE_FRAGMENT ? 1 : 0;
>> @@ -1099,7 +1100,7 @@ int pvr_queue_job_init(struct pvr_job *job)
>>   	if (!pvr_cccb_cmdseq_can_fit(&queue->cccb,
>> job_cmds_size(job, min_native_dep_count)))
>>   		return -E2BIG;
>>   
>> -	err = drm_sched_job_init(&job->base, &queue->entity, 1,
>> THIS_MODULE);
>> +	err = drm_sched_job_init(&job->base, &queue->entity, 1,
>> THIS_MODULE, drm_client_id);
>>   	if (err)
>>   		return err;
>>   
>> diff --git a/drivers/gpu/drm/imagination/pvr_queue.h
>> b/drivers/gpu/drm/imagination/pvr_queue.h
>> index 93fe9ac9f58c..fc1986d73fc8 100644
>> --- a/drivers/gpu/drm/imagination/pvr_queue.h
>> +++ b/drivers/gpu/drm/imagination/pvr_queue.h
>> @@ -143,7 +143,7 @@ struct pvr_queue {
>>   
>>   bool pvr_queue_fence_is_ufo_backed(struct dma_fence *f);
>>   
>> -int pvr_queue_job_init(struct pvr_job *job);
>> +int pvr_queue_job_init(struct pvr_job *job, u64 drm_client_id);
>>   
>>   void pvr_queue_job_cleanup(struct pvr_job *job);
>>   
>> diff --git a/drivers/gpu/drm/lima/lima_gem.c
>> b/drivers/gpu/drm/lima/lima_gem.c
>> index 5deec673c11e..9722b847a539 100644
>> --- a/drivers/gpu/drm/lima/lima_gem.c
>> +++ b/drivers/gpu/drm/lima/lima_gem.c
>> @@ -341,7 +341,7 @@ int lima_gem_submit(struct drm_file *file, struct
>> lima_submit *submit)
>>   
>>   	err = lima_sched_task_init(
>>   		submit->task, submit->ctx->context + submit->pipe,
>> -		bos, submit->nr_bos, vm);
>> +		bos, submit->nr_bos, vm, file->client_id);
>>   	if (err)
>>   		goto err_out1;
>>   
>> diff --git a/drivers/gpu/drm/lima/lima_sched.c
>> b/drivers/gpu/drm/lima/lima_sched.c
>> index 7934098e651b..954f4325b859 100644
>> --- a/drivers/gpu/drm/lima/lima_sched.c
>> +++ b/drivers/gpu/drm/lima/lima_sched.c
>> @@ -113,7 +113,8 @@ static inline struct lima_sched_pipe
>> *to_lima_pipe(struct drm_gpu_scheduler *sch
>>   int lima_sched_task_init(struct lima_sched_task *task,
>>   			 struct lima_sched_context *context,
>>   			 struct lima_bo **bos, int num_bos,
>> -			 struct lima_vm *vm)
>> +			 struct lima_vm *vm,
>> +			 u64 drm_client_id)
>>   {
>>   	int err, i;
>>   
>> @@ -124,7 +125,8 @@ int lima_sched_task_init(struct lima_sched_task
>> *task,
>>   	for (i = 0; i < num_bos; i++)
>>   		drm_gem_object_get(&bos[i]->base.base);
>>   
>> -	err = drm_sched_job_init(&task->base, &context->base, 1,
>> vm);
>> +	err = drm_sched_job_init(&task->base, &context->base, 1, vm,
>> +				 drm_client_id);
>>   	if (err) {
>>   		kfree(task->bos);
>>   		return err;
>> diff --git a/drivers/gpu/drm/lima/lima_sched.h
>> b/drivers/gpu/drm/lima/lima_sched.h
>> index 85b23ba901d5..1a08faf8a529 100644
>> --- a/drivers/gpu/drm/lima/lima_sched.h
>> +++ b/drivers/gpu/drm/lima/lima_sched.h
>> @@ -88,7 +88,8 @@ struct lima_sched_pipe {
>>   int lima_sched_task_init(struct lima_sched_task *task,
>>   			 struct lima_sched_context *context,
>>   			 struct lima_bo **bos, int num_bos,
>> -			 struct lima_vm *vm);
>> +			 struct lima_vm *vm,
>> +			 u64 drm_client_id);
>>   void lima_sched_task_fini(struct lima_sched_task *task);
>>   
>>   int lima_sched_context_init(struct lima_sched_pipe *pipe,
>> diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c
>> b/drivers/gpu/drm/msm/msm_gem_submit.c
>> index 3e9aa2cc38ef..d9be0fe3d674 100644
>> --- a/drivers/gpu/drm/msm/msm_gem_submit.c
>> +++ b/drivers/gpu/drm/msm/msm_gem_submit.c
>> @@ -30,7 +30,7 @@
>>   static struct msm_gem_submit *submit_create(struct drm_device *dev,
>>   		struct msm_gpu *gpu,
>>   		struct msm_gpu_submitqueue *queue, uint32_t nr_bos,
>> -		uint32_t nr_cmds)
>> +		uint32_t nr_cmds, u64 drm_client_id)
>>   {
>>   	static atomic_t ident = ATOMIC_INIT(0);
>>   	struct msm_gem_submit *submit;
>> @@ -54,7 +54,8 @@ static struct msm_gem_submit *submit_create(struct
>> drm_device *dev,
>>   		return ERR_PTR(ret);
>>   	}
>>   
>> -	ret = drm_sched_job_init(&submit->base, queue->entity, 1,
>> queue);
>> +	ret = drm_sched_job_init(&submit->base, queue->entity, 1,
>> queue,
>> +				 drm_client_id);
>>   	if (ret) {
>>   		kfree(submit->hw_fence);
>>   		kfree(submit);
>> @@ -693,7 +694,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev,
>> void *data,
>>   		}
>>   	}
>>   
>> -	submit = submit_create(dev, gpu, queue, args->nr_bos, args-
>>> nr_cmds);
>> +	submit = submit_create(dev, gpu, queue, args->nr_bos, args-
>>> nr_cmds,
>> +			       file->client_id);
>>   	if (IS_ERR(submit)) {
>>   		ret = PTR_ERR(submit);
>>   		goto out_post_unlock;
>> diff --git a/drivers/gpu/drm/nouveau/nouveau_sched.c
>> b/drivers/gpu/drm/nouveau/nouveau_sched.c
>> index d326e55d2d24..460a5fb02412 100644
>> --- a/drivers/gpu/drm/nouveau/nouveau_sched.c
>> +++ b/drivers/gpu/drm/nouveau/nouveau_sched.c
>> @@ -87,7 +87,8 @@ nouveau_job_init(struct nouveau_job *job,
>>   	}
>>   
>>   	ret = drm_sched_job_init(&job->base, &sched->entity,
>> -				 args->credits, NULL);
>> +				 args->credits, NULL,
>> +				 job->file_priv->client_id);
>>   	if (ret)
>>   		goto err_free_chains;
>>   
>> diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c
>> b/drivers/gpu/drm/panfrost/panfrost_drv.c
>> index b87f83e94eda..d5c2c6530ed8 100644
>> --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
>> +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
>> @@ -312,7 +312,7 @@ static int panfrost_ioctl_submit(struct
>> drm_device *dev, void *data,
>>   
>>   	ret = drm_sched_job_init(&job->base,
>>   				 &file_priv->sched_entity[slot],
>> -				 1, NULL);
>> +				 1, NULL, file->client_id);
>>   	if (ret)
>>   		goto out_put_job;
>>   
>> diff --git a/drivers/gpu/drm/panthor/panthor_drv.c
>> b/drivers/gpu/drm/panthor/panthor_drv.c
>> index 06fe46e32073..bd8e1900c919 100644
>> --- a/drivers/gpu/drm/panthor/panthor_drv.c
>> +++ b/drivers/gpu/drm/panthor/panthor_drv.c
>> @@ -989,7 +989,8 @@ static int panthor_ioctl_group_submit(struct
>> drm_device *ddev, void *data,
>>   		const struct drm_panthor_queue_submit *qsubmit =
>> &jobs_args[i];
>>   		struct drm_sched_job *job;
>>   
>> -		job = panthor_job_create(pfile, args->group_handle,
>> qsubmit);
>> +		job = panthor_job_create(pfile, args->group_handle,
>> qsubmit,
>> +					 file->client_id);
>>   		if (IS_ERR(job)) {
>>   			ret = PTR_ERR(job);
>>   			goto out_cleanup_submit_ctx;
>> diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c
>> b/drivers/gpu/drm/panthor/panthor_mmu.c
>> index 12a02e28f50f..e0c79bd2d173 100644
>> --- a/drivers/gpu/drm/panthor/panthor_mmu.c
>> +++ b/drivers/gpu/drm/panthor/panthor_mmu.c
>> @@ -2516,7 +2516,7 @@ panthor_vm_bind_job_create(struct drm_file
>> *file,
>>   	kref_init(&job->refcount);
>>   	job->vm = panthor_vm_get(vm);
>>   
>> -	ret = drm_sched_job_init(&job->base, &vm->entity, 1, vm);
>> +	ret = drm_sched_job_init(&job->base, &vm->entity, 1, vm,
>> file->client_id);
>>   	if (ret)
>>   		goto err_put_job;
>>   
>> diff --git a/drivers/gpu/drm/panthor/panthor_sched.c
>> b/drivers/gpu/drm/panthor/panthor_sched.c
>> index 446ec780eb4a..2af860c9068a 100644
>> --- a/drivers/gpu/drm/panthor/panthor_sched.c
>> +++ b/drivers/gpu/drm/panthor/panthor_sched.c
>> @@ -3729,7 +3729,8 @@ struct panthor_vm *panthor_job_vm(struct
>> drm_sched_job *sched_job)
>>   struct drm_sched_job *
>>   panthor_job_create(struct panthor_file *pfile,
>>   		   u16 group_handle,
>> -		   const struct drm_panthor_queue_submit *qsubmit)
>> +		   const struct drm_panthor_queue_submit *qsubmit,
>> +		   u64 drm_client_id)
>>   {
>>   	struct panthor_group_pool *gpool = pfile->groups;
>>   	struct panthor_job *job;
>> @@ -3801,7 +3802,7 @@ panthor_job_create(struct panthor_file *pfile,
>>   
>>   	ret = drm_sched_job_init(&job->base,
>>   				 &job->group->queues[job-
>>> queue_idx]->entity,
>> -				 credits, job->group);
>> +				 credits, job->group,
>> drm_client_id);
>>   	if (ret)
>>   		goto err_put_job;
>>   
>> diff --git a/drivers/gpu/drm/panthor/panthor_sched.h
>> b/drivers/gpu/drm/panthor/panthor_sched.h
>> index e650a445cf50..742b0b4ff3a3 100644
>> --- a/drivers/gpu/drm/panthor/panthor_sched.h
>> +++ b/drivers/gpu/drm/panthor/panthor_sched.h
>> @@ -29,7 +29,8 @@ int panthor_group_get_state(struct panthor_file
>> *pfile,
>>   struct drm_sched_job *
>>   panthor_job_create(struct panthor_file *pfile,
>>   		   u16 group_handle,
>> -		   const struct drm_panthor_queue_submit *qsubmit);
>> +		   const struct drm_panthor_queue_submit *qsubmit,
>> +		   u64 drm_client_id);
>>   struct drm_sched_job *panthor_job_get(struct drm_sched_job *job);
>>   struct panthor_vm *panthor_job_vm(struct drm_sched_job *sched_job);
>>   void panthor_job_put(struct drm_sched_job *job);
>> diff --git a/drivers/gpu/drm/scheduler/sched_fence.c
>> b/drivers/gpu/drm/scheduler/sched_fence.c
>> index e971528504a5..d208d384d38d 100644
>> --- a/drivers/gpu/drm/scheduler/sched_fence.c
>> +++ b/drivers/gpu/drm/scheduler/sched_fence.c
>> @@ -206,7 +206,8 @@ struct drm_sched_fence *to_drm_sched_fence(struct
>> dma_fence *f)
>>   EXPORT_SYMBOL(to_drm_sched_fence);
>>   
>>   struct drm_sched_fence *drm_sched_fence_alloc(struct
>> drm_sched_entity *entity,
>> -					      void *owner)
>> +					      void *owner,
>> +					      u64 drm_client_id)
>>   {
>>   	struct drm_sched_fence *fence = NULL;
>>   
>> @@ -215,6 +216,7 @@ struct drm_sched_fence
>> *drm_sched_fence_alloc(struct drm_sched_entity *entity,
>>   		return NULL;
>>   
>>   	fence->owner = owner;
>> +	fence->drm_client_id = drm_client_id;
>>   	spin_lock_init(&fence->lock);
>>   
>>   	return fence;
>> diff --git a/drivers/gpu/drm/scheduler/sched_internal.h
>> b/drivers/gpu/drm/scheduler/sched_internal.h
>> index 599cf6e1bb74..7ea5a6736f98 100644
>> --- a/drivers/gpu/drm/scheduler/sched_internal.h
>> +++ b/drivers/gpu/drm/scheduler/sched_internal.h
>> @@ -24,7 +24,7 @@ void drm_sched_entity_select_rq(struct
>> drm_sched_entity *entity);
>>   struct drm_sched_job *drm_sched_entity_pop_job(struct
>> drm_sched_entity *entity);
>>   
>>   struct drm_sched_fence *drm_sched_fence_alloc(struct
>> drm_sched_entity *s_entity,
>> -					      void *owner);
>> +					      void *owner, u64
>> drm_client_id);
>>   void drm_sched_fence_init(struct drm_sched_fence *fence,
>>   			  struct drm_sched_entity *entity);
>>   void drm_sched_fence_free(struct drm_sched_fence *fence);
>> diff --git a/drivers/gpu/drm/scheduler/sched_main.c
>> b/drivers/gpu/drm/scheduler/sched_main.c
>> index 829579c41c6b..60611618f3ab 100644
>> --- a/drivers/gpu/drm/scheduler/sched_main.c
>> +++ b/drivers/gpu/drm/scheduler/sched_main.c
>> @@ -764,6 +764,7 @@ EXPORT_SYMBOL(drm_sched_resubmit_jobs);
>>    * @credits: the number of credits this job contributes to the
>> schedulers
>>    * credit limit
>>    * @owner: job owner for debugging
>> + * @drm_client_id: drm_file.client_id of the owner
> 
> For the docu generation to link that properly it must be written as
> 
> &struct drm_file.client_id

Noted.

> 
> Besides, if this were an optional parameter, one should document it.
> I'm not sure if it is, I haven't used these client_id's before.

Passing an invalid client_id would only cause the trace events to print the invalid client_id.

Thanks,
Pierre-Eric


> 
> P.
> 
>>    *
>>    * Refer to drm_sched_entity_push_job() documentation
>>    * for locking considerations.
>> @@ -784,7 +785,8 @@ EXPORT_SYMBOL(drm_sched_resubmit_jobs);
>>    */
>>   int drm_sched_job_init(struct drm_sched_job *job,
>>   		       struct drm_sched_entity *entity,
>> -		       u32 credits, void *owner)
>> +		       u32 credits, void *owner,
>> +		       uint64_t drm_client_id)
>>   {
>>   	if (!entity->rq) {
>>   		/* This will most likely be followed by missing
>> frames
>> @@ -810,7 +812,7 @@ int drm_sched_job_init(struct drm_sched_job *job,
>>   
>>   	job->entity = entity;
>>   	job->credits = credits;
>> -	job->s_fence = drm_sched_fence_alloc(entity, owner);
>> +	job->s_fence = drm_sched_fence_alloc(entity, owner,
>> drm_client_id);
>>   	if (!job->s_fence)
>>   		return -ENOMEM;
>>   
>> diff --git a/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
>> b/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
>> index f999c8859cf7..09ffbdb32d76 100644
>> --- a/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
>> +++ b/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
>> @@ -35,7 +35,7 @@ drm_mock_sched_entity_new(struct kunit *test,
>>   	ret = drm_sched_entity_init(&entity->base,
>>   				    priority,
>>   				    &drm_sched, 1,
>> -				    NULL);
>> +				    NULL, 1);
>>   	KUNIT_ASSERT_EQ(test, ret, 0);
>>   
>>   	entity->test = test;
>> diff --git a/drivers/gpu/drm/v3d/v3d_submit.c
>> b/drivers/gpu/drm/v3d/v3d_submit.c
>> index 4ff5de46fb22..5171ffe9012d 100644
>> --- a/drivers/gpu/drm/v3d/v3d_submit.c
>> +++ b/drivers/gpu/drm/v3d/v3d_submit.c
>> @@ -169,7 +169,7 @@ v3d_job_init(struct v3d_dev *v3d, struct drm_file
>> *file_priv,
>>   	job->file = file_priv;
>>   
>>   	ret = drm_sched_job_init(&job->base, &v3d_priv-
>>> sched_entity[queue],
>> -				 1, v3d_priv);
>> +				 1, v3d_priv, file_priv->client_id);
>>   	if (ret)
>>   		return ret;
>>   
>> diff --git a/drivers/gpu/drm/xe/xe_sched_job.c
>> b/drivers/gpu/drm/xe/xe_sched_job.c
>> index 1905ca590965..f4679cb9a56b 100644
>> --- a/drivers/gpu/drm/xe/xe_sched_job.c
>> +++ b/drivers/gpu/drm/xe/xe_sched_job.c
>> @@ -113,7 +113,8 @@ struct xe_sched_job *xe_sched_job_create(struct
>> xe_exec_queue *q,
>>   	kref_init(&job->refcount);
>>   	xe_exec_queue_get(job->q);
>>   
>> -	err = drm_sched_job_init(&job->drm, q->entity, 1, NULL);
>> +	err = drm_sched_job_init(&job->drm, q->entity, 1, NULL,
>> +				 q->xef->drm->client_id);
>>   	if (err)
>>   		goto err_free;
>>   
>> diff --git a/include/drm/gpu_scheduler.h
>> b/include/drm/gpu_scheduler.h
>> index 1a7e377d4cbb..6fe3b4c0cffb 100644
>> --- a/include/drm/gpu_scheduler.h
>> +++ b/include/drm/gpu_scheduler.h
>> @@ -305,6 +305,13 @@ struct drm_sched_fence {
>>            * @owner: job owner for debugging
>>            */
>>   	void				*owner;
>> +
>> +	/**
>> +	 * @drm_client_id:
>> +	 *
>> +	 * The client_id of the drm_file which owns the job.
>> +	 */
>> +	uint64_t			drm_client_id;
>>   };
>>   
>>   struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f);
>> @@ -629,7 +636,8 @@ drm_sched_pick_best(struct drm_gpu_scheduler
>> **sched_list,
>>   
>>   int drm_sched_job_init(struct drm_sched_job *job,
>>   		       struct drm_sched_entity *entity,
>> -		       u32 credits, void *owner);
>> +		       u32 credits, void *owner,
>> +		       u64 drm_client_id);
>>   void drm_sched_job_arm(struct drm_sched_job *job);
>>   void drm_sched_entity_push_job(struct drm_sched_job *sched_job);
>>   int drm_sched_job_add_dependency(struct drm_sched_job *job,
Pierre-Eric Pelloux-Prayer May 19, 2025, 11:02 a.m. UTC | #3
Le 15/05/2025 à 08:53, Pierre-Eric Pelloux-Prayer a écrit :
> Hi,
> 
> Le 14/05/2025 à 14:44, Philipp Stanner a écrit :
>> On Thu, 2025-04-24 at 10:38 +0200, Pierre-Eric Pelloux-Prayer wrote:
>>> This will be used in a later commit to trace the drm client_id in
>>> some of the gpu_scheduler trace events.
>>>
>>> This requires changing all the users of drm_sched_job_init to
>>> add an extra parameter.
>>>
>>> The newly added drm_client_id field in the drm_sched_fence is a bit
>>> of a duplicate of the owner one. One suggestion I received was to
>>> merge those 2 fields - this can't be done right now as amdgpu uses
>>> some special values (AMDGPU_FENCE_OWNER_*) that can't really be
>>> translated into a client id. Christian is working on getting rid of
>>> those; when it's done we should be able to squash owner/drm_client_id
>>> together.
>>>
>>> Reviewed-by: Christian König <christian.koenig@amd.com>
>>> Signed-off-by: Pierre-Eric Pelloux-Prayer
>>> <pierre-eric.pelloux-prayer@amd.com>
>>> ---
>>>   drivers/accel/amdxdna/aie2_ctx.c                 |  3 ++-
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c       |  2 +-
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c           |  3 ++-
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_job.c          |  8 +++++---
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_job.h          |  3 ++-
>>>   drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c     |  2 +-
>>>   drivers/gpu/drm/imagination/pvr_job.c            |  2 +-
>>>   drivers/gpu/drm/imagination/pvr_queue.c          |  5 +++--
>>>   drivers/gpu/drm/imagination/paac             |  8 +++++---
>>>   drivers/gpu/drm/nouveau/nouveau_sched.c          |  3 ++-
>>>   drivers/gpu/drm/panfrost/panfrost_drv.c          |  2 +-
>>>   drivers/gpu/drm/panthor/panthor_drv.c            |  3 ++-
>>>   drivers/gpu/drm/panthor/panthor_mmu.c            |  2 +-
>>>   drivers/gpu/drm/panthor/panthor_sched.c          |  5 +++--
>>>   drivers/gpu/drm/panthor/panthor_sched.h          |  3 ++-
>>>   drivers/gpu/drm/scheduler/sched_fence.c          |  4 ++
>>>   drivers/gpu/drm/scheduler/sched_internal.h       |  2 +-
>>>   drivers/gpu/drm/scheduler/sched_main.c           |  6 ++++--
>>>   drivers/gpu/drm/scheduler/tests/mock_scheduler.c |  2 +-
>>>   drivers/gpu/drm/v3d/v3d_submit.c                 |  2 +-
>>>   drivers/gpu/drm/xe/xe_sched_job.c                |  3 ++-
>>>   include/drm/gpu_scheduler.h                      | 10 +++++++++-
>>>   26 files changed, 62 insertions(+), 34 deletions(-)
>>
>> I think last time I asked about what your merge plan for this is, since
>> it touches so many drivers. Should I take that?
> 
> Based on:
> 
> https://drm.pages.freedesktop.org/maintainer-tools/committer/committer-drm-misc.html
> 
> "drm-misc is for drm core (non-driver) patches, subsystem-wide refactorings,
> and small trivial patches all over (including drivers)."
> 
> I assume it should go through drm-misc.

I've addressed your comments and pushed an updated branch to 
https://gitlab.freedesktop.org/pepp/linux/-/commits/improve_gpu_scheduler_trace_v10

Any chance to get this merged soon?

Thanks,
Pierre-Eric



> 
> 
>>
>> Besides one comment below, scheduler bits look fine.
>>
>>>
>>> diff --git a/drivers/accel/amdxdna/aie2_ctx.c
>>> b/drivers/accel/amdxdna/aie2_ctx.c
>>> index e04549f64d69..3e38a5f637ea 100644
>>> --- a/drivers/accel/amdxdna/aie2_ctx.c
>>> +++ b/drivers/accel/amdxdna/aie2_ctx.c
>>> @@ -848,7 +848,8 @@ int aie2_cmd_submit(struct amdxdna_hwctx *hwctx,
>>> struct amdxdna_sched_job *job,
>>>           goto up_sem;
>>>       }
>>> -    ret = drm_sched_job_init(&job->base, &hwctx->priv->entity,
>>> 1, hwctx);
>>> +    ret = drm_sched_job_init(&job->base, &hwctx->priv->entity,
>>> 1, hwctx,
>>> +                 hwctx->client->filp->client_id);
>>>       if (ret) {
>>>           XDNA_ERR(xdna, "DRM job init failed, ret %d", ret);
>>>           goto free_chain;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
>>> index 4cec3a873995..1a77ba7036c9 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
>>> @@ -639,7 +639,7 @@ int amdgpu_amdkfd_submit_ib(struct amdgpu_device
>>> *adev,
>>>           goto err;
>>>       }
>>> -    ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job);
>>> +    ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job, 0);
>>>       if (ret)
>>>           goto err;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>> index 82df06a72ee0..5a231b997d65 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>>> @@ -293,7 +293,8 @@ static int amdgpu_cs_pass1(struct
>>> amdgpu_cs_parser *p,
>>>       for (i = 0; i < p->gang_size; ++i) {
>>>           ret = amdgpu_job_alloc(p->adev, vm, p->entities[i],
>>> vm,
>>> -                       num_ibs[i], &p->jobs[i]);
>>> +                       num_ibs[i], &p->jobs[i],
>>> +                       p->filp->client_id);
>>>           if (ret)
>>>               goto free_all_kdata;
>>>           p->jobs[i]->enforce_isolation = p->adev-
>>>> enforce_isolation[fpriv->xcp_id];
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>>> index acb21fc8b3ce..75262ce8db27 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>>> @@ -204,7 +204,8 @@ static enum drm_gpu_sched_stat
>>> amdgpu_job_timedout(struct drm_sched_job *s_job)
>>>   int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm
>>> *vm,
>>>                struct drm_sched_entity *entity, void *owner,
>>> -             unsigned int num_ibs, struct amdgpu_job **job)
>>> +             unsigned int num_ibs, struct amdgpu_job **job,
>>> +             u64 drm_client_id)
>>>   {
>>>       if (num_ibs == 0)
>>>           return -EINVAL;
>>> @@ -222,7 +223,8 @@ int amdgpu_job_alloc(struct amdgpu_device *adev,
>>> struct amdgpu_vm *vm,
>>>       if (!entity)
>>>           return 0;
>>> -    return drm_sched_job_init(&(*job)->base, entity, 1, owner);
>>> +    return drm_sched_job_init(&(*job)->base, entity, 1, owner,
>>> +                  drm_client_id);
>>>   }
>>>   int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev,
>>> @@ -232,7 +234,7 @@ int amdgpu_job_alloc_with_ib(struct amdgpu_device
>>> *adev,
>>>   {
>>>       int r;
>>> -    r = amdgpu_job_alloc(adev, NULL, entity, owner, 1, job);
>>> +    r = amdgpu_job_alloc(adev, NULL, entity, owner, 1, job, 0);
>>>       if (r)
>>>           return r;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
>>> index ce6b9ba967ff..5a8bc6342222 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
>>> @@ -90,7 +90,8 @@ static inline struct amdgpu_ring
>>> *amdgpu_job_ring(struct amdgpu_job *job)
>>>   int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm
>>> *vm,
>>>                struct drm_sched_entity *entity, void *owner,
>>> -             unsigned int num_ibs, struct amdgpu_job **job);
>>> +             unsigned int num_ibs, struct amdgpu_job **job,
>>> +             u64 drm_client_id);
>>>   int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev,
>>>                    struct drm_sched_entity *entity, void
>>> *owner,
>>>                    size_t size, enum amdgpu_ib_pool_type
>>> pool_type,
>>> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
>>> b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
>>> index 3c0a5c3e0e3d..76c742328edb 100644
>>> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
>>> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
>>> @@ -534,7 +534,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device
>>> *dev, void *data,
>>>       ret = drm_sched_job_init(&submit->sched_job,
>>>                    &ctx->sched_entity[args->pipe],
>>> -                 1, submit->ctx);
>>> +                 1, submit->ctx, file->client_id);
>>>       if (ret)
>>>           goto err_submit_put;
>>> diff --git a/drivers/gpu/drm/imagination/pvr_job.c
>>> b/drivers/gpu/drm/imagination/pvr_job.c
>>> index 59b334d094fa..7564b0f21b42 100644
>>> --- a/drivers/gpu/drm/imagination/pvr_job.c
>>> +++ b/drivers/gpu/drm/imagination/pvr_job.c
>>> @@ -446,7 +446,7 @@ create_job(struct pvr_device *pvr_dev,
>>>       if (err)
>>>           goto err_put_job;
>>> -    err = pvr_queue_job_init(job);
>>> +    err = pvr_queue_job_init(job, pvr_file->file->client_id);
>>>       if (err)
>>>           goto err_put_job;
>>> diff --git a/drivers/gpu/drm/imagination/pvr_queue.c
>>> b/drivers/gpu/drm/imagination/pvr_queue.c
>>> index 5e9bc0992824..5a41ee79fed6 100644
>>> --- a/drivers/gpu/drm/imagination/pvr_queue.c
>>> +++ b/drivers/gpu/drm/imagination/pvr_queue.c
>>> @@ -1073,6 +1073,7 @@ static int pvr_queue_cleanup_fw_context(struct
>>> pvr_queue *queue)
>>>   /**
>>>    * pvr_queue_job_init() - Initialize queue related fields in a
>>> pvr_job object.
>>>    * @job: The job to initialize.
>>> + * @drm_client_id: drm_file.client_id submitting the job
>>>    *
>>>    * Bind the job to a queue and allocate memory to guarantee
>>> pvr_queue_job_arm()
>>>    * and pvr_queue_job_push() can't fail. We also make sure the
>>> context type is
>>> @@ -1082,7 +1083,7 @@ static int pvr_queue_cleanup_fw_context(struct
>>> pvr_queue *queue)
>>>    *  * 0 on success, or
>>>    *  * An error code if something failed.
>>>    */
>>> -int pvr_queue_job_init(struct pvr_job *job)
>>> +int pvr_queue_job_init(struct pvr_job *job, u64 drm_client_id)
>>>   {
>>>       /* Fragment jobs need at least one native fence wait on the
>>> geometry job fence. */
>>>       u32 min_native_dep_count = job->type ==
>>> DRM_PVR_JOB_TYPE_FRAGMENT ? 1 : 0;
>>> @@ -1099,7 +1100,7 @@ int pvr_queue_job_init(struct pvr_job *job)
>>>       if (!pvr_cccb_cmdseq_can_fit(&queue->cccb,
>>> job_cmds_size(job, min_native_dep_count)))
>>>           return -E2BIG;
>>> -    err = drm_sched_job_init(&job->base, &queue->entity, 1,
>>> THIS_MODULE);
>>> +    err = drm_sched_job_init(&job->base, &queue->entity, 1,
>>> THIS_MODULE, drm_client_id);
>>>       if (err)
>>>           return err;
>>> diff --git a/drivers/gpu/drm/imagination/pvr_queue.h
>>> b/drivers/gpu/drm/imagination/pvr_queue.h
>>> index 93fe9ac9f58c..fc1986d73fc8 100644
>>> --- a/drivers/gpu/drm/imagination/pvr_queue.h
>>> +++ b/drivers/gpu/drm/imagination/pvr_queue.h
>>> @@ -143,7 +143,7 @@ struct pvr_queue {
>>>   bool pvr_queue_fence_is_ufo_backed(struct dma_fence *f);
>>> -int pvr_queue_job_init(struct pvr_job *job);
>>> +int pvr_queue_job_init(struct pvr_job *job, u64 drm_client_id);
>>>   void pvr_queue_job_cleanup(struct pvr_job *job);
>>> diff --git a/drivers/gpu/drm/lima/lima_gem.c
>>> b/drivers/gpu/drm/lima/lima_gem.c
>>> index 5deec673c11e..9722b847a539 100644
>>> --- a/drivers/gpu/drm/lima/lima_gem.c
>>> +++ b/drivers/gpu/drm/lima/lima_gem.c
>>> @@ -341,7 +341,7 @@ int lima_gem_submit(struct drm_file *file, struct
>>> lima_submit *submit)
>>>       err = lima_sched_task_init(
>>>           submit->task, submit->ctx->context + submit->pipe,
>>> -        bos, submit->nr_bos, vm);
>>> +        bos, submit->nr_bos, vm, file->client_id);
>>>       if (err)
>>>           goto err_out1;
>>> diff --git a/drivers/gpu/drm/lima/lima_sched.c
>>> b/drivers/gpu/drm/lima/lima_sched.c
>>> index 7934098e651b..954f4325b859 100644
>>> --- a/drivers/gpu/drm/lima/lima_sched.c
>>> +++ b/drivers/gpu/drm/lima/lima_sched.c
>>> @@ -113,7 +113,8 @@ static inline struct lima_sched_pipe
>>> *to_lima_pipe(struct drm_gpu_scheduler *sch
>>>   int lima_sched_task_init(struct lima_sched_task *task,
>>>                struct lima_sched_context *context,
>>>                struct lima_bo **bos, int num_bos,
>>> -             struct lima_vm *vm)
>>> +             struct lima_vm *vm,
>>> +             u64 drm_client_id)
>>>   {
>>>       int err, i;
>>> @@ -124,7 +125,8 @@ int lima_sched_task_init(struct lima_sched_task
>>> *task,
>>>       for (i = 0; i < num_bos; i++)
>>>           drm_gem_object_get(&bos[i]->base.base);
>>> -    err = drm_sched_job_init(&task->base, &context->base, 1,
>>> vm);
>>> +    err = drm_sched_job_init(&task->base, &context->base, 1, vm,
>>> +                 drm_client_id);
>>>       if (err) {
>>>           kfree(task->bos);
>>>           return err;
>>> diff --git a/drivers/gpu/drm/lima/lima_sched.h
>>> b/drivers/gpu/drm/lima/lima_sched.h
>>> index 85b23ba901d5..1a08faf8a529 100644
>>> --- a/drivers/gpu/drm/lima/lima_sched.h
>>> +++ b/drivers/gpu/drm/lima/lima_sched.h
>>> @@ -88,7 +88,8 @@ struct lima_sched_pipe {
>>>   int lima_sched_task_init(struct lima_sched_task *task,
>>>                struct lima_sched_context *context,
>>>                struct lima_bo **bos, int num_bos,
>>> -             struct lima_vm *vm);
>>> +             struct lima_vm *vm,
>>> +             u64 drm_client_id);
>>>   void lima_sched_task_fini(struct lima_sched_task *task);
>>>   int lima_sched_context_init(struct lima_sched_pipe *pipe,
>>> diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c
>>> b/drivers/gpu/drm/msm/msm_gem_submit.c
>>> index 3e9aa2cc38ef..d9be0fe3d674 100644
>>> --- a/drivers/gpu/drm/msm/msm_gem_submit.c
>>> +++ b/drivers/gpu/drm/msm/msm_gem_submit.c
>>> @@ -30,7 +30,7 @@
>>>   static struct msm_gem_submit *submit_create(struct drm_device *dev,
>>>           struct msm_gpu *gpu,
>>>           struct msm_gpu_submitqueue *queue, uint32_t nr_bos,
>>> -        uint32_t nr_cmds)
>>> +        uint32_t nr_cmds, u64 drm_client_id)
>>>   {
>>>       static atomic_t ident = ATOMIC_INIT(0);
>>>       struct msm_gem_submit *submit;
>>> @@ -54,7 +54,8 @@ static struct msm_gem_submit *submit_create(struct
>>> drm_device *dev,
>>>           return ERR_PTR(ret);
>>>       }
>>> -    ret = drm_sched_job_init(&submit->base, queue->entity, 1,
>>> queue);
>>> +    ret = drm_sched_job_init(&submit->base, queue->entity, 1,
>>> queue,
>>> +                 drm_client_id);
>>>       if (ret) {
>>>           kfree(submit->hw_fence);
>>>           kfree(submit);
>>> @@ -693,7 +694,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev,
>>> void *data,
>>>           }
>>>       }
>>> -    submit = submit_create(dev, gpu, queue, args->nr_bos, args-
>>>> nr_cmds);
>>> +    submit = submit_create(dev, gpu, queue, args->nr_bos, args-
>>>> nr_cmds,
>>> +                   file->client_id);
>>>       if (IS_ERR(submit)) {
>>>           ret = PTR_ERR(submit);
>>>           goto out_post_unlock;
>>> diff --git a/drivers/gpu/drm/nouveau/nouveau_sched.c
>>> b/drivers/gpu/drm/nouveau/nouveau_sched.c
>>> index d326e55d2d24..460a5fb02412 100644
>>> --- a/drivers/gpu/drm/nouveau/nouveau_sched.c
>>> +++ b/drivers/gpu/drm/nouveau/nouveau_sched.c
>>> @@ -87,7 +87,8 @@ nouveau_job_init(struct nouveau_job *job,
>>>       }
>>>       ret = drm_sched_job_init(&job->base, &sched->entity,
>>> -                 args->credits, NULL);
>>> +                 args->credits, NULL,
>>> +                 job->file_priv->client_id);
>>>       if (ret)
>>>           goto err_free_chains;
>>> diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c
>>> b/drivers/gpu/drm/panfrost/panfrost_drv.c
>>> index b87f83e94eda..d5c2c6530ed8 100644
>>> --- a/drivers/gpu/drm/panfrost/panfrost_drv.c
>>> +++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
>>> @@ -312,7 +312,7 @@ static int panfrost_ioctl_submit(struct
>>> drm_device *dev, void *data,
>>>       ret = drm_sched_job_init(&job->base,
>>>                    &file_priv->sched_entity[slot],
>>> -                 1, NULL);
>>> +                 1, NULL, file->client_id);
>>>       if (ret)
>>>           goto out_put_job;
>>> diff --git a/drivers/gpu/drm/panthor/panthor_drv.c
>>> b/drivers/gpu/drm/panthor/panthor_drv.c
>>> index 06fe46e32073..bd8e1900c919 100644
>>> --- a/drivers/gpu/drm/panthor/panthor_drv.c
>>> +++ b/drivers/gpu/drm/panthor/panthor_drv.c
>>> @@ -989,7 +989,8 @@ static int panthor_ioctl_group_submit(struct
>>> drm_device *ddev, void *data,
>>>           const struct drm_panthor_queue_submit *qsubmit =
>>> &jobs_args[i];
>>>           struct drm_sched_job *job;
>>> -        job = panthor_job_create(pfile, args->group_handle,
>>> qsubmit);
>>> +        job = panthor_job_create(pfile, args->group_handle,
>>> qsubmit,
>>> +                     file->client_id);
>>>           if (IS_ERR(job)) {
>>>               ret = PTR_ERR(job);
>>>               goto out_cleanup_submit_ctx;
>>> diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c
>>> b/drivers/gpu/drm/panthor/panthor_mmu.c
>>> index 12a02e28f50f..e0c79bd2d173 100644
>>> --- a/drivers/gpu/drm/panthor/panthor_mmu.c
>>> +++ b/drivers/gpu/drm/panthor/panthor_mmu.c
>>> @@ -2516,7 +2516,7 @@ panthor_vm_bind_job_create(struct drm_file
>>> *file,
>>>       kref_init(&job->refcount);
>>>       job->vm = panthor_vm_get(vm);
>>> -    ret = drm_sched_job_init(&job->base, &vm->entity, 1, vm);
>>> +    ret = drm_sched_job_init(&job->base, &vm->entity, 1, vm,
>>> file->client_id);
>>>       if (ret)
>>>           goto err_put_job;
>>> diff --git a/drivers/gpu/drm/panthor/panthor_sched.c
>>> b/drivers/gpu/drm/panthor/panthor_sched.c
>>> index 446ec780eb4a..2af860c9068a 100644
>>> --- a/drivers/gpu/drm/panthor/panthor_sched.c
>>> +++ b/drivers/gpu/drm/panthor/panthor_sched.c
>>> @@ -3729,7 +3729,8 @@ struct panthor_vm *panthor_job_vm(struct
>>> drm_sched_job *sched_job)
>>>   struct drm_sched_job *
>>>   panthor_job_create(struct panthor_file *pfile,
>>>              u16 group_handle,
>>> -           const struct drm_panthor_queue_submit *qsubmit)
>>> +           const struct drm_panthor_queue_submit *qsubmit,
>>> +           u64 drm_client_id)
>>>   {
>>>       struct panthor_group_pool *gpool = pfile->groups;
>>>       struct panthor_job *job;
>>> @@ -3801,7 +3802,7 @@ panthor_job_create(struct panthor_file *pfile,
>>>       ret = drm_sched_job_init(&job->base,
>>>                    &job->group->queues[job-
>>>> queue_idx]->entity,
>>> -                 credits, job->group);
>>> +                 credits, job->group,
>>> drm_client_id);
>>>       if (ret)
>>>           goto err_put_job;
>>> diff --git a/drivers/gpu/drm/panthor/panthor_sched.h
>>> b/drivers/gpu/drm/panthor/panthor_sched.h
>>> index e650a445cf50..742b0b4ff3a3 100644
>>> --- a/drivers/gpu/drm/panthor/panthor_sched.h
>>> +++ b/drivers/gpu/drm/panthor/panthor_sched.h
>>> @@ -29,7 +29,8 @@ int panthor_group_get_state(struct panthor_file
>>> *pfile,
>>>   struct drm_sched_job *
>>>   panthor_job_create(struct panthor_file *pfile,
>>>              u16 group_handle,
>>> -           const struct drm_panthor_queue_submit *qsubmit);
>>> +           const struct drm_panthor_queue_submit *qsubmit,
>>> +           u64 drm_client_id);
>>>   struct drm_sched_job *panthor_job_get(struct drm_sched_job *job);
>>>   struct panthor_vm *panthor_job_vm(struct drm_sched_job *sched_job);
>>>   void panthor_job_put(struct drm_sched_job *job);
>>> diff --git a/drivers/gpu/drm/scheduler/sched_fence.c
>>> b/drivers/gpu/drm/scheduler/sched_fence.c
>>> index e971528504a5..d208d384d38d 100644
>>> --- a/drivers/gpu/drm/scheduler/sched_fence.c
>>> +++ b/drivers/gpu/drm/scheduler/sched_fence.c
>>> @@ -206,7 +206,8 @@ struct drm_sched_fence *to_drm_sched_fence(struct
>>> dma_fence *f)
>>>   EXPORT_SYMBOL(to_drm_sched_fence);
>>>   struct drm_sched_fence *drm_sched_fence_alloc(struct
>>> drm_sched_entity *entity,
>>> -                          void *owner)
>>> +                          void *owner,
>>> +                          u64 drm_client_id)
>>>   {
>>>       struct drm_sched_fence *fence = NULL;
>>> @@ -215,6 +216,7 @@ struct drm_sched_fence
>>> *drm_sched_fence_alloc(struct drm_sched_entity *entity,
>>>           return NULL;
>>>       fence->owner = owner;
>>> +    fence->drm_client_id = drm_client_id;
>>>       spin_lock_init(&fence->lock);
>>>       return fence;
>>> diff --git a/drivers/gpu/drm/scheduler/sched_internal.h
>>> b/drivers/gpu/drm/scheduler/sched_internal.h
>>> index 599cf6e1bb74..7ea5a6736f98 100644
>>> --- a/drivers/gpu/drm/scheduler/sched_internal.h
>>> +++ b/drivers/gpu/drm/scheduler/sched_internal.h
>>> @@ -24,7 +24,7 @@ void drm_sched_entity_select_rq(struct
>>> drm_sched_entity *entity);
>>>   struct drm_sched_job *drm_sched_entity_pop_job(struct
>>> drm_sched_entity *entity);
>>>   struct drm_sched_fence *drm_sched_fence_alloc(struct
>>> drm_sched_entity *s_entity,
>>> -                          void *owner);
>>> +                          void *owner, u64
>>> drm_client_id);
>>>   void drm_sched_fence_init(struct drm_sched_fence *fence,
>>>                 struct drm_sched_entity *entity);
>>>   void drm_sched_fence_free(struct drm_sched_fence *fence);
>>> diff --git a/drivers/gpu/drm/scheduler/sched_main.c
>>> b/drivers/gpu/drm/scheduler/sched_main.c
>>> index 829579c41c6b..60611618f3ab 100644
>>> --- a/drivers/gpu/drm/scheduler/sched_main.c
>>> +++ b/drivers/gpu/drm/scheduler/sched_main.c
>>> @@ -764,6 +764,7 @@ EXPORT_SYMBOL(drm_sched_resubmit_jobs);
>>>    * @credits: the number of credits this job contributes to the
>>> schedulers
>>>    * credit limit
>>>    * @owner: job owner for debugging
>>> + * @drm_client_id: drm_file.client_id of the owner
>>
>> For the docu generation to link that properly it must be written as
>>
>> &struct drm_file.client_id
> 
> Noted.
> 
>>
>> Besides, if this were an optional parameter, one should document it.
>> I'm not sure if it is, I haven't used these client_id's before.
> 
> Passing an invalid client_id would only cause the trace events to print the invalid client_id.
> 
> Thanks,
> Pierre-Eric
> 
> 
>>
>> P.
>>
>>>    *
>>>    * Refer to drm_sched_entity_push_job() documentation
>>>    * for locking considerations.
>>> @@ -784,7 +785,8 @@ EXPORT_SYMBOL(drm_sched_resubmit_jobs);
>>>    */
>>>   int drm_sched_job_init(struct drm_sched_job *job,
>>>                  struct drm_sched_entity *entity,
>>> -               u32 credits, void *owner)
>>> +               u32 credits, void *owner,
>>> +               uint64_t drm_client_id)
>>>   {
>>>       if (!entity->rq) {
>>>           /* This will most likely be followed by missing
>>> frames
>>> @@ -810,7 +812,7 @@ int drm_sched_job_init(struct drm_sched_job *job,
>>>       job->entity = entity;
>>>       job->credits = credits;
>>> -    job->s_fence = drm_sched_fence_alloc(entity, owner);
>>> +    job->s_fence = drm_sched_fence_alloc(entity, owner,
>>> drm_client_id);
>>>       if (!job->s_fence)
>>>           return -ENOMEM;
>>> diff --git a/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
>>> b/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
>>> index f999c8859cf7..09ffbdb32d76 100644
>>> --- a/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
>>> +++ b/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
>>> @@ -35,7 +35,7 @@ drm_mock_sched_entity_new(struct kunit *test,
>>>       ret = drm_sched_entity_init(&entity->base,
>>>                       priority,
>>>                       &drm_sched, 1,
>>> -                    NULL);
>>> +                    NULL, 1);
>>>       KUNIT_ASSERT_EQ(test, ret, 0);
>>>       entity->test = test;
>>> diff --git a/drivers/gpu/drm/v3d/v3d_submit.c
>>> b/drivers/gpu/drm/v3d/v3d_submit.c
>>> index 4ff5de46fb22..5171ffe9012d 100644
>>> --- a/drivers/gpu/drm/v3d/v3d_submit.c
>>> +++ b/drivers/gpu/drm/v3d/v3d_submit.c
>>> @@ -169,7 +169,7 @@ v3d_job_init(struct v3d_dev *v3d, struct drm_file
>>> *file_priv,
>>>       job->file = file_priv;
>>>       ret = drm_sched_job_init(&job->base, &v3d_priv-
>>>> sched_entity[queue],
>>> -                 1, v3d_priv);
>>> +                 1, v3d_priv, file_priv->client_id);
>>>       if (ret)
>>>           return ret;
>>> diff --git a/drivers/gpu/drm/xe/xe_sched_job.c
>>> b/drivers/gpu/drm/xe/xe_sched_job.c
>>> index 1905ca590965..f4679cb9a56b 100644
>>> --- a/drivers/gpu/drm/xe/xe_sched_job.c
>>> +++ b/drivers/gpu/drm/xe/xe_sched_job.c
>>> @@ -113,7 +113,8 @@ struct xe_sched_job *xe_sched_job_create(struct
>>> xe_exec_queue *q,
>>>       kref_init(&job->refcount);
>>>       xe_exec_queue_get(job->q);
>>> -    err = drm_sched_job_init(&job->drm, q->entity, 1, NULL);
>>> +    err = drm_sched_job_init(&job->drm, q->entity, 1, NULL,
>>> +                 q->xef->drm->client_id);
>>>       if (err)
>>>           goto err_free;
>>> diff --git a/include/drm/gpu_scheduler.h
>>> b/include/drm/gpu_scheduler.h
>>> index 1a7e377d4cbb..6fe3b4c0cffb 100644
>>> --- a/include/drm/gpu_scheduler.h
>>> +++ b/include/drm/gpu_scheduler.h
>>> @@ -305,6 +305,13 @@ struct drm_sched_fence {
>>>            * @owner: job owner for debugging
>>>            */
>>>       void                *owner;
>>> +
>>> +    /**
>>> +     * @drm_client_id:
>>> +     *
>>> +     * The client_id of the drm_file which owns the job.
>>> +     */
>>> +    uint64_t            drm_client_id;
>>>   };
>>>   struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f);
>>> @@ -629,7 +636,8 @@ drm_sched_pick_best(struct drm_gpu_scheduler
>>> **sched_list,
>>>   int drm_sched_job_init(struct drm_sched_job *job,
>>>                  struct drm_sched_entity *entity,
>>> -               u32 credits, void *owner);
>>> +               u32 credits, void *owner,
>>> +               u64 drm_client_id);
>>>   void drm_sched_job_arm(struct drm_sched_job *job);
>>>   void drm_sched_entity_push_job(struct drm_sched_job *sched_job);
>>>   int drm_sched_job_add_dependency(struct drm_sched_job *job,
diff mbox series

Patch

diff --git a/drivers/accel/amdxdna/aie2_ctx.c b/drivers/accel/amdxdna/aie2_ctx.c
index e04549f64d69..3e38a5f637ea 100644
--- a/drivers/accel/amdxdna/aie2_ctx.c
+++ b/drivers/accel/amdxdna/aie2_ctx.c
@@ -848,7 +848,8 @@  int aie2_cmd_submit(struct amdxdna_hwctx *hwctx, struct amdxdna_sched_job *job,
 		goto up_sem;
 	}
 
-	ret = drm_sched_job_init(&job->base, &hwctx->priv->entity, 1, hwctx);
+	ret = drm_sched_job_init(&job->base, &hwctx->priv->entity, 1, hwctx,
+				 hwctx->client->filp->client_id);
 	if (ret) {
 		XDNA_ERR(xdna, "DRM job init failed, ret %d", ret);
 		goto free_chain;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index 4cec3a873995..1a77ba7036c9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -639,7 +639,7 @@  int amdgpu_amdkfd_submit_ib(struct amdgpu_device *adev,
 		goto err;
 	}
 
-	ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job);
+	ret = amdgpu_job_alloc(adev, NULL, NULL, NULL, 1, &job, 0);
 	if (ret)
 		goto err;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 82df06a72ee0..5a231b997d65 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -293,7 +293,8 @@  static int amdgpu_cs_pass1(struct amdgpu_cs_parser *p,
 
 	for (i = 0; i < p->gang_size; ++i) {
 		ret = amdgpu_job_alloc(p->adev, vm, p->entities[i], vm,
-				       num_ibs[i], &p->jobs[i]);
+				       num_ibs[i], &p->jobs[i],
+				       p->filp->client_id);
 		if (ret)
 			goto free_all_kdata;
 		p->jobs[i]->enforce_isolation = p->adev->enforce_isolation[fpriv->xcp_id];
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
index acb21fc8b3ce..75262ce8db27 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
@@ -204,7 +204,8 @@  static enum drm_gpu_sched_stat amdgpu_job_timedout(struct drm_sched_job *s_job)
 
 int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,
 		     struct drm_sched_entity *entity, void *owner,
-		     unsigned int num_ibs, struct amdgpu_job **job)
+		     unsigned int num_ibs, struct amdgpu_job **job,
+		     u64 drm_client_id)
 {
 	if (num_ibs == 0)
 		return -EINVAL;
@@ -222,7 +223,8 @@  int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,
 	if (!entity)
 		return 0;
 
-	return drm_sched_job_init(&(*job)->base, entity, 1, owner);
+	return drm_sched_job_init(&(*job)->base, entity, 1, owner,
+				  drm_client_id);
 }
 
 int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev,
@@ -232,7 +234,7 @@  int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev,
 {
 	int r;
 
-	r = amdgpu_job_alloc(adev, NULL, entity, owner, 1, job);
+	r = amdgpu_job_alloc(adev, NULL, entity, owner, 1, job, 0);
 	if (r)
 		return r;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
index ce6b9ba967ff..5a8bc6342222 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
@@ -90,7 +90,8 @@  static inline struct amdgpu_ring *amdgpu_job_ring(struct amdgpu_job *job)
 
 int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,
 		     struct drm_sched_entity *entity, void *owner,
-		     unsigned int num_ibs, struct amdgpu_job **job);
+		     unsigned int num_ibs, struct amdgpu_job **job,
+		     u64 drm_client_id);
 int amdgpu_job_alloc_with_ib(struct amdgpu_device *adev,
 			     struct drm_sched_entity *entity, void *owner,
 			     size_t size, enum amdgpu_ib_pool_type pool_type,
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
index 3c0a5c3e0e3d..76c742328edb 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
@@ -534,7 +534,7 @@  int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
 
 	ret = drm_sched_job_init(&submit->sched_job,
 				 &ctx->sched_entity[args->pipe],
-				 1, submit->ctx);
+				 1, submit->ctx, file->client_id);
 	if (ret)
 		goto err_submit_put;
 
diff --git a/drivers/gpu/drm/imagination/pvr_job.c b/drivers/gpu/drm/imagination/pvr_job.c
index 59b334d094fa..7564b0f21b42 100644
--- a/drivers/gpu/drm/imagination/pvr_job.c
+++ b/drivers/gpu/drm/imagination/pvr_job.c
@@ -446,7 +446,7 @@  create_job(struct pvr_device *pvr_dev,
 	if (err)
 		goto err_put_job;
 
-	err = pvr_queue_job_init(job);
+	err = pvr_queue_job_init(job, pvr_file->file->client_id);
 	if (err)
 		goto err_put_job;
 
diff --git a/drivers/gpu/drm/imagination/pvr_queue.c b/drivers/gpu/drm/imagination/pvr_queue.c
index 5e9bc0992824..5a41ee79fed6 100644
--- a/drivers/gpu/drm/imagination/pvr_queue.c
+++ b/drivers/gpu/drm/imagination/pvr_queue.c
@@ -1073,6 +1073,7 @@  static int pvr_queue_cleanup_fw_context(struct pvr_queue *queue)
 /**
  * pvr_queue_job_init() - Initialize queue related fields in a pvr_job object.
  * @job: The job to initialize.
+ * @drm_client_id: drm_file.client_id submitting the job
  *
  * Bind the job to a queue and allocate memory to guarantee pvr_queue_job_arm()
  * and pvr_queue_job_push() can't fail. We also make sure the context type is
@@ -1082,7 +1083,7 @@  static int pvr_queue_cleanup_fw_context(struct pvr_queue *queue)
  *  * 0 on success, or
  *  * An error code if something failed.
  */
-int pvr_queue_job_init(struct pvr_job *job)
+int pvr_queue_job_init(struct pvr_job *job, u64 drm_client_id)
 {
 	/* Fragment jobs need at least one native fence wait on the geometry job fence. */
 	u32 min_native_dep_count = job->type == DRM_PVR_JOB_TYPE_FRAGMENT ? 1 : 0;
@@ -1099,7 +1100,7 @@  int pvr_queue_job_init(struct pvr_job *job)
 	if (!pvr_cccb_cmdseq_can_fit(&queue->cccb, job_cmds_size(job, min_native_dep_count)))
 		return -E2BIG;
 
-	err = drm_sched_job_init(&job->base, &queue->entity, 1, THIS_MODULE);
+	err = drm_sched_job_init(&job->base, &queue->entity, 1, THIS_MODULE, drm_client_id);
 	if (err)
 		return err;
 
diff --git a/drivers/gpu/drm/imagination/pvr_queue.h b/drivers/gpu/drm/imagination/pvr_queue.h
index 93fe9ac9f58c..fc1986d73fc8 100644
--- a/drivers/gpu/drm/imagination/pvr_queue.h
+++ b/drivers/gpu/drm/imagination/pvr_queue.h
@@ -143,7 +143,7 @@  struct pvr_queue {
 
 bool pvr_queue_fence_is_ufo_backed(struct dma_fence *f);
 
-int pvr_queue_job_init(struct pvr_job *job);
+int pvr_queue_job_init(struct pvr_job *job, u64 drm_client_id);
 
 void pvr_queue_job_cleanup(struct pvr_job *job);
 
diff --git a/drivers/gpu/drm/lima/lima_gem.c b/drivers/gpu/drm/lima/lima_gem.c
index 5deec673c11e..9722b847a539 100644
--- a/drivers/gpu/drm/lima/lima_gem.c
+++ b/drivers/gpu/drm/lima/lima_gem.c
@@ -341,7 +341,7 @@  int lima_gem_submit(struct drm_file *file, struct lima_submit *submit)
 
 	err = lima_sched_task_init(
 		submit->task, submit->ctx->context + submit->pipe,
-		bos, submit->nr_bos, vm);
+		bos, submit->nr_bos, vm, file->client_id);
 	if (err)
 		goto err_out1;
 
diff --git a/drivers/gpu/drm/lima/lima_sched.c b/drivers/gpu/drm/lima/lima_sched.c
index 7934098e651b..954f4325b859 100644
--- a/drivers/gpu/drm/lima/lima_sched.c
+++ b/drivers/gpu/drm/lima/lima_sched.c
@@ -113,7 +113,8 @@  static inline struct lima_sched_pipe *to_lima_pipe(struct drm_gpu_scheduler *sch
 int lima_sched_task_init(struct lima_sched_task *task,
 			 struct lima_sched_context *context,
 			 struct lima_bo **bos, int num_bos,
-			 struct lima_vm *vm)
+			 struct lima_vm *vm,
+			 u64 drm_client_id)
 {
 	int err, i;
 
@@ -124,7 +125,8 @@  int lima_sched_task_init(struct lima_sched_task *task,
 	for (i = 0; i < num_bos; i++)
 		drm_gem_object_get(&bos[i]->base.base);
 
-	err = drm_sched_job_init(&task->base, &context->base, 1, vm);
+	err = drm_sched_job_init(&task->base, &context->base, 1, vm,
+				 drm_client_id);
 	if (err) {
 		kfree(task->bos);
 		return err;
diff --git a/drivers/gpu/drm/lima/lima_sched.h b/drivers/gpu/drm/lima/lima_sched.h
index 85b23ba901d5..1a08faf8a529 100644
--- a/drivers/gpu/drm/lima/lima_sched.h
+++ b/drivers/gpu/drm/lima/lima_sched.h
@@ -88,7 +88,8 @@  struct lima_sched_pipe {
 int lima_sched_task_init(struct lima_sched_task *task,
 			 struct lima_sched_context *context,
 			 struct lima_bo **bos, int num_bos,
-			 struct lima_vm *vm);
+			 struct lima_vm *vm,
+			 u64 drm_client_id);
 void lima_sched_task_fini(struct lima_sched_task *task);
 
 int lima_sched_context_init(struct lima_sched_pipe *pipe,
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c
index 3e9aa2cc38ef..d9be0fe3d674 100644
--- a/drivers/gpu/drm/msm/msm_gem_submit.c
+++ b/drivers/gpu/drm/msm/msm_gem_submit.c
@@ -30,7 +30,7 @@ 
 static struct msm_gem_submit *submit_create(struct drm_device *dev,
 		struct msm_gpu *gpu,
 		struct msm_gpu_submitqueue *queue, uint32_t nr_bos,
-		uint32_t nr_cmds)
+		uint32_t nr_cmds, u64 drm_client_id)
 {
 	static atomic_t ident = ATOMIC_INIT(0);
 	struct msm_gem_submit *submit;
@@ -54,7 +54,8 @@  static struct msm_gem_submit *submit_create(struct drm_device *dev,
 		return ERR_PTR(ret);
 	}
 
-	ret = drm_sched_job_init(&submit->base, queue->entity, 1, queue);
+	ret = drm_sched_job_init(&submit->base, queue->entity, 1, queue,
+				 drm_client_id);
 	if (ret) {
 		kfree(submit->hw_fence);
 		kfree(submit);
@@ -693,7 +694,8 @@  int msm_ioctl_gem_submit(struct drm_device *dev, void *data,
 		}
 	}
 
-	submit = submit_create(dev, gpu, queue, args->nr_bos, args->nr_cmds);
+	submit = submit_create(dev, gpu, queue, args->nr_bos, args->nr_cmds,
+			       file->client_id);
 	if (IS_ERR(submit)) {
 		ret = PTR_ERR(submit);
 		goto out_post_unlock;
diff --git a/drivers/gpu/drm/nouveau/nouveau_sched.c b/drivers/gpu/drm/nouveau/nouveau_sched.c
index d326e55d2d24..460a5fb02412 100644
--- a/drivers/gpu/drm/nouveau/nouveau_sched.c
+++ b/drivers/gpu/drm/nouveau/nouveau_sched.c
@@ -87,7 +87,8 @@  nouveau_job_init(struct nouveau_job *job,
 	}
 
 	ret = drm_sched_job_init(&job->base, &sched->entity,
-				 args->credits, NULL);
+				 args->credits, NULL,
+				 job->file_priv->client_id);
 	if (ret)
 		goto err_free_chains;
 
diff --git a/drivers/gpu/drm/panfrost/panfrost_drv.c b/drivers/gpu/drm/panfrost/panfrost_drv.c
index b87f83e94eda..d5c2c6530ed8 100644
--- a/drivers/gpu/drm/panfrost/panfrost_drv.c
+++ b/drivers/gpu/drm/panfrost/panfrost_drv.c
@@ -312,7 +312,7 @@  static int panfrost_ioctl_submit(struct drm_device *dev, void *data,
 
 	ret = drm_sched_job_init(&job->base,
 				 &file_priv->sched_entity[slot],
-				 1, NULL);
+				 1, NULL, file->client_id);
 	if (ret)
 		goto out_put_job;
 
diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c
index 06fe46e32073..bd8e1900c919 100644
--- a/drivers/gpu/drm/panthor/panthor_drv.c
+++ b/drivers/gpu/drm/panthor/panthor_drv.c
@@ -989,7 +989,8 @@  static int panthor_ioctl_group_submit(struct drm_device *ddev, void *data,
 		const struct drm_panthor_queue_submit *qsubmit = &jobs_args[i];
 		struct drm_sched_job *job;
 
-		job = panthor_job_create(pfile, args->group_handle, qsubmit);
+		job = panthor_job_create(pfile, args->group_handle, qsubmit,
+					 file->client_id);
 		if (IS_ERR(job)) {
 			ret = PTR_ERR(job);
 			goto out_cleanup_submit_ctx;
diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c
index 12a02e28f50f..e0c79bd2d173 100644
--- a/drivers/gpu/drm/panthor/panthor_mmu.c
+++ b/drivers/gpu/drm/panthor/panthor_mmu.c
@@ -2516,7 +2516,7 @@  panthor_vm_bind_job_create(struct drm_file *file,
 	kref_init(&job->refcount);
 	job->vm = panthor_vm_get(vm);
 
-	ret = drm_sched_job_init(&job->base, &vm->entity, 1, vm);
+	ret = drm_sched_job_init(&job->base, &vm->entity, 1, vm, file->client_id);
 	if (ret)
 		goto err_put_job;
 
diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/panthor/panthor_sched.c
index 446ec780eb4a..2af860c9068a 100644
--- a/drivers/gpu/drm/panthor/panthor_sched.c
+++ b/drivers/gpu/drm/panthor/panthor_sched.c
@@ -3729,7 +3729,8 @@  struct panthor_vm *panthor_job_vm(struct drm_sched_job *sched_job)
 struct drm_sched_job *
 panthor_job_create(struct panthor_file *pfile,
 		   u16 group_handle,
-		   const struct drm_panthor_queue_submit *qsubmit)
+		   const struct drm_panthor_queue_submit *qsubmit,
+		   u64 drm_client_id)
 {
 	struct panthor_group_pool *gpool = pfile->groups;
 	struct panthor_job *job;
@@ -3801,7 +3802,7 @@  panthor_job_create(struct panthor_file *pfile,
 
 	ret = drm_sched_job_init(&job->base,
 				 &job->group->queues[job->queue_idx]->entity,
-				 credits, job->group);
+				 credits, job->group, drm_client_id);
 	if (ret)
 		goto err_put_job;
 
diff --git a/drivers/gpu/drm/panthor/panthor_sched.h b/drivers/gpu/drm/panthor/panthor_sched.h
index e650a445cf50..742b0b4ff3a3 100644
--- a/drivers/gpu/drm/panthor/panthor_sched.h
+++ b/drivers/gpu/drm/panthor/panthor_sched.h
@@ -29,7 +29,8 @@  int panthor_group_get_state(struct panthor_file *pfile,
 struct drm_sched_job *
 panthor_job_create(struct panthor_file *pfile,
 		   u16 group_handle,
-		   const struct drm_panthor_queue_submit *qsubmit);
+		   const struct drm_panthor_queue_submit *qsubmit,
+		   u64 drm_client_id);
 struct drm_sched_job *panthor_job_get(struct drm_sched_job *job);
 struct panthor_vm *panthor_job_vm(struct drm_sched_job *sched_job);
 void panthor_job_put(struct drm_sched_job *job);
diff --git a/drivers/gpu/drm/scheduler/sched_fence.c b/drivers/gpu/drm/scheduler/sched_fence.c
index e971528504a5..d208d384d38d 100644
--- a/drivers/gpu/drm/scheduler/sched_fence.c
+++ b/drivers/gpu/drm/scheduler/sched_fence.c
@@ -206,7 +206,8 @@  struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f)
 EXPORT_SYMBOL(to_drm_sched_fence);
 
 struct drm_sched_fence *drm_sched_fence_alloc(struct drm_sched_entity *entity,
-					      void *owner)
+					      void *owner,
+					      u64 drm_client_id)
 {
 	struct drm_sched_fence *fence = NULL;
 
@@ -215,6 +216,7 @@  struct drm_sched_fence *drm_sched_fence_alloc(struct drm_sched_entity *entity,
 		return NULL;
 
 	fence->owner = owner;
+	fence->drm_client_id = drm_client_id;
 	spin_lock_init(&fence->lock);
 
 	return fence;
diff --git a/drivers/gpu/drm/scheduler/sched_internal.h b/drivers/gpu/drm/scheduler/sched_internal.h
index 599cf6e1bb74..7ea5a6736f98 100644
--- a/drivers/gpu/drm/scheduler/sched_internal.h
+++ b/drivers/gpu/drm/scheduler/sched_internal.h
@@ -24,7 +24,7 @@  void drm_sched_entity_select_rq(struct drm_sched_entity *entity);
 struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity);
 
 struct drm_sched_fence *drm_sched_fence_alloc(struct drm_sched_entity *s_entity,
-					      void *owner);
+					      void *owner, u64 drm_client_id);
 void drm_sched_fence_init(struct drm_sched_fence *fence,
 			  struct drm_sched_entity *entity);
 void drm_sched_fence_free(struct drm_sched_fence *fence);
diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
index 829579c41c6b..60611618f3ab 100644
--- a/drivers/gpu/drm/scheduler/sched_main.c
+++ b/drivers/gpu/drm/scheduler/sched_main.c
@@ -764,6 +764,7 @@  EXPORT_SYMBOL(drm_sched_resubmit_jobs);
  * @credits: the number of credits this job contributes to the schedulers
  * credit limit
  * @owner: job owner for debugging
+ * @drm_client_id: drm_file.client_id of the owner
  *
  * Refer to drm_sched_entity_push_job() documentation
  * for locking considerations.
@@ -784,7 +785,8 @@  EXPORT_SYMBOL(drm_sched_resubmit_jobs);
  */
 int drm_sched_job_init(struct drm_sched_job *job,
 		       struct drm_sched_entity *entity,
-		       u32 credits, void *owner)
+		       u32 credits, void *owner,
+		       uint64_t drm_client_id)
 {
 	if (!entity->rq) {
 		/* This will most likely be followed by missing frames
@@ -810,7 +812,7 @@  int drm_sched_job_init(struct drm_sched_job *job,
 
 	job->entity = entity;
 	job->credits = credits;
-	job->s_fence = drm_sched_fence_alloc(entity, owner);
+	job->s_fence = drm_sched_fence_alloc(entity, owner, drm_client_id);
 	if (!job->s_fence)
 		return -ENOMEM;
 
diff --git a/drivers/gpu/drm/scheduler/tests/mock_scheduler.c b/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
index f999c8859cf7..09ffbdb32d76 100644
--- a/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
+++ b/drivers/gpu/drm/scheduler/tests/mock_scheduler.c
@@ -35,7 +35,7 @@  drm_mock_sched_entity_new(struct kunit *test,
 	ret = drm_sched_entity_init(&entity->base,
 				    priority,
 				    &drm_sched, 1,
-				    NULL);
+				    NULL, 1);
 	KUNIT_ASSERT_EQ(test, ret, 0);
 
 	entity->test = test;
diff --git a/drivers/gpu/drm/v3d/v3d_submit.c b/drivers/gpu/drm/v3d/v3d_submit.c
index 4ff5de46fb22..5171ffe9012d 100644
--- a/drivers/gpu/drm/v3d/v3d_submit.c
+++ b/drivers/gpu/drm/v3d/v3d_submit.c
@@ -169,7 +169,7 @@  v3d_job_init(struct v3d_dev *v3d, struct drm_file *file_priv,
 	job->file = file_priv;
 
 	ret = drm_sched_job_init(&job->base, &v3d_priv->sched_entity[queue],
-				 1, v3d_priv);
+				 1, v3d_priv, file_priv->client_id);
 	if (ret)
 		return ret;
 
diff --git a/drivers/gpu/drm/xe/xe_sched_job.c b/drivers/gpu/drm/xe/xe_sched_job.c
index 1905ca590965..f4679cb9a56b 100644
--- a/drivers/gpu/drm/xe/xe_sched_job.c
+++ b/drivers/gpu/drm/xe/xe_sched_job.c
@@ -113,7 +113,8 @@  struct xe_sched_job *xe_sched_job_create(struct xe_exec_queue *q,
 	kref_init(&job->refcount);
 	xe_exec_queue_get(job->q);
 
-	err = drm_sched_job_init(&job->drm, q->entity, 1, NULL);
+	err = drm_sched_job_init(&job->drm, q->entity, 1, NULL,
+				 q->xef->drm->client_id);
 	if (err)
 		goto err_free;
 
diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
index 1a7e377d4cbb..6fe3b4c0cffb 100644
--- a/include/drm/gpu_scheduler.h
+++ b/include/drm/gpu_scheduler.h
@@ -305,6 +305,13 @@  struct drm_sched_fence {
          * @owner: job owner for debugging
          */
 	void				*owner;
+
+	/**
+	 * @drm_client_id:
+	 *
+	 * The client_id of the drm_file which owns the job.
+	 */
+	uint64_t			drm_client_id;
 };
 
 struct drm_sched_fence *to_drm_sched_fence(struct dma_fence *f);
@@ -629,7 +636,8 @@  drm_sched_pick_best(struct drm_gpu_scheduler **sched_list,
 
 int drm_sched_job_init(struct drm_sched_job *job,
 		       struct drm_sched_entity *entity,
-		       u32 credits, void *owner);
+		       u32 credits, void *owner,
+		       u64 drm_client_id);
 void drm_sched_job_arm(struct drm_sched_job *job);
 void drm_sched_entity_push_job(struct drm_sched_job *sched_job);
 int drm_sched_job_add_dependency(struct drm_sched_job *job,