mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 08:03:01 +09:00
drm/sched: improve docs around drm_sched_entity
I found a few too many things that are tricky and not documented, so I
started typing.
I found a few more things that looked broken while typing, see the
varios FIXME in drm_sched_entity.
Also some of the usual logics:
- actually include sched_entity.c declarations, that was lost in the
move here: 620e762f9a ("drm/scheduler: move entity handling into
separate file")
- Ditch the kerneldoc for internal functions, keep the comments where
they're describing more than what the function name already implies.
- Switch drm_sched_entity to inline docs.
Acked-by: Melissa Wen <mwen@igalia.com>
Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> (v1)
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: David Airlie <airlied@linux.ie>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Cc: Maxime Ripard <mripard@kernel.org>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: "Christian König" <christian.koenig@amd.com>
Cc: Boris Brezillon <boris.brezillon@collabora.com>
Cc: Steven Price <steven.price@arm.com>
Cc: Emma Anholt <emma@anholt.net>
Cc: Lee Jones <lee.jones@linaro.org>
Cc: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210805104705.862416-7-daniel.vetter@ffwll.ch
This commit is contained in:
@@ -53,56 +53,147 @@ enum drm_sched_priority {
|
||||
* struct drm_sched_entity - A wrapper around a job queue (typically
|
||||
* attached to the DRM file_priv).
|
||||
*
|
||||
* @list: used to append this struct to the list of entities in the
|
||||
* runqueue.
|
||||
* @rq: runqueue on which this entity is currently scheduled.
|
||||
* @sched_list: A list of schedulers (drm_gpu_schedulers).
|
||||
* Jobs from this entity can be scheduled on any scheduler
|
||||
* on this list.
|
||||
* @num_sched_list: number of drm_gpu_schedulers in the sched_list.
|
||||
* @priority: priority of the entity
|
||||
* @rq_lock: lock to modify the runqueue to which this entity belongs.
|
||||
* @job_queue: the list of jobs of this entity.
|
||||
* @fence_seq: a linearly increasing seqno incremented with each
|
||||
* new &drm_sched_fence which is part of the entity.
|
||||
* @fence_context: a unique context for all the fences which belong
|
||||
* to this entity.
|
||||
* The &drm_sched_fence.scheduled uses the
|
||||
* fence_context but &drm_sched_fence.finished uses
|
||||
* fence_context + 1.
|
||||
* @dependency: the dependency fence of the job which is on the top
|
||||
* of the job queue.
|
||||
* @cb: callback for the dependency fence above.
|
||||
* @guilty: points to ctx's guilty.
|
||||
* @fini_status: contains the exit status in case the process was signalled.
|
||||
* @last_scheduled: points to the finished fence of the last scheduled job.
|
||||
* @last_user: last group leader pushing a job into the entity.
|
||||
* @stopped: Marks the enity as removed from rq and destined for termination.
|
||||
* @entity_idle: Signals when enityt is not in use
|
||||
*
|
||||
* Entities will emit jobs in order to their corresponding hardware
|
||||
* ring, and the scheduler will alternate between entities based on
|
||||
* scheduling policy.
|
||||
*/
|
||||
struct drm_sched_entity {
|
||||
/**
|
||||
* @list:
|
||||
*
|
||||
* Used to append this struct to the list of entities in the runqueue
|
||||
* @rq under &drm_sched_rq.entities.
|
||||
*
|
||||
* Protected by &drm_sched_rq.lock of @rq.
|
||||
*/
|
||||
struct list_head list;
|
||||
|
||||
/**
|
||||
* @rq:
|
||||
*
|
||||
* Runqueue on which this entity is currently scheduled.
|
||||
*
|
||||
* FIXME: Locking is very unclear for this. Writers are protected by
|
||||
* @rq_lock, but readers are generally lockless and seem to just race
|
||||
* with not even a READ_ONCE.
|
||||
*/
|
||||
struct drm_sched_rq *rq;
|
||||
|
||||
/**
|
||||
* @sched_list:
|
||||
*
|
||||
* A list of schedulers (struct drm_gpu_scheduler). Jobs from this entity can
|
||||
* be scheduled on any scheduler on this list.
|
||||
*
|
||||
* This can be modified by calling drm_sched_entity_modify_sched().
|
||||
* Locking is entirely up to the driver, see the above function for more
|
||||
* details.
|
||||
*
|
||||
* This will be set to NULL if &num_sched_list equals 1 and @rq has been
|
||||
* set already.
|
||||
*
|
||||
* FIXME: This means priority changes through
|
||||
* drm_sched_entity_set_priority() will be lost henceforth in this case.
|
||||
*/
|
||||
struct drm_gpu_scheduler **sched_list;
|
||||
|
||||
/**
|
||||
* @num_sched_list:
|
||||
*
|
||||
* Number of drm_gpu_schedulers in the @sched_list.
|
||||
*/
|
||||
unsigned int num_sched_list;
|
||||
|
||||
/**
|
||||
* @priority:
|
||||
*
|
||||
* Priority of the entity. This can be modified by calling
|
||||
* drm_sched_entity_set_priority(). Protected by &rq_lock.
|
||||
*/
|
||||
enum drm_sched_priority priority;
|
||||
|
||||
/**
|
||||
* @rq_lock:
|
||||
*
|
||||
* Lock to modify the runqueue to which this entity belongs.
|
||||
*/
|
||||
spinlock_t rq_lock;
|
||||
|
||||
/**
|
||||
* @job_queue: the list of jobs of this entity.
|
||||
*/
|
||||
struct spsc_queue job_queue;
|
||||
|
||||
/**
|
||||
* @fence_seq:
|
||||
*
|
||||
* A linearly increasing seqno incremented with each new
|
||||
* &drm_sched_fence which is part of the entity.
|
||||
*
|
||||
* FIXME: Callers of drm_sched_job_arm() need to ensure correct locking,
|
||||
* this doesn't need to be atomic.
|
||||
*/
|
||||
atomic_t fence_seq;
|
||||
|
||||
/**
|
||||
* @fence_context:
|
||||
*
|
||||
* A unique context for all the fences which belong to this entity. The
|
||||
* &drm_sched_fence.scheduled uses the fence_context but
|
||||
* &drm_sched_fence.finished uses fence_context + 1.
|
||||
*/
|
||||
uint64_t fence_context;
|
||||
|
||||
/**
|
||||
* @dependency:
|
||||
*
|
||||
* The dependency fence of the job which is on the top of the job queue.
|
||||
*/
|
||||
struct dma_fence *dependency;
|
||||
|
||||
/**
|
||||
* @cb:
|
||||
*
|
||||
* Callback for the dependency fence above.
|
||||
*/
|
||||
struct dma_fence_cb cb;
|
||||
|
||||
/**
|
||||
* @guilty:
|
||||
*
|
||||
* Points to entities' guilty.
|
||||
*/
|
||||
atomic_t *guilty;
|
||||
|
||||
/**
|
||||
* @last_scheduled:
|
||||
*
|
||||
* Points to the finished fence of the last scheduled job. Only written
|
||||
* by the scheduler thread, can be accessed locklessly from
|
||||
* drm_sched_job_arm() iff the queue is empty.
|
||||
*/
|
||||
struct dma_fence *last_scheduled;
|
||||
|
||||
/**
|
||||
* @last_user: last group leader pushing a job into the entity.
|
||||
*/
|
||||
struct task_struct *last_user;
|
||||
|
||||
/**
|
||||
* @stopped:
|
||||
*
|
||||
* Marks the enity as removed from rq and destined for
|
||||
* termination. This is set by calling drm_sched_entity_flush() and by
|
||||
* drm_sched_fini().
|
||||
*/
|
||||
bool stopped;
|
||||
|
||||
/**
|
||||
* @entity_idle:
|
||||
*
|
||||
* Signals when entity is not in use, used to sequence entity cleanup in
|
||||
* drm_sched_entity_fini().
|
||||
*/
|
||||
struct completion entity_idle;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user