Lines Matching full:entity
44 * The jobs in an entity are always scheduled in the order in which they were pushed.
47 * hardware, i.e. the pending queue, the entity must not be referenced anymore
48 * through the jobs entity pointer.
122 * @entity: the scheduler entity
124 * Return true if we can push at least one more job from @entity, false
128 struct drm_sched_entity *entity) in drm_sched_can_queue() argument
132 s_job = to_drm_sched_job(spsc_queue_peek(&entity->job_queue)); in drm_sched_can_queue()
162 static void drm_sched_rq_remove_fifo_locked(struct drm_sched_entity *entity, in drm_sched_rq_remove_fifo_locked() argument
165 if (!RB_EMPTY_NODE(&entity->rb_tree_node)) { in drm_sched_rq_remove_fifo_locked()
166 rb_erase_cached(&entity->rb_tree_node, &rq->rb_tree_root); in drm_sched_rq_remove_fifo_locked()
167 RB_CLEAR_NODE(&entity->rb_tree_node); in drm_sched_rq_remove_fifo_locked()
171 void drm_sched_rq_update_fifo_locked(struct drm_sched_entity *entity, in drm_sched_rq_update_fifo_locked() argument
176 * Both locks need to be grabbed, one to protect from entity->rq change in drm_sched_rq_update_fifo_locked()
177 * for entity from within concurrent drm_sched_entity_select_rq and the in drm_sched_rq_update_fifo_locked()
180 lockdep_assert_held(&entity->lock); in drm_sched_rq_update_fifo_locked()
183 drm_sched_rq_remove_fifo_locked(entity, rq); in drm_sched_rq_update_fifo_locked()
185 entity->oldest_job_waiting = ts; in drm_sched_rq_update_fifo_locked()
187 rb_add_cached(&entity->rb_tree_node, &rq->rb_tree_root, in drm_sched_rq_update_fifo_locked()
210 * drm_sched_rq_add_entity - add an entity
213 * @entity: scheduler entity
215 * Adds a scheduler entity to the run queue.
218 struct drm_sched_entity *entity) in drm_sched_rq_add_entity() argument
220 lockdep_assert_held(&entity->lock); in drm_sched_rq_add_entity()
223 if (!list_empty(&entity->list)) in drm_sched_rq_add_entity()
227 list_add_tail(&entity->list, &rq->entities); in drm_sched_rq_add_entity()
231 * drm_sched_rq_remove_entity - remove an entity
234 * @entity: scheduler entity
236 * Removes a scheduler entity from the run queue.
239 struct drm_sched_entity *entity) in drm_sched_rq_remove_entity() argument
241 lockdep_assert_held(&entity->lock); in drm_sched_rq_remove_entity()
243 if (list_empty(&entity->list)) in drm_sched_rq_remove_entity()
249 list_del_init(&entity->list); in drm_sched_rq_remove_entity()
251 if (rq->current_entity == entity) in drm_sched_rq_remove_entity()
255 drm_sched_rq_remove_fifo_locked(entity, rq); in drm_sched_rq_remove_entity()
261 * drm_sched_rq_select_entity_rr - Select an entity which could provide a job to run
266 * Try to find the next ready entity.
268 * Return an entity if one is found; return an error-pointer (!NULL) if an
269 * entity was ready, but the scheduler had insufficient credits to accommodate
270 * its job; return NULL, if no ready entity was found.
276 struct drm_sched_entity *entity; in drm_sched_rq_select_entity_rr() local
280 entity = rq->current_entity; in drm_sched_rq_select_entity_rr()
281 if (entity) { in drm_sched_rq_select_entity_rr()
282 list_for_each_entry_continue(entity, &rq->entities, list) { in drm_sched_rq_select_entity_rr()
283 if (drm_sched_entity_is_ready(entity)) { in drm_sched_rq_select_entity_rr()
285 * entity in terms of fairness. in drm_sched_rq_select_entity_rr()
287 if (!drm_sched_can_queue(sched, entity)) { in drm_sched_rq_select_entity_rr()
292 rq->current_entity = entity; in drm_sched_rq_select_entity_rr()
293 reinit_completion(&entity->entity_idle); in drm_sched_rq_select_entity_rr()
295 return entity; in drm_sched_rq_select_entity_rr()
300 list_for_each_entry(entity, &rq->entities, list) { in drm_sched_rq_select_entity_rr()
301 if (drm_sched_entity_is_ready(entity)) { in drm_sched_rq_select_entity_rr()
302 /* If we can't queue yet, preserve the current entity in in drm_sched_rq_select_entity_rr()
305 if (!drm_sched_can_queue(sched, entity)) { in drm_sched_rq_select_entity_rr()
310 rq->current_entity = entity; in drm_sched_rq_select_entity_rr()
311 reinit_completion(&entity->entity_idle); in drm_sched_rq_select_entity_rr()
313 return entity; in drm_sched_rq_select_entity_rr()
316 if (entity == rq->current_entity) in drm_sched_rq_select_entity_rr()
326 * drm_sched_rq_select_entity_fifo - Select an entity which provides a job to run
331 * Find oldest waiting ready entity.
333 * Return an entity if one is found; return an error-pointer (!NULL) if an
334 * entity was ready, but the scheduler had insufficient credits to accommodate
335 * its job; return NULL, if no ready entity was found.
345 struct drm_sched_entity *entity; in drm_sched_rq_select_entity_fifo() local
347 entity = rb_entry(rb, struct drm_sched_entity, rb_tree_node); in drm_sched_rq_select_entity_fifo()
348 if (drm_sched_entity_is_ready(entity)) { in drm_sched_rq_select_entity_fifo()
349 /* If we can't queue yet, preserve the current entity in in drm_sched_rq_select_entity_fifo()
352 if (!drm_sched_can_queue(sched, entity)) { in drm_sched_rq_select_entity_fifo()
357 reinit_completion(&entity->entity_idle); in drm_sched_rq_select_entity_fifo()
775 * @entity: scheduler entity to use
791 * has died, which can mean that there's no valid runqueue for a @entity.
798 struct drm_sched_entity *entity, in drm_sched_job_init() argument
801 if (!entity->rq) { in drm_sched_job_init()
806 drm_err(job->sched, "%s: entity has no rq!\n", __func__); in drm_sched_job_init()
823 job->entity = entity; in drm_sched_job_init()
825 job->s_fence = drm_sched_fence_alloc(entity, owner); in drm_sched_job_init()
853 struct drm_sched_entity *entity = job->entity; in drm_sched_job_arm() local
855 BUG_ON(!entity); in drm_sched_job_arm()
856 drm_sched_entity_select_rq(entity); in drm_sched_job_arm()
857 sched = entity->rq->sched; in drm_sched_job_arm()
860 job->s_priority = entity->priority; in drm_sched_job_arm()
863 drm_sched_fence_init(job->s_fence, job->entity); in drm_sched_job_arm()
1048 * drm_sched_select_entity - Select next entity to process
1052 * Return an entity to process or NULL if none are found.
1054 * Note, that we break out of the for-loop when "entity" is non-null, which can
1061 struct drm_sched_entity *entity; in drm_sched_select_entity() local
1067 entity = drm_sched_policy == DRM_SCHED_POLICY_FIFO ? in drm_sched_select_entity()
1070 if (entity) in drm_sched_select_entity()
1074 return IS_ERR(entity) ? NULL : entity; in drm_sched_select_entity()
1189 struct drm_sched_entity *entity; in drm_sched_run_job_work() local
1198 /* Find entity with a ready job */ in drm_sched_run_job_work()
1199 entity = drm_sched_select_entity(sched); in drm_sched_run_job_work()
1200 if (!entity) in drm_sched_run_job_work()
1203 sched_job = drm_sched_entity_pop_job(entity); in drm_sched_run_job_work()
1205 complete_all(&entity->entity_idle); in drm_sched_run_job_work()
1215 trace_drm_run_job(sched_job, entity); in drm_sched_run_job_work()
1217 complete_all(&entity->entity_idle); in drm_sched_run_job_work()
1410 * limit of the scheduler then the respective sched entity is marked guilty and
1417 struct drm_sched_entity *entity; in drm_sched_increase_karma() local
1431 list_for_each_entry_safe(entity, tmp, &rq->entities, list) { in drm_sched_increase_karma()
1433 entity->fence_context) { in drm_sched_increase_karma()
1434 if (entity->guilty) in drm_sched_increase_karma()
1435 atomic_set(entity->guilty, 1); in drm_sched_increase_karma()
1440 if (&entity->list != &rq->entities) in drm_sched_increase_karma()