drm/amdkfd: Fix CRIU restore op due to doorbell offset
authorRajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
Wed, 7 Sep 2022 18:13:54 +0000 (14:13 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 13 Sep 2022 16:54:23 +0000 (12:54 -0400)
Recently introduced change to allocate doorbells only when the first
queue is created or mapped for CPU / GPU access, did not consider
Checkpoint Restore scenario completely. This fix allows the CRIU restore
operation by extending the doorbell optimization to CRIU restore
scenario.

Fixes: 16f0013157bf ("drm/amdkfd: Allocate doorbells only when needed")

Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhardwaj@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
drivers/gpu/drm/amd/amdkfd/kfd_doorbell.c
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c

index 84da1a9..56f7307 100644 (file)
@@ -2153,6 +2153,12 @@ static int criu_restore_devices(struct kfd_process *p,
                        ret = PTR_ERR(pdd);
                        goto exit;
                }
+
+               if (!pdd->doorbell_index &&
+                   kfd_alloc_process_doorbells(pdd->dev, &pdd->doorbell_index) < 0) {
+                       ret = -ENOMEM;
+                       goto exit;
+               }
        }
 
        /*
index b33798f..cd4e61b 100644 (file)
@@ -303,6 +303,9 @@ int kfd_alloc_process_doorbells(struct kfd_dev *kfd, unsigned int *doorbell_inde
        if (r > 0)
                *doorbell_index = r;
 
+       if (r < 0)
+               pr_err("Failed to allocate process doorbells\n");
+
        return r;
 }
 
index 6e3e7f5..5137476 100644 (file)
@@ -857,6 +857,13 @@ int kfd_criu_restore_queue(struct kfd_process *p,
                ret = -EINVAL;
                goto exit;
        }
+
+       if (!pdd->doorbell_index &&
+           kfd_alloc_process_doorbells(pdd->dev, &pdd->doorbell_index) < 0) {
+               ret = -ENOMEM;
+               goto exit;
+       }
+
        /* data stored in this order: mqd, ctl_stack */
        mqd = q_extra_data;
        ctl_stack = mqd + q_data->mqd_size;