drm/scheduler: implement a function to modify sched list
authorNirmoy Das <nirmoy.das@amd.com>
Thu, 27 Feb 2020 14:34:15 +0000 (15:34 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 9 Mar 2020 17:51:35 +0000 (13:51 -0400)
Implement drm_sched_entity_modify_sched() which modifies existing
sched_list with a different one. This is going to be helpful when
userspace changes priority of a ctx/entity then the driver can switch
to the corresponding HW scheduler list for that priority.

Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/scheduler/sched_entity.c
include/drm/gpu_scheduler.h

index 63bccd201b976717fd78fc812cded3c784b2522d..90fd9c30ae5a48997a4fdac4ecee3fb0007dbe07 100644 (file)
@@ -83,6 +83,24 @@ int drm_sched_entity_init(struct drm_sched_entity *entity,
 }
 EXPORT_SYMBOL(drm_sched_entity_init);
 
+/**
+ * drm_sched_entity_modify_sched - Modify sched of an entity
+ * @entity: scheduler entity to init
+ * @sched_list: the list of new drm scheds which will replace
+ *              existing entity->sched_list
+ * @num_sched_list: number of drm sched in sched_list
+ */
+void drm_sched_entity_modify_sched(struct drm_sched_entity *entity,
+                                   struct drm_gpu_scheduler **sched_list,
+                                   unsigned int num_sched_list)
+{
+       WARN_ON(!num_sched_list || !sched_list);
+
+       entity->sched_list = sched_list;
+       entity->num_sched_list = num_sched_list;
+}
+EXPORT_SYMBOL(drm_sched_entity_modify_sched);
+
 /**
  * drm_sched_entity_is_idle - Check if entity is idle
  *
index 589be851f8a108ed9e121de40a611f0b4cb8c653..d8972836d24830fc59441a8c2d77f546e4828ef9 100644 (file)
@@ -297,6 +297,10 @@ void drm_sched_fini(struct drm_gpu_scheduler *sched);
 int drm_sched_job_init(struct drm_sched_job *job,
                       struct drm_sched_entity *entity,
                       void *owner);
+void drm_sched_entity_modify_sched(struct drm_sched_entity *entity,
+                                   struct drm_gpu_scheduler **sched_list,
+                                   unsigned int num_sched_list);
+
 void drm_sched_job_cleanup(struct drm_sched_job *job);
 void drm_sched_wakeup(struct drm_gpu_scheduler *sched);
 void drm_sched_stop(struct drm_gpu_scheduler *sched, struct drm_sched_job *bad);