drm/scheduler: add a list of run queues to the entity
authorNayan Deshmukh <nayan26deshmukh@gmail.com>
Wed, 1 Aug 2018 08:19:59 +0000 (13:49 +0530)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 27 Aug 2018 16:09:44 +0000 (11:09 -0500)
These are the potential run queues on which the jobs from this
entity can be scheduled. We will use this to do load balancing.

Signed-off-by: Nayan Deshmukh <nayan26deshmukh@gmail.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/scheduler/gpu_scheduler.c
include/drm/gpu_scheduler.h

index 4fc211e19d6e5aac3dd0cfddc3b72f4a6f858730..afffb9a60cdb95180a49cc1fa0029e6165618f2f 100644 (file)
@@ -179,6 +179,8 @@ int drm_sched_entity_init(struct drm_sched_entity *entity,
                          unsigned int num_rq_list,
                          atomic_t *guilty)
 {
+       int i;
+
        if (!(entity && rq_list && num_rq_list > 0 && rq_list[0]))
                return -EINVAL;
 
@@ -186,6 +188,11 @@ int drm_sched_entity_init(struct drm_sched_entity *entity,
        INIT_LIST_HEAD(&entity->list);
        entity->rq = rq_list[0];
        entity->guilty = guilty;
+       entity->num_rq_list = num_rq_list;
+       entity->rq_list = kcalloc(num_rq_list, sizeof(struct drm_sched_rq *),
+                               GFP_KERNEL);
+       for (i = 0; i < num_rq_list; ++i)
+               entity->rq_list[i] = rq_list[i];
        entity->last_scheduled = NULL;
 
        spin_lock_init(&entity->rq_lock);
@@ -348,6 +355,7 @@ void drm_sched_entity_fini(struct drm_sched_entity *entity)
 
        dma_fence_put(entity->last_scheduled);
        entity->last_scheduled = NULL;
+       kfree(entity->rq_list);
 }
 EXPORT_SYMBOL(drm_sched_entity_fini);
 
index 21c648b0b2a16c6dce65d61a75ced0823999ed95..2419887e25eb865fd66af1b4cfc1fb8cdaac948d 100644 (file)
@@ -50,7 +50,10 @@ enum drm_sched_priority {
  *
  * @list: used to append this struct to the list of entities in the
  *        runqueue.
- * @rq: runqueue to which this entity belongs.
+ * @rq: runqueue on which this entity is currently scheduled.
+ * @rq_list: a list of run queues on which jobs from this entity can
+ *           be scheduled
+ * @num_rq_list: number of run queues in the rq_list
  * @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
@@ -75,6 +78,8 @@ enum drm_sched_priority {
 struct drm_sched_entity {
        struct list_head                list;
        struct drm_sched_rq             *rq;
+       struct drm_sched_rq             **rq_list;
+       unsigned int                    num_rq_list;
        spinlock_t                      rq_lock;
 
        struct spsc_queue               job_queue;