mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-09-01 07:27:09 +00:00
drm/sched: Store the drm client_id in drm_sched_fence
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> Signed-off-by: Philipp Stanner <phasta@kernel.org> Link: https://lore.kernel.org/r/20250526125505.2360-3-pierre-eric.pelloux-prayer@amd.com
This commit is contained in:
parent
18c44fb647
commit
2956554823
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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];
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -996,7 +996,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;
|
||||
|
@ -2523,7 +2523,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;
|
||||
|
||||
|
@ -3732,7 +3732,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;
|
||||
@ -3804,7 +3805,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;
|
||||
|
||||
|
@ -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);
|
||||
|
@ -205,7 +205,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;
|
||||
|
||||
@ -214,6 +215,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;
|
||||
|
@ -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);
|
||||
|
@ -766,6 +766,8 @@ 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: &struct drm_file.client_id of the owner (used by trace
|
||||
* events)
|
||||
*
|
||||
* Refer to drm_sched_entity_push_job() documentation
|
||||
* for locking considerations.
|
||||
@ -786,7 +788,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
|
||||
@ -812,7 +815,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;
|
||||
|
||||
|
@ -117,7 +117,8 @@ drm_mock_sched_job_new(struct kunit *test,
|
||||
ret = drm_sched_job_init(&job->base,
|
||||
&entity->base,
|
||||
1,
|
||||
NULL);
|
||||
NULL,
|
||||
1);
|
||||
KUNIT_ASSERT_EQ(test, ret, 0);
|
||||
|
||||
job->test = test;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user