diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0250-drm-amdkfd-make-reset-wavefronts-per-process-per-dev.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0250-drm-amdkfd-make-reset-wavefronts-per-process-per-dev.patch | 142 |
1 files changed, 0 insertions, 142 deletions
diff --git a/common/recipes-kernel/linux/files/0250-drm-amdkfd-make-reset-wavefronts-per-process-per-dev.patch b/common/recipes-kernel/linux/files/0250-drm-amdkfd-make-reset-wavefronts-per-process-per-dev.patch deleted file mode 100644 index 925b6947..00000000 --- a/common/recipes-kernel/linux/files/0250-drm-amdkfd-make-reset-wavefronts-per-process-per-dev.patch +++ /dev/null @@ -1,142 +0,0 @@ -From a82918f18a846e4e2be8613029d03c3cb3e99460 Mon Sep 17 00:00:00 2001 -From: Ben Goz <ben.goz@amd.com> -Date: Wed, 25 Mar 2015 13:12:20 +0200 -Subject: [PATCH 0250/1050] drm/amdkfd: make reset wavefronts per process per - device - -This commit moves the reset wavefront flag to per process per device -data structure, so we can support multiple devices. - -Signed-off-by: Ben Goz <ben.goz@amd.com> -Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com> ---- - .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 7 ++++--- - drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 10 +++++----- - drivers/gpu/drm/amd/amdkfd/kfd_process.c | 21 ++++++++++++++++----- - 3 files changed, 25 insertions(+), 13 deletions(-) - -diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c -index 547b0a5..4bb7f42 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c -@@ -946,7 +946,7 @@ static int destroy_queues_cpsch(struct device_queue_manager *dqm, - { - int retval; - enum kfd_preempt_type_filter preempt_type; -- struct kfd_process *p; -+ struct kfd_process_device *pdd; - - BUG_ON(!dqm); - -@@ -981,8 +981,9 @@ static int destroy_queues_cpsch(struct device_queue_manager *dqm, - retval = amdkfd_fence_wait_timeout(dqm->fence_addr, KFD_FENCE_COMPLETED, - QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS); - if (retval != 0) { -- p = kfd_get_process(current); -- p->reset_wavefronts = true; -+ pdd = kfd_get_process_device_data(dqm->dev, -+ kfd_get_process(current)); -+ pdd->reset_wavefronts = true; - goto out; - } - pm_release_ib(&dqm->packets); -diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h -index cb79046..d0d5f4b 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h -@@ -463,6 +463,11 @@ struct kfd_process_device { - - /* Is this process/pasid bound to this device? (amd_iommu_bind_pasid) */ - bool bound; -+ -+ /* This flag tells if we should reset all -+ * wavefronts on process termination -+ */ -+ bool reset_wavefronts; - }; - - #define qpd_to_pdd(x) container_of(x, struct kfd_process_device, qpd) -@@ -519,11 +524,6 @@ struct kfd_process { - event_pages */ - u32 next_nonsignal_event_id; - size_t signal_event_count; -- /* -- * This flag tells if we should reset all wavefronts on -- * process termination -- */ -- bool reset_wavefronts; - }; - - /** -diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c -index 56b904f..8a1f999 100644 ---- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c -+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c -@@ -173,7 +173,7 @@ static void kfd_process_wq_release(struct work_struct *work) - pr_debug("Releasing pdd (topology id %d) for process (pasid %d) in workqueue\n", - pdd->dev->id, p->pasid); - -- if (p->reset_wavefronts) -+ if (pdd->reset_wavefronts) - dbgdev_wave_reset_wavefronts(pdd->dev, p); - - amd_iommu_unbind_pasid(pdd->dev->pdev, p->pasid); -@@ -222,6 +222,7 @@ static void kfd_process_notifier_release(struct mmu_notifier *mn, - struct mm_struct *mm) - { - struct kfd_process *p; -+ struct kfd_process_device *pdd = NULL; - - /* - * The kfd_process structure can not be free because the -@@ -240,6 +241,15 @@ static void kfd_process_notifier_release(struct mmu_notifier *mn, - /* In case our notifier is called before IOMMU notifier */ - pqm_uninit(&p->pqm); - -+ /* Iterate over all process device data structure and check -+ * if we should reset all wavefronts */ -+ list_for_each_entry(pdd, &p->per_device_data, per_device_list) -+ if (pdd->reset_wavefronts) { -+ pr_warn("amdkfd: Resetting all wave fronts\n"); -+ dbgdev_wave_reset_wavefronts(pdd->dev, p); -+ pdd->reset_wavefronts = false; -+ } -+ - mutex_unlock(&p->mutex); - - /* -@@ -305,8 +315,6 @@ static struct kfd_process *create_process(const struct task_struct *thread) - if (kfd_init_apertures(process) != 0) - goto err_init_apretures; - -- process->reset_wavefronts = false; -- - return process; - - err_init_apretures: -@@ -348,6 +356,7 @@ struct kfd_process_device *kfd_create_process_device_data(struct kfd_dev *dev, - INIT_LIST_HEAD(&pdd->qpd.queues_list); - INIT_LIST_HEAD(&pdd->qpd.priv_queue_list); - pdd->qpd.dqm = dev->dqm; -+ pdd->reset_wavefronts = false; - list_add(&pdd->per_device_list, &p->per_device_data); - } - -@@ -409,10 +418,12 @@ void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid) - kfd_dbgmgr_destroy(dev->dbgmgr); - - pqm_uninit(&p->pqm); -- if (p->reset_wavefronts) -- dbgdev_wave_reset_wavefronts(dev, p); - - pdd = kfd_get_process_device_data(dev, p); -+ if (pdd->reset_wavefronts) { -+ dbgdev_wave_reset_wavefronts(pdd->dev, p); -+ pdd->reset_wavefronts = false; -+ } - - /* - * Just mark pdd as unbound, because we still need it to call --- -1.9.1 - |