[PATCH 1/2] drm/scheduler: Scheduler priority fixes
Luben Tuikov
luben.tuikov at amd.com
Fri Aug 14 21:32:32 UTC 2020
On 2020-08-14 4:58 p.m., Alex Deucher wrote:
> On Fri, Aug 14, 2020 at 3:33 PM Alex Deucher <alexdeucher at gmail.com> wrote:
>>
>> + dri-devel
>>
>> On Fri, Aug 14, 2020 at 3:14 PM Luben Tuikov <luben.tuikov at amd.com> wrote:
>>>
>>> Remove DRM_SCHED_PRIORITY_LOW, as it was used
>>> in only one place.
>>>
>>> Rename and separate by a line
>>> DRM_SCHED_PRIORITY_MAX to DRM_SCHED_PRIORITY_COUNT
>>> as it represents a (total) count of said
>>> priorities and it is used as such in loops
>>> throughout the code. (0-based indexing is the
>>> the count number.)
>>>
>>> Remove redundant word HIGH in priority names,
>>> and rename *KERNEL* to *HIGH*, as it really
>>> means that, high.
>>>
>>> Signed-off-by: Luben Tuikov <luben.tuikov at amd.com>
>>> ---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c | 6 +++---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_job.c | 2 +-
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 2 +-
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 2 +-
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c | 6 +++---
>>> drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 2 +-
>>> drivers/gpu/drm/scheduler/sched_main.c | 8 ++++----
>>> include/drm/gpu_scheduler.h | 15 +++++++++------
>>> 8 files changed, 23 insertions(+), 20 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
>>> index d85d13f7a043..fd97ac34277b 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
>>> @@ -46,7 +46,7 @@ const unsigned int amdgpu_ctx_num_entities[AMDGPU_HW_IP_NUM] = {
>>> static int amdgpu_ctx_priority_permit(struct drm_file *filp,
>>> enum drm_sched_priority priority)
>>> {
>>> - if (priority < 0 || priority >= DRM_SCHED_PRIORITY_MAX)
>>> + if (priority < 0 || priority >= DRM_SCHED_PRIORITY_COUNT)
>>> return -EINVAL;
>>>
>>> /* NORMAL and below are accessible by everyone */
>>> @@ -65,8 +65,8 @@ static int amdgpu_ctx_priority_permit(struct drm_file *filp,
>>> static enum gfx_pipe_priority amdgpu_ctx_sched_prio_to_compute_prio(enum drm_sched_priority prio)
>>> {
>>> switch (prio) {
>>> - case DRM_SCHED_PRIORITY_HIGH_HW:
>>> - case DRM_SCHED_PRIORITY_KERNEL:
>>> + case DRM_SCHED_PRIORITY_HW:
>>> + case DRM_SCHED_PRIORITY_HIGH:
>>> return AMDGPU_GFX_PIPE_PRIO_HIGH;
>>> default:
>>> return AMDGPU_GFX_PIPE_PRIO_NORMAL;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>>> index 75d37dfb51aa..bb9e5481ff3c 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
>>> @@ -251,7 +251,7 @@ void amdgpu_job_stop_all_jobs_on_sched(struct drm_gpu_scheduler *sched)
>>> int i;
>>>
>>> /* Signal all jobs not yet scheduled */
>>> - for (i = DRM_SCHED_PRIORITY_MAX - 1; i >= DRM_SCHED_PRIORITY_MIN; i--) {
>>> + for (i = DRM_SCHED_PRIORITY_COUNT - 1; i >= DRM_SCHED_PRIORITY_MIN; i--) {
>>> struct drm_sched_rq *rq = &sched->sched_rq[i];
>>>
>>> if (!rq)
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
>>> index 13ea8ebc421c..6d4fc79bf84a 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
>>> @@ -267,7 +267,7 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
>>> &ring->sched;
>>> }
>>>
>>> - for (i = 0; i < DRM_SCHED_PRIORITY_MAX; ++i)
>>> + for (i = DRM_SCHED_PRIORITY_MIN; i < DRM_SCHED_PRIORITY_COUNT; ++i)
>>> atomic_set(&ring->num_jobs[i], 0);
>>>
>>> return 0;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>>> index da871d84b742..7112137689db 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>>> @@ -243,7 +243,7 @@ struct amdgpu_ring {
>>> bool has_compute_vm_bug;
>>> bool no_scheduler;
>>>
>>> - atomic_t num_jobs[DRM_SCHED_PRIORITY_MAX];
>>> + atomic_t num_jobs[DRM_SCHED_PRIORITY_COUNT];
>>> struct mutex priority_mutex;
>>> /* protected by priority_mutex */
>>> int priority;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
>>> index c799691dfa84..e05bc22a0a49 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sched.c
>>> @@ -36,14 +36,14 @@ enum drm_sched_priority amdgpu_to_sched_priority(int amdgpu_priority)
>>> {
>>> switch (amdgpu_priority) {
>>> case AMDGPU_CTX_PRIORITY_VERY_HIGH:
>>> - return DRM_SCHED_PRIORITY_HIGH_HW;
>>> + return DRM_SCHED_PRIORITY_HW;
>>> case AMDGPU_CTX_PRIORITY_HIGH:
>>> - return DRM_SCHED_PRIORITY_HIGH_SW;
>>> + return DRM_SCHED_PRIORITY_SW;
>>> case AMDGPU_CTX_PRIORITY_NORMAL:
>>> return DRM_SCHED_PRIORITY_NORMAL;
>>> case AMDGPU_CTX_PRIORITY_LOW:
>>> case AMDGPU_CTX_PRIORITY_VERY_LOW:
>>> - return DRM_SCHED_PRIORITY_LOW;
>>> + return DRM_SCHED_PRIORITY_MIN;
>>> case AMDGPU_CTX_PRIORITY_UNSET:
>>> return DRM_SCHED_PRIORITY_UNSET;
>>> default:
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>> index 20fa0497aaa4..bc4bdb90d8f7 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
>>> @@ -2114,7 +2114,7 @@ void amdgpu_ttm_set_buffer_funcs_status(struct amdgpu_device *adev, bool enable)
>>> ring = adev->mman.buffer_funcs_ring;
>>> sched = &ring->sched;
>>> r = drm_sched_entity_init(&adev->mman.entity,
>>> - DRM_SCHED_PRIORITY_KERNEL, &sched,
>>> + DRM_SCHED_PRIORITY_HIGH, &sched,
>>> 1, NULL);
>>> if (r) {
>>> DRM_ERROR("Failed setting up TTM BO move entity (%d)\n",
>>> diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
>>> index 2f319102ae9f..c2947e73d1b6 100644
>>> --- a/drivers/gpu/drm/scheduler/sched_main.c
>>> +++ b/drivers/gpu/drm/scheduler/sched_main.c
>>> @@ -335,9 +335,9 @@ void drm_sched_increase_karma(struct drm_sched_job *bad)
>>> * because sometimes GPU hang would cause kernel jobs (like VM updating jobs)
>>> * corrupt but keep in mind that kernel jobs always considered good.
>>> */
>>> - if (bad->s_priority != DRM_SCHED_PRIORITY_KERNEL) {
>>> + if (bad->s_priority != DRM_SCHED_PRIORITY_HIGH) {
>>> atomic_inc(&bad->karma);
>>> - for (i = DRM_SCHED_PRIORITY_MIN; i < DRM_SCHED_PRIORITY_KERNEL;
>>> + for (i = DRM_SCHED_PRIORITY_MIN; i < DRM_SCHED_PRIORITY_HIGH;
>>> i++) {
>>> struct drm_sched_rq *rq = &sched->sched_rq[i];
>>>
>>> @@ -623,7 +623,7 @@ drm_sched_select_entity(struct drm_gpu_scheduler *sched)
>>> return NULL;
>>>
>>> /* Kernel run queue has higher priority than normal run queue*/
>>> - for (i = DRM_SCHED_PRIORITY_MAX - 1; i >= DRM_SCHED_PRIORITY_MIN; i--) {
>>> + for (i = DRM_SCHED_PRIORITY_COUNT - 1; i >= DRM_SCHED_PRIORITY_MIN; i--) {
>>> entity = drm_sched_rq_select_entity(&sched->sched_rq[i]);
>>> if (entity)
>>> break;
>>> @@ -851,7 +851,7 @@ int drm_sched_init(struct drm_gpu_scheduler *sched,
>>> sched->name = name;
>>> sched->timeout = timeout;
>>> sched->hang_limit = hang_limit;
>>> - for (i = DRM_SCHED_PRIORITY_MIN; i < DRM_SCHED_PRIORITY_MAX; i++)
>>> + for (i = DRM_SCHED_PRIORITY_MIN; i < DRM_SCHED_PRIORITY_COUNT; i++)
>>> drm_sched_rq_init(sched, &sched->sched_rq[i]);
>>>
>>> init_waitqueue_head(&sched->wake_up_worker);
>>> diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h
>>> index 26b04ff62676..8ae9b8f73bf9 100644
>>> --- a/include/drm/gpu_scheduler.h
>>> +++ b/include/drm/gpu_scheduler.h
>>> @@ -33,14 +33,17 @@
>>> struct drm_gpu_scheduler;
>>> struct drm_sched_rq;
>>>
>>> +/* These are often used as an (initial) index
>>> + * to an array, and as such should start at 0.
>>> + */
>>> enum drm_sched_priority {
>>> DRM_SCHED_PRIORITY_MIN,
>>> - DRM_SCHED_PRIORITY_LOW = DRM_SCHED_PRIORITY_MIN,
>>> DRM_SCHED_PRIORITY_NORMAL,
>>> - DRM_SCHED_PRIORITY_HIGH_SW,
>>> - DRM_SCHED_PRIORITY_HIGH_HW,
>>
>> We originally added HIGH_SW and HIGH_HW to differentiate between two
>> different high priority modes; e.g., HIGH_SW meant that the gpu
>> scheduler would schedule with high priority, HIGH_HW meant that the
>> hardware would schedule with high priority. You can set different
>> queue priorities in the hardware and work from the high priority queue
>> will get scheduled on the hw sooner than lower priority queues. Not
>> all engines support HW queue priorities however.
>
> Thinking about this more, I think we can probably just get rid of the
> SW and HW settings and just have a HIGH setting. We can use HIGH
> whether or not we have additional hw priority features or not. We
> want to keep KERNEL however since that is the highest priority and it
> makes it obvious what it is for. Submissions from the kernel need to
> be the highest priority (e.g., memory managment or page table
> updates).
>
"MIN, NORMAL, HIGH, KERNEL", sure we can do that. That's better
and gets rid of the ambiguous "SW, HW". I'll do that.
Regards,
Luben
More information about the amd-gfx
mailing list