Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Bail out if s_fence is no longer fresh.
- https://patchwork.freedesktop.org/patch/333645/
- --- a/drivers/gpu/drm/scheduler/sched_main.c
- +++ b/drivers/gpu/drm/scheduler/sched_main.c
- @@ -333,6 +333,10 @@ void drm_sched_increase_karma(struct drm
- spin_lock(&rq->lock);
- list_for_each_entry_safe(entity, tmp, &rq->entities, list) {
- + if (!smp_load_acquire(&bad->s_fence)) {
- + spin_unlock(&rq->lock);
- + return;
- + }
- if (bad->s_fence->scheduled.context ==
- entity->fence_context) {
- if (atomic_read(&bad->karma) >
- @@ -543,7 +547,7 @@ EXPORT_SYMBOL(drm_sched_job_init);
- void drm_sched_job_cleanup(struct drm_sched_job *job)
- {
- dma_fence_put(&job->s_fence->finished);
- - job->s_fence = NULL;
- + smp_store_release(&job->s_fence, 0);
- }
- EXPORT_SYMBOL(drm_sched_job_cleanup);
- Panfrost uses multiple schedulers (one for each slot, so 2 in reality),
- and on a timeout has to stop all the schedulers to safely perform a
- reset. However more than one scheduler can trigger a timeout at the same
- time. This race condition results in jobs being freed while they are
- still in use.
- Modify drm_sched_stop() to call cancel_delayed_work_sync() when stopping
- a different scheduler to the one belonging to the passed in job.
- panfrost_job_timedout() is also modified to only allow one thread at a
- time to handle the reset. Any subsequent threads simply return assuming
- that the first thread will handle the situation.
- https://patchwork.freedesktop.org/patch/333258/
- MRFIXIT had to adjust
- diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h
- index f503c566e99f..6441c7fba6c4 100644
- --- a/drivers/gpu/drm/panfrost/panfrost_device.h
- +++ b/drivers/gpu/drm/panfrost/panfrost_device.h
- @@ -99,6 +99,8 @@ struct panfrost_device {
- unsigned long cur_volt;
- struct panfrost_devfreq_slot slot[NUM_JOB_SLOTS];
- } devfreq;
- +
- + bool is_resetting;
- };
- struct panfrost_mmu {
- diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c
- index 05c85f45a0de..1b2019e08b43 100644
- --- a/drivers/gpu/drm/panfrost/panfrost_job.c
- +++ b/drivers/gpu/drm/panfrost/panfrost_job.c
- @@ -383,6 +383,14 @@
- mutex_lock(&pfdev->reset_lock);
- + if (pfdev->is_resetting) {
- + mutex_unlock(&pfdev->reset_lock);
- + return;
- + }
- + pfdev->is_resetting = true;
- +
- + mutex_unlock(&pfdev->reset_lock);
- +
- for (i = 0; i < NUM_JOB_SLOTS; i++)
- drm_sched_stop(&pfdev->js->queue[i].sched, sched_job);
- @@ -398,7 +406,7 @@
- }
- spin_unlock_irqrestore(&pfdev->js->job_lock, flags);
- - /* panfrost_core_dump(pfdev); */
- + mutex_lock(&pfdev->reset_lock);
- panfrost_devfreq_record_transition(pfdev, js);
- panfrost_device_reset(pfdev);
- @@ -410,6 +418,7 @@
- for (i = 0; i < NUM_JOB_SLOTS; i++)
- drm_sched_start(&pfdev->js->queue[i].sched, true);
- + pfdev->is_resetting = false;
- mutex_unlock(&pfdev->reset_lock);
- }
- diff --git a/drivers/gpu/drm/scheduler/sched_main.c b/drivers/gpu/drm/scheduler/sched_main.c
- index 148468447ba9..bc6d1862ec8a 100644
- --- a/drivers/gpu/drm/scheduler/sched_main.c
- +++ b/drivers/gpu/drm/scheduler/sched_main.c
- @@ -415,7 +415,10 @@ void drm_sched_stop(struct drm_gpu_scheduler *sched, struct drm_sched_job *bad)
- * this TDR finished and before the newly restarted jobs had a
- * chance to complete.
- */
- - cancel_delayed_work(&sched->work_tdr);
- + if (bad->sched != sched)
- + cancel_delayed_work_sync(&sched->work_tdr);
- + else
- + cancel_delayed_work(&sched->work_tdr);
- }
- EXPORT_SYMBOL(drm_sched_stop);
- https://patchwork.kernel.org/cover/10954237/
- "32-bit hack"
- --- a/drivers/iommu/io-pgtable-arm.c
- +++ b/drivers/iommu/io-pgtable-arm.c
- @@ -1023,7 +1023,9 @@ arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
- iop = arm_64_lpae_alloc_pgtable_s1(cfg, cookie);
- if (iop) {
- u64 mair, ttbr;
- + struct arm_lpae_io_pgtable *data = io_pgtable_ops_to_data(&iop->ops);
- + data->levels = 4;
- /* Copy values as union fields overlap */
- mair = cfg->arm_lpae_s1_cfg.mair[0];
- ttbr = cfg->arm_lpae_s1_cfg.ttbr[0];
- --- a/drivers/iommu/io-pgtable-arm.c
- +++ b/drivers/iommu/io-pgtable-arm.c
- @@ -1016,7 +1016,7 @@ arm_mali_lpae_alloc_pgtable(struct io_pgtable_cfg *cfg, void *cookie)
- {
- struct io_pgtable *iop;
- - if (cfg->ias != 48 || cfg->oas > 40)
- + if (cfg->ias > 48 || cfg->oas > 40)
- return NULL;
- cfg->pgsize_bitmap &= (SZ_4K | SZ_2M | SZ_1G);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement