Skip to content

Commit 134e71b

Browse files
Tvrtko UrsulinPhilipp Stanner
authored andcommitted
drm/sched: Further optimise drm_sched_entity_push_job
Having removed one re-lock cycle on the entity->lock in a patch titled "drm/sched: Optimise drm_sched_entity_push_job", with only a tiny bit larger refactoring we can do the same optimisation on the rq->lock. (Currently both drm_sched_rq_add_entity() and drm_sched_rq_update_fifo_locked() take and release the same lock.) To achieve this we make drm_sched_rq_update_fifo_locked() and drm_sched_rq_add_entity() expect the rq->lock to be held. We also align drm_sched_rq_update_fifo_locked(), drm_sched_rq_add_entity() and drm_sched_rq_remove_fifo_locked() function signatures, by adding rq as a parameter to the latter. v2: * Fix after rebase of the series. * Avoid naming inconsistency between drm_sched_rq_add/remove. (Christian) Signed-off-by: Tvrtko Ursulin <[email protected]> Cc: Christian König <[email protected]> Cc: Alex Deucher <[email protected]> Cc: Luben Tuikov <[email protected]> Cc: Matthew Brost <[email protected]> Cc: Philipp Stanner <[email protected]> Reviewed-by: Christian König <[email protected]> Reviewed-by: Philipp Stanner <[email protected]> Signed-off-by: Philipp Stanner <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent f93126f commit 134e71b

File tree

3 files changed

+25
-18
lines changed

3 files changed

+25
-18
lines changed

drivers/gpu/drm/scheduler/sched_entity.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -515,9 +515,14 @@ struct drm_sched_job *drm_sched_entity_pop_job(struct drm_sched_entity *entity)
515515

516516
next = to_drm_sched_job(spsc_queue_peek(&entity->job_queue));
517517
if (next) {
518+
struct drm_sched_rq *rq;
519+
518520
spin_lock(&entity->lock);
519-
drm_sched_rq_update_fifo_locked(entity,
521+
rq = entity->rq;
522+
spin_lock(&rq->lock);
523+
drm_sched_rq_update_fifo_locked(entity, rq,
520524
next->submit_ts);
525+
spin_unlock(&rq->lock);
521526
spin_unlock(&entity->lock);
522527
}
523528
}
@@ -616,11 +621,13 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job)
616621
rq = entity->rq;
617622
sched = rq->sched;
618623

624+
spin_lock(&rq->lock);
619625
drm_sched_rq_add_entity(rq, entity);
620626

621627
if (drm_sched_policy == DRM_SCHED_POLICY_FIFO)
622-
drm_sched_rq_update_fifo_locked(entity, submit_ts);
628+
drm_sched_rq_update_fifo_locked(entity, rq, submit_ts);
623629

630+
spin_unlock(&rq->lock);
624631
spin_unlock(&entity->lock);
625632

626633
drm_sched_wakeup(sched);

drivers/gpu/drm/scheduler/sched_main.c

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -153,35 +153,33 @@ static __always_inline bool drm_sched_entity_compare_before(struct rb_node *a,
153153
return ktime_before(ent_a->oldest_job_waiting, ent_b->oldest_job_waiting);
154154
}
155155

156-
static inline void drm_sched_rq_remove_fifo_locked(struct drm_sched_entity *entity)
156+
static void drm_sched_rq_remove_fifo_locked(struct drm_sched_entity *entity,
157+
struct drm_sched_rq *rq)
157158
{
158-
struct drm_sched_rq *rq = entity->rq;
159-
160159
if (!RB_EMPTY_NODE(&entity->rb_tree_node)) {
161160
rb_erase_cached(&entity->rb_tree_node, &rq->rb_tree_root);
162161
RB_CLEAR_NODE(&entity->rb_tree_node);
163162
}
164163
}
165164

166-
void drm_sched_rq_update_fifo_locked(struct drm_sched_entity *entity, ktime_t ts)
165+
void drm_sched_rq_update_fifo_locked(struct drm_sched_entity *entity,
166+
struct drm_sched_rq *rq,
167+
ktime_t ts)
167168
{
168169
/*
169170
* Both locks need to be grabbed, one to protect from entity->rq change
170171
* for entity from within concurrent drm_sched_entity_select_rq and the
171172
* other to update the rb tree structure.
172173
*/
173174
lockdep_assert_held(&entity->lock);
175+
lockdep_assert_held(&rq->lock);
174176

175-
spin_lock(&entity->rq->lock);
176-
177-
drm_sched_rq_remove_fifo_locked(entity);
177+
drm_sched_rq_remove_fifo_locked(entity, rq);
178178

179179
entity->oldest_job_waiting = ts;
180180

181-
rb_add_cached(&entity->rb_tree_node, &entity->rq->rb_tree_root,
181+
rb_add_cached(&entity->rb_tree_node, &rq->rb_tree_root,
182182
drm_sched_entity_compare_before);
183-
184-
spin_unlock(&entity->rq->lock);
185183
}
186184

187185
/**
@@ -213,15 +211,14 @@ static void drm_sched_rq_init(struct drm_gpu_scheduler *sched,
213211
void drm_sched_rq_add_entity(struct drm_sched_rq *rq,
214212
struct drm_sched_entity *entity)
215213
{
214+
lockdep_assert_held(&entity->lock);
215+
lockdep_assert_held(&rq->lock);
216+
216217
if (!list_empty(&entity->list))
217218
return;
218219

219-
spin_lock(&rq->lock);
220-
221220
atomic_inc(rq->sched->score);
222221
list_add_tail(&entity->list, &rq->entities);
223-
224-
spin_unlock(&rq->lock);
225222
}
226223

227224
/**
@@ -235,6 +232,8 @@ void drm_sched_rq_add_entity(struct drm_sched_rq *rq,
235232
void drm_sched_rq_remove_entity(struct drm_sched_rq *rq,
236233
struct drm_sched_entity *entity)
237234
{
235+
lockdep_assert_held(&entity->lock);
236+
238237
if (list_empty(&entity->list))
239238
return;
240239

@@ -247,7 +246,7 @@ void drm_sched_rq_remove_entity(struct drm_sched_rq *rq,
247246
rq->current_entity = NULL;
248247

249248
if (drm_sched_policy == DRM_SCHED_POLICY_FIFO)
250-
drm_sched_rq_remove_fifo_locked(entity);
249+
drm_sched_rq_remove_fifo_locked(entity, rq);
251250

252251
spin_unlock(&rq->lock);
253252
}

include/drm/gpu_scheduler.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -596,7 +596,8 @@ void drm_sched_rq_add_entity(struct drm_sched_rq *rq,
596596
void drm_sched_rq_remove_entity(struct drm_sched_rq *rq,
597597
struct drm_sched_entity *entity);
598598

599-
void drm_sched_rq_update_fifo_locked(struct drm_sched_entity *entity, ktime_t ts);
599+
void drm_sched_rq_update_fifo_locked(struct drm_sched_entity *entity,
600+
struct drm_sched_rq *rq, ktime_t ts);
600601

601602
int drm_sched_entity_init(struct drm_sched_entity *entity,
602603
enum drm_sched_priority priority,

0 commit comments

Comments
 (0)