Skip to content

Commit 35963cf

Browse files
mbrost05Luben Tuikov
authored andcommitted
drm/sched: Add drm_sched_wqueue_* helpers
Add scheduler wqueue ready, stop, and start helpers to hide the implementation details of the scheduler from the drivers. v2: - s/sched_wqueue/sched_wqueue (Luben) - Remove the extra white line after the return-statement (Luben) - update drm_sched_wqueue_ready comment (Luben) Cc: Luben Tuikov <luben.tuikov@amd.com> Signed-off-by: Matthew Brost <matthew.brost@intel.com> Reviewed-by: Luben Tuikov <luben.tuikov@amd.com> Link: https://lore.kernel.org/r/20231031032439.1558703-2-matthew.brost@intel.com Signed-off-by: Luben Tuikov <ltuikov89@gmail.com>
1 parent 0da611a commit 35963cf

File tree

6 files changed

+59
-18
lines changed

6 files changed

+59
-18
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_arcturus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ static int suspend_resume_compute_scheduler(struct amdgpu_device *adev, bool sus
290290
for (i = 0; i < adev->gfx.num_compute_rings; i++) {
291291
struct amdgpu_ring *ring = &adev->gfx.compute_ring[i];
292292

293-
if (!(ring && ring->sched.thread))
293+
if (!(ring && drm_sched_wqueue_ready(&ring->sched)))
294294
continue;
295295

296296
/* stop secheduler and drain ring. */

drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1659,9 +1659,9 @@ static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)
16591659
for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
16601660
struct amdgpu_ring *ring = adev->rings[i];
16611661

1662-
if (!ring || !ring->sched.thread)
1662+
if (!ring || !drm_sched_wqueue_ready(&ring->sched))
16631663
continue;
1664-
kthread_park(ring->sched.thread);
1664+
drm_sched_wqueue_stop(&ring->sched);
16651665
}
16661666

16671667
seq_puts(m, "run ib test:\n");
@@ -1675,9 +1675,9 @@ static int amdgpu_debugfs_test_ib_show(struct seq_file *m, void *unused)
16751675
for (i = 0; i < AMDGPU_MAX_RINGS; i++) {
16761676
struct amdgpu_ring *ring = adev->rings[i];
16771677

1678-
if (!ring || !ring->sched.thread)
1678+
if (!ring || !drm_sched_wqueue_ready(&ring->sched))
16791679
continue;
1680-
kthread_unpark(ring->sched.thread);
1680+
drm_sched_wqueue_start(&ring->sched);
16811681
}
16821682

16831683
up_write(&adev->reset_domain->sem);
@@ -1897,7 +1897,8 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
18971897

18981898
ring = adev->rings[val];
18991899

1900-
if (!ring || !ring->funcs->preempt_ib || !ring->sched.thread)
1900+
if (!ring || !ring->funcs->preempt_ib ||
1901+
!drm_sched_wqueue_ready(&ring->sched))
19011902
return -EINVAL;
19021903

19031904
/* the last preemption failed */
@@ -1915,7 +1916,7 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
19151916
goto pro_end;
19161917

19171918
/* stop the scheduler */
1918-
kthread_park(ring->sched.thread);
1919+
drm_sched_wqueue_stop(&ring->sched);
19191920

19201921
/* preempt the IB */
19211922
r = amdgpu_ring_preempt_ib(ring);
@@ -1949,7 +1950,7 @@ static int amdgpu_debugfs_ib_preempt(void *data, u64 val)
19491950

19501951
failure:
19511952
/* restart the scheduler */
1952-
kthread_unpark(ring->sched.thread);
1953+
drm_sched_wqueue_start(&ring->sched);
19531954

19541955
up_read(&adev->reset_domain->sem);
19551956

drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4601,7 +4601,7 @@ bool amdgpu_device_has_job_running(struct amdgpu_device *adev)
46014601
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
46024602
struct amdgpu_ring *ring = adev->rings[i];
46034603

4604-
if (!ring || !ring->sched.thread)
4604+
if (!ring || !drm_sched_wqueue_ready(&ring->sched))
46054605
continue;
46064606

46074607
spin_lock(&ring->sched.job_list_lock);
@@ -4740,7 +4740,7 @@ int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,
47404740
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
47414741
struct amdgpu_ring *ring = adev->rings[i];
47424742

4743-
if (!ring || !ring->sched.thread)
4743+
if (!ring || !drm_sched_wqueue_ready(&ring->sched))
47444744
continue;
47454745

