The first kfd_process is created through open(),
this commit marks it as the primary kfd_process.

Only the primary process should register the mmu_notifier.

Signed-off-by: Zhu Lingshan <lingshan....@amd.com>
---
 drivers/gpu/drm/amd/amdkfd/kfd_priv.h    |  3 +++
 drivers/gpu/drm/amd/amdkfd/kfd_process.c | 20 ++++++++++++--------
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h 
b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index 38a20ba61e24..8149ce0639c0 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -1006,6 +1006,9 @@ struct kfd_process {
 
        /* if gpu page fault sent to KFD */
        bool gpu_page_fault;
+
+       /* indicating whether this is a primary kfd_process */
+       bool primary;
 };
 
 #define KFD_PROCESS_TABLE_SIZE 8 /* bits: 256 entries */
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index 722ac1662bdc..955ca8725bc5 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -68,7 +68,7 @@ static struct workqueue_struct *kfd_restore_wq;
 static struct kfd_process *find_process(const struct task_struct *thread,
                                        bool ref);
 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, 
bool primary);
 
 static void evict_process_worker(struct work_struct *work);
 static void restore_process_worker(struct work_struct *work);
@@ -867,7 +867,7 @@ struct kfd_process *kfd_create_process(struct task_struct 
*thread)
        if (process) {
                pr_debug("Process already found\n");
        } else {
-               process = create_process(thread);
+               process = create_process(thread, true);
                if (IS_ERR(process))
                        goto out;
 
@@ -1510,7 +1510,7 @@ void kfd_process_set_trap_debug_flag(struct 
qcm_process_device *qpd,
  * On return the kfd_process is fully operational and will be freed when the
  * mm is released
  */
-static struct kfd_process *create_process(const struct task_struct *thread)
+static struct kfd_process *create_process(const struct task_struct *thread, 
bool primary)
 {
        struct kfd_process *process;
        struct mmu_notifier *mn;
@@ -1526,6 +1526,8 @@ static struct kfd_process *create_process(const struct 
task_struct *thread)
        process->lead_thread = thread->group_leader;
        process->n_pdds = 0;
        process->queues_paused = false;
+       process->primary = primary;
+
        INIT_DELAYED_WORK(&process->eviction_work, evict_process_worker);
        INIT_DELAYED_WORK(&process->restore_work, restore_process_worker);
        process->last_restore_timestamp = get_jiffies_64();
@@ -1569,12 +1571,14 @@ static struct kfd_process *create_process(const struct 
task_struct *thread)
         * After this point, mmu_notifier_put will trigger the cleanup by
         * dropping the last process reference in the free_notifier.
         */
-       mn = mmu_notifier_get(&kfd_process_mmu_notifier_ops, process->mm);
-       if (IS_ERR(mn)) {
-               err = PTR_ERR(mn);
-               goto err_register_notifier;
+       if (primary) {
+               mn = mmu_notifier_get(&kfd_process_mmu_notifier_ops, 
process->mm);
+               if (IS_ERR(mn)) {
+                       err = PTR_ERR(mn);
+                       goto err_register_notifier;
+               }
+               BUG_ON(mn != &process->mmu_notifier);
        }
-       BUG_ON(mn != &process->mmu_notifier);
 
        kfd_unref_process(process);
        get_task_struct(process->lead_thread);
-- 
2.47.1

Reply via email to