aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3413-drm-amdkfd-Simplify-locking-during-process-creation.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3413-drm-amdkfd-Simplify-locking-during-process-creation.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3413-drm-amdkfd-Simplify-locking-during-process-creation.patch138
1 files changed, 138 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3413-drm-amdkfd-Simplify-locking-during-process-creation.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3413-drm-amdkfd-Simplify-locking-during-process-creation.patch
new file mode 100644
index 00000000..e36c8e58
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3413-drm-amdkfd-Simplify-locking-during-process-creation.patch
@@ -0,0 +1,138 @@
+From 9137f34298c0a8fa4ec5e0ddec783a4ddf094659 Mon Sep 17 00:00:00 2001
+From: Yong Zhao <yong.zhao@amd.com>
+Date: Mon, 27 Nov 2017 18:29:56 -0500
+Subject: [PATCH 3413/4131] drm/amdkfd: Simplify locking during process
+ creation
+
+Also fixes error handling if kfd_process_init_cwsr fails.
+
+Signed-off-by: Yong Zhao <yong.zhao@amd.com>
+Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
+Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com>
+Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
+---
+ drivers/gpu/drm/amd/amdkfd/kfd_process.c | 46 +++++++++++++++-----------------
+ 1 file changed, 21 insertions(+), 25 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+index 096710c..a22fb071 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+@@ -50,7 +50,8 @@ static struct workqueue_struct *kfd_process_wq;
+
+ static struct kfd_process *find_process(const struct task_struct *thread);
+ static void kfd_process_ref_release(struct kref *ref);
+-static struct kfd_process *create_process(const struct task_struct *thread);
++static struct kfd_process *create_process(const struct task_struct *thread,
++ struct file *filep);
+ static int kfd_process_init_cwsr(struct kfd_process *p, struct file *filep);
+
+
+@@ -80,9 +81,6 @@ struct kfd_process *kfd_create_process(struct file *filep)
+ if (thread->group_leader->mm != thread->mm)
+ return ERR_PTR(-EINVAL);
+
+- /* Take mmap_sem because we call __mmu_notifier_register inside */
+- down_write(&thread->mm->mmap_sem);
+-
+ /*
+ * take kfd processes mutex before starting of process creation
+ * so there won't be a case where two threads of the same process
+@@ -94,16 +92,11 @@ struct kfd_process *kfd_create_process(struct file *filep)
+ process = find_process(thread);
+ if (process)
+ pr_debug("Process already found\n");
+-
+- if (!process)
+- process = create_process(thread);
++ else
++ process = create_process(thread, filep);
+
+ mutex_unlock(&kfd_processes_mutex);
+
+- up_write(&thread->mm->mmap_sem);
+-
+- kfd_process_init_cwsr(process, filep);
+-
+ return process;
+ }
+
+@@ -274,15 +267,12 @@ static const struct mmu_notifier_ops kfd_process_mmu_notifier_ops = {
+
+ static int kfd_process_init_cwsr(struct kfd_process *p, struct file *filep)
+ {
+- int err = 0;
+ unsigned long offset;
+- struct kfd_process_device *temp, *pdd = NULL;
++ struct kfd_process_device *pdd = NULL;
+ struct kfd_dev *dev = NULL;
+ struct qcm_process_device *qpd = NULL;
+
+- mutex_lock(&p->mutex);
+- list_for_each_entry_safe(pdd, temp, &p->per_device_data,
+- per_device_list) {
++ list_for_each_entry(pdd, &p->per_device_data, per_device_list) {
+ dev = pdd->dev;
+ qpd = &pdd->qpd;
+ if (!dev->cwsr_enabled || qpd->cwsr_kaddr)
+@@ -293,12 +283,12 @@ static int kfd_process_init_cwsr(struct kfd_process *p, struct file *filep)
+ MAP_SHARED, offset);
+
+ if (IS_ERR_VALUE(qpd->tba_addr)) {
+- pr_err("Failure to set tba address. error -%d.\n",
+- (int)qpd->tba_addr);
+- err = qpd->tba_addr;
++ int err = qpd->tba_addr;
++
++ pr_err("Failure to set tba address. error %d.\n", err);
+ qpd->tba_addr = 0;
+ qpd->cwsr_kaddr = NULL;
+- goto out;
++ return err;
+ }
+
+ memcpy(qpd->cwsr_kaddr, dev->cwsr_isa, dev->cwsr_isa_size);
+@@ -307,12 +297,12 @@ static int kfd_process_init_cwsr(struct kfd_process *p, struct file *filep)
+ pr_debug("set tba :0x%llx, tma:0x%llx, cwsr_kaddr:%p for pqm.\n",
+ qpd->tba_addr, qpd->tma_addr, qpd->cwsr_kaddr);
+ }
+-out:
+- mutex_unlock(&p->mutex);
+- return err;
++
++ return 0;
+ }
+
+-static struct kfd_process *create_process(const struct task_struct *thread)
++static struct kfd_process *create_process(const struct task_struct *thread,
++ struct file *filep)
+ {
+ struct kfd_process *process;
+ int err = -ENOMEM;
+@@ -337,7 +327,7 @@ static struct kfd_process *create_process(const struct task_struct *thread)
+
+ /* register notifier */
+ process->mmu_notifier.ops = &kfd_process_mmu_notifier_ops;
+- err = __mmu_notifier_register(&process->mmu_notifier, process->mm);
++ err = mmu_notifier_register(&process->mmu_notifier, process->mm);
+ if (err)
+ goto err_mmu_notifier;
+
+@@ -361,8 +351,14 @@ static struct kfd_process *create_process(const struct task_struct *thread)
+ if (err != 0)
+ goto err_init_apertures;
+
++ err = kfd_process_init_cwsr(process, filep);
++ if (err)
++ goto err_init_cwsr;
++
+ return process;
+
++err_init_cwsr:
++ kfd_process_destroy_pdds(process);
+ err_init_apertures:
+ pqm_uninit(&process->pqm);
+ err_process_pqm_init:
+--
+2.7.4
+