drm/amdkfd: Add crash protection in debugger register path
authorPhilip Yang <Philip.Yang@amd.com>
Mon, 27 Nov 2017 23:29:44 +0000 (18:29 -0500)
committerOded Gabbay <oded.gabbay@gmail.com>
Mon, 27 Nov 2017 23:29:44 +0000 (18:29 -0500)
After debugger is registered, the pqm_destroy_queue fails because is_debug
is true, the queue should not be removed from process_queue_list since
the count is not reduced.

Test application calls debugger unregister without register debugger, add
null pointer check protection to avoid crash for this case

Signed-off-by: Philip Yang <Philip.Yang@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_chardev.c
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c

index cc61ec2..62c3d9c 100644 (file)
@@ -526,7 +526,7 @@ static int kfd_ioctl_dbg_unregister(struct file *filep,
        long status;
 
        dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
+       if (!dev || !dev->dbgmgr)
                return -EINVAL;
 
        if (dev->device_info->asic_family == CHIP_CARRIZO) {
index fbfa274..991b3bf 100644 (file)
@@ -311,6 +311,10 @@ int pqm_destroy_queue(struct process_queue_manager *pqm, unsigned int qid)
        if (pqn->q) {
                dqm = pqn->q->device->dqm;
                retval = dqm->ops.destroy_queue(dqm, &pdd->qpd, pqn->q);
+               if (retval) {
+                       pr_debug("Destroy queue failed, returned %d\n", retval);
+                       goto err_destroy_queue;
+               }
                uninit_queue(pqn->q);
        }
 
@@ -322,6 +326,7 @@ int pqm_destroy_queue(struct process_queue_manager *pqm, unsigned int qid)
            list_empty(&pdd->qpd.priv_queue_list))
                dqm->ops.unregister_process(dqm, &pdd->qpd);
 
+err_destroy_queue:
        return retval;
 }