47464746
/* Clear job fence from fence drv to avoid force_completion
@@ -5282,7 +5282,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
52825282
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
52835283
struct amdgpu_ring *ring = tmp_adev->rings[i];
52845284

5285-
if (!ring || !ring->sched.thread)
5285+
if (!ring || !drm_sched_wqueue_ready(&ring->sched))
52865286
continue;
52875287

52885288
drm_sched_stop(&ring->sched, job ? &job->base : NULL);
@@ -5357,7 +5357,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
53575357
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
53585358
struct amdgpu_ring *ring = tmp_adev->rings[i];
53595359

5360-
if (!ring || !ring->sched.thread)
5360+
if (!ring || !drm_sched_wqueue_ready(&ring->sched))
53615361
continue;
53625362

53635363
drm_sched_start(&ring->sched, true);
@@ -5683,7 +5683,7 @@ pci_ers_result_t amdgpu_pci_error_detected(struct pci_dev *pdev, pci_channel_sta
56835683
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
56845684
struct amdgpu_ring *ring = adev->rings[i];
56855685

5686-
if (!ring || !ring->sched.thread)
5686+
if (!ring || !drm_sched_wqueue_ready(&ring->sched))
56875687
continue;
56885688

56895689
drm_sched_stop(&ring->sched, NULL);
@@ -5811,7 +5811,7 @@ void amdgpu_pci_resume(struct pci_dev *pdev)
58115811
for (i = 0; i < AMDGPU_MAX_RINGS; ++i) {
58125812
struct amdgpu_ring *ring = adev->rings[i];
58135813

5814-
if (!ring || !ring->sched.thread)
5814+
if (!ring || !drm_sched_wqueue_ready(&ring->sched))
58155815
continue;
58165816

58175817
drm_sched_start(&ring->sched, true);

drivers/gpu/drm/msm/adreno/adreno_device.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -809,7 +809,8 @@ static void suspend_scheduler(struct msm_gpu *gpu)
809809
*/
810810
for (i = 0; i < gpu->nr_rings; i++) {
811811
struct drm_gpu_scheduler *sched = &gpu->rb[i]->sched;
812-
kthread_park(sched->thread);
812+
813+
drm_sched_wqueue_stop(sched);
813814
}
814815
}
815816

@@ -819,7 +820,8 @@ static void resume_scheduler(struct msm_gpu *gpu)
819820

820821
for (i = 0; i < gpu->nr_rings; i++) {
821822
struct drm_gpu_scheduler *sched = &gpu->rb[i]->sched;
822-
kthread_unpark(sched->thread);
823+
824+
drm_sched_wqueue_start(sched);
823825
}
824826
}
825827

drivers/gpu/drm/scheduler/sched_main.c

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ void drm_sched_stop(struct drm_gpu_scheduler *sched, struct drm_sched_job *bad)
439439
{
440440
struct drm_sched_job *s_job, *tmp;
441441

442-
kthread_park(sched->thread);
442+
drm_sched_wqueue_stop(sched);
443443

444444
/*
445445
* Reinsert back the bad job here - now it's safe as
@@ -552,7 +552,7 @@ void drm_sched_start(struct drm_gpu_scheduler *sched, bool full_recovery)
552552
spin_unlock(&sched->job_list_lock);
553553
}
554554

555-
kthread_unpark(sched->thread);
555+
drm_sched_wqueue_start(sched);
556556
}
557557
EXPORT_SYMBOL(drm_sched_start);
558558

@@ -1252,3 +1252,38 @@ void drm_sched_increase_karma(struct drm_sched_job *bad)
12521252
}
12531253
}
12541254
EXPORT_SYMBOL(drm_sched_increase_karma);
1255+
1256+
/**
1257+
* drm_sched_wqueue_ready - Is the scheduler ready for submission
1258+
*
1259+
* @sched: scheduler instance
1260+
*
1261+
* Returns true if submission is ready
1262+
*/
1263+
bool drm_sched_wqueue_ready(struct drm_gpu_scheduler *sched)
1264+
{
1265+
return !!sched->thread;
1266+
}
1267+
EXPORT_SYMBOL(drm_sched_wqueue_ready);
1268+
1269+
/**
1270+
* drm_sched_wqueue_stop - stop scheduler submission
1271+
*
1272+
* @sched: scheduler instance
1273+
*/
1274+
void drm_sched_wqueue_stop(struct drm_gpu_scheduler *sched)
1275+
{
1276+
kthread_park(sched->thread);
1277+
}
1278+
EXPORT_SYMBOL(drm_sched_wqueue_stop);
1279+
1280+
/**
1281+
* drm_sched_wqueue_start - start scheduler submission
1282+
*
1283+
* @sched: scheduler instance
1284+
*/
1285+
void drm_sched_wqueue_start(struct drm_gpu_scheduler *sched)
1286+
{
1287+
kthread_unpark(sched->thread);
1288+
}
1289+
EXPORT_SYMBOL(drm_sched_wqueue_start);

include/drm/gpu_scheduler.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,9 @@ void drm_sched_entity_modify_sched(struct drm_sched_entity *entity,
553553

554554
void drm_sched_job_cleanup(struct drm_sched_job *job);
555555
void drm_sched_wakeup_if_can_queue(struct drm_gpu_scheduler *sched);
556+
bool drm_sched_wqueue_ready(struct drm_gpu_scheduler *sched);
557+
void drm_sched_wqueue_stop(struct drm_gpu_scheduler *sched);
558+
void drm_sched_wqueue_start(struct drm_gpu_scheduler *sched);
556559
void drm_sched_stop(struct drm_gpu_scheduler *sched, struct drm_sched_job *bad);
557560
void drm_sched_start(struct drm_gpu_scheduler *sched, bool full_recovery);
558561
void drm_sched_resubmit_jobs(struct drm_gpu_scheduler *sched);

0 commit comments

Comments
 (0)