]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
drm/amdgpu: Add work_struct for GPU reset from kfd.
authorAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Tue, 17 May 2022 18:25:20 +0000 (14:25 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 10 Jun 2022 19:26:07 +0000 (15:26 -0400)
We need to have a work_struct to cancel this reset if another
already in progress.

Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c

index 1f8161cd507f007eb2da2d2cea5a10044aa53db3..a23abc0e86e7223bf864acbe1de1c3d297603855 100644 (file)
@@ -33,6 +33,7 @@
 #include <uapi/linux/kfd_ioctl.h>
 #include "amdgpu_ras.h"
 #include "amdgpu_umc.h"
+#include "amdgpu_reset.h"
 
 /* Total memory size in system memory and all GPU VRAM. Used to
  * estimate worst case amount of memory to reserve for page tables
@@ -122,6 +123,15 @@ static void amdgpu_doorbell_get_kfd_info(struct amdgpu_device *adev,
        }
 }
 
+
+static void amdgpu_amdkfd_reset_work(struct work_struct *work)
+{
+       struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
+                                                 kfd.reset_work);
+
+       amdgpu_device_gpu_recover_imp(adev, NULL);
+}
+
 void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
 {
        int i;
@@ -180,6 +190,8 @@ void amdgpu_amdkfd_device_init(struct amdgpu_device *adev)
 
                adev->kfd.init_complete = kgd2kfd_device_init(adev->kfd.dev,
                                                adev_to_drm(adev), &gpu_resources);
+
+               INIT_WORK(&adev->kfd.reset_work, amdgpu_amdkfd_reset_work);
        }
 }
 
@@ -247,7 +259,8 @@ int amdgpu_amdkfd_post_reset(struct amdgpu_device *adev)
 void amdgpu_amdkfd_gpu_reset(struct amdgpu_device *adev)
 {
        if (amdgpu_device_should_recover_gpu(adev))
-               amdgpu_device_gpu_recover(adev, NULL);
+               amdgpu_reset_domain_schedule(adev->reset_domain,
+                                            &adev->kfd.reset_work);
 }
 
 int amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
index bbe7d81bb0df857451818626667dc522ddd429c7..ffb2b7d9b9a53805c13bf04e9eccdc2338160c4b 100644 (file)
@@ -97,6 +97,7 @@ struct amdgpu_kfd_dev {
        struct kfd_dev *dev;
        uint64_t vram_used;
        bool init_complete;
+       struct work_struct reset_work;
 };
 
 enum kgd_engine_type {
index 6abec88cb5a87b7d5b2edb0197eeb0dec16f1871..2d490941e727530545aae5decece05d469297f7f 100644 (file)
@@ -5323,37 +5323,6 @@ skip_sched_resume:
        return r;
 }
 
-struct amdgpu_recover_work_struct {
-       struct work_struct base;
-       struct amdgpu_device *adev;
-       struct amdgpu_job *job;
-       int ret;
-};
-
-static void amdgpu_device_queue_gpu_recover_work(struct work_struct *work)
-{
-       struct amdgpu_recover_work_struct *recover_work = container_of(work, struct amdgpu_recover_work_struct, base);
-
-       amdgpu_device_gpu_recover_imp(recover_work->adev, recover_work->job);
-}
-/*
- * Serialize gpu recover into reset domain single threaded wq
- */
-int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
-                                   struct amdgpu_job *job)
-{
-       struct amdgpu_recover_work_struct work = {.adev = adev, .job = job};
-
-       INIT_WORK(&work.base, amdgpu_device_queue_gpu_recover_work);
-
-       if (!amdgpu_reset_domain_schedule(adev->reset_domain, &work.base))
-               return -EAGAIN;
-
-       flush_work(&work.base);
-
-       return atomic_read(&adev->reset_domain->reset_res);
-}
-
 /**
  * amdgpu_device_get_pcie_info - fence pcie info about the PCIE slot
  *