retval = dqm->asic_ops.update_qpd(dqm, qpd);
 
        dqm->processes_count++;
-       kfd_inc_compute_active(dqm->dev);
 
        dqm_unlock(dqm);
 
+       /* Outside the DQM lock because under the DQM lock we can't do
+        * reclaim or take other locks that others hold while reclaiming.
+        */
+       kfd_inc_compute_active(dqm->dev);
+
        return retval;
 }
 
                        list_del(&cur->list);
                        kfree(cur);
                        dqm->processes_count--;
-                       kfd_dec_compute_active(dqm->dev);
                        goto out;
                }
        }
        retval = 1;
 out:
        dqm_unlock(dqm);
+
+       /* Outside the DQM lock because under the DQM lock we can't do
+        * reclaim or take other locks that others hold while reclaiming.
+        */
+       if (!retval)
+               kfd_dec_compute_active(dqm->dev);
+
        return retval;
 }
 
        struct queue *q, *next;
        struct device_process_node *cur, *next_dpn;
        int retval = 0;
+       bool found = false;
 
        dqm_lock(dqm);
 
                        list_del(&cur->list);
                        kfree(cur);
                        dqm->processes_count--;
-                       kfd_dec_compute_active(dqm->dev);
+                       found = true;
                        break;
                }
        }
 
        dqm_unlock(dqm);
+
+       /* Outside the DQM lock because under the DQM lock we can't do
+        * reclaim or take other locks that others hold while reclaiming.
+        */
+       if (found)
+               kfd_dec_compute_active(dqm->dev);
+
        return retval;
 }
 
        struct device_process_node *cur, *next_dpn;
        enum kfd_unmap_queues_filter filter =
                KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES;
+       bool found = false;
 
        retval = 0;
 
                        list_del(&cur->list);
                        kfree(cur);
                        dqm->processes_count--;
-                       kfd_dec_compute_active(dqm->dev);
+                       found = true;
                        break;
                }
        }
 
        dqm_unlock(dqm);
 
+       /* Outside the DQM lock because under the DQM lock we can't do
+        * reclaim or take other locks that others hold while reclaiming.
+        */
+       if (found)
+               kfd_dec_compute_active(dqm->dev);
+
        /* Lastly, free mqd resources.
         * Do uninit_mqd() after dqm_unlock to avoid circular locking.
         */