drm/amdkfd: add reset cause in gpu pre-reset smi event
authorEric Huang <jinhuieric.huang@amd.com>
Mon, 3 Jun 2024 16:04:59 +0000 (12:04 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 5 Jun 2024 15:25:14 +0000 (11:25 -0400)
reset cause is requested by customer as additional
info for gpu reset smi event.

v2: integerate reset sources suggested by Lijo Lazar

Signed-off-by: Eric Huang <jinhuieric.huang@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@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
drivers/gpu/drm/amd/amdkfd/kfd_device.c
drivers/gpu/drm/amd/amdkfd/kfd_smi_events.c
drivers/gpu/drm/amd/amdkfd/kfd_smi_events.h

index e3738d4172458c3a034d2f343595cdb5c84bdca1..03205e3c37463874e37d3e74d97b03599efc8c08 100644 (file)
@@ -133,6 +133,9 @@ static void amdgpu_amdkfd_reset_work(struct work_struct *work)
 
        reset_context.method = AMD_RESET_METHOD_NONE;
        reset_context.reset_req_dev = adev;
+       reset_context.src = adev->enable_mes ?
+                           AMDGPU_RESET_SRC_MES :
+                           AMDGPU_RESET_SRC_HWS;
        clear_bit(AMDGPU_NEED_FULL_RESET, &reset_context.flags);
 
        amdgpu_device_gpu_recover(adev, NULL, &reset_context);
@@ -261,12 +264,13 @@ int amdgpu_amdkfd_resume(struct amdgpu_device *adev, bool run_pm)
        return r;
 }
 
-int amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev)
+int amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev,
+                           struct amdgpu_reset_context *reset_context)
 {
        int r = 0;
 
        if (adev->kfd.dev)
-               r = kgd2kfd_pre_reset(adev->kfd.dev);
+               r = kgd2kfd_pre_reset(adev->kfd.dev, reset_context);
 
        return r;
 }
index 1de021ebdd467b5dcb270cab41314f462333a20a..e7bb1ca3580142c45c6d1ca790e41a1cea140aaf 100644 (file)
@@ -47,6 +47,7 @@ enum TLB_FLUSH_TYPE {
 };
 
 struct amdgpu_device;
+struct amdgpu_reset_context;
 
 enum kfd_mem_attachment_type {
        KFD_MEM_ATT_SHARED,     /* Share kgd_mem->bo or another attachment's */
@@ -170,7 +171,8 @@ bool amdgpu_amdkfd_have_atomics_support(struct amdgpu_device *adev);
 
 bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid);
 
-int amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev);
+int amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev,
+                           struct amdgpu_reset_context *reset_context);
 
 int amdgpu_amdkfd_post_reset(struct amdgpu_device *adev);
 
@@ -416,7 +418,8 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
 void kgd2kfd_device_exit(struct kfd_dev *kfd);
 void kgd2kfd_suspend(struct kfd_dev *kfd, bool run_pm);
 int kgd2kfd_resume(struct kfd_dev *kfd, bool run_pm);
-int kgd2kfd_pre_reset(struct kfd_dev *kfd);
+int kgd2kfd_pre_reset(struct kfd_dev *kfd,
+                     struct amdgpu_reset_context *reset_context);
 int kgd2kfd_post_reset(struct kfd_dev *kfd);
 void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry);
 void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd);
@@ -459,7 +462,8 @@ static inline int kgd2kfd_resume(struct kfd_dev *kfd, bool run_pm)
        return 0;
 }
 
-static inline int kgd2kfd_pre_reset(struct kfd_dev *kfd)
+static inline int kgd2kfd_pre_reset(struct kfd_dev *kfd,
+                                   struct amdgpu_reset_context *reset_context)
 {
        return 0;
 }
index 6711836054f98ee80af1bb8921dab5f459debc27..4096cb3e937e4497fabaa1c86b7d0cc976d25d28 100644 (file)
@@ -5775,7 +5775,7 @@ int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
 
                cancel_delayed_work_sync(&tmp_adev->delayed_init_work);
 
-               amdgpu_amdkfd_pre_reset(tmp_adev);
+               amdgpu_amdkfd_pre_reset(tmp_adev, reset_context);
 
                /*
                 * Mark these ASICs to be reseted as untracked first
index fba9b9a258a500d540d1635ee769c22f4443305b..52be4e340fb1748b00c4390752576efab4f74b13 100644 (file)
@@ -924,7 +924,8 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
        kfree(kfd);
 }
 
-int kgd2kfd_pre_reset(struct kfd_dev *kfd)
+int kgd2kfd_pre_reset(struct kfd_dev *kfd,
+                     struct amdgpu_reset_context *reset_context)
 {
        struct kfd_node *node;
        int i;
@@ -934,7 +935,7 @@ int kgd2kfd_pre_reset(struct kfd_dev *kfd)
 
        for (i = 0; i < kfd->num_nodes; i++) {
                node = kfd->nodes[i];
-               kfd_smi_event_update_gpu_reset(node, false);
+               kfd_smi_event_update_gpu_reset(node, false, reset_context);
                node->dqm->ops.pre_reset(node->dqm);
        }
 
@@ -974,7 +975,7 @@ int kgd2kfd_post_reset(struct kfd_dev *kfd)
        for (i = 0; i < kfd->num_nodes; i++) {
                node = kfd->nodes[i];
                atomic_set(&node->sram_ecc_flag, 0);
-               kfd_smi_event_update_gpu_reset(node, true);
+               kfd_smi_event_update_gpu_reset(node, true, NULL);
        }
 
        return 0;
index 06ac835190f973f8e4786e2b6f1bdb395e2dfe26..ea6a8e43bd5b2811294ee88a0ee051499035922d 100644 (file)
@@ -29,6 +29,7 @@
 #include "amdgpu_vm.h"
 #include "kfd_priv.h"
 #include "kfd_smi_events.h"
+#include "amdgpu_reset.h"
 
 struct kfd_smi_client {
        struct list_head list;
@@ -215,9 +216,11 @@ static void kfd_smi_event_add(pid_t pid, struct kfd_node *dev,
        add_event_to_kfifo(pid, dev, event, fifo_in, len);
 }
 
-void kfd_smi_event_update_gpu_reset(struct kfd_node *dev, bool post_reset)
+void kfd_smi_event_update_gpu_reset(struct kfd_node *dev, bool post_reset,
+                                   struct amdgpu_reset_context *reset_context)
 {
        unsigned int event;
+       char reset_cause[64];
 
        if (post_reset) {
                event = KFD_SMI_EVENT_GPU_POST_RESET;
@@ -225,7 +228,16 @@ void kfd_smi_event_update_gpu_reset(struct kfd_node *dev, bool post_reset)
                event = KFD_SMI_EVENT_GPU_PRE_RESET;
                ++(dev->reset_seq_num);
        }
-       kfd_smi_event_add(0, dev, event, "%x\n", dev->reset_seq_num);
+
+       memset(reset_cause, 0, sizeof(reset_cause));
+
+       if (reset_context)
+               amdgpu_reset_get_desc(reset_context, reset_cause,
+                                     sizeof(reset_cause));
+
+       kfd_smi_event_add(0, dev, event, "%x %s\n",
+                         dev->reset_seq_num,
+                         reset_cause);
 }
 
 void kfd_smi_event_update_thermal_throttling(struct kfd_node *dev,
index fa95c2dfd587ffaf3b8cd536dca2e4f7615fb8d9..85010b8307f885cb17e4a2f0fb735bb368fd83af 100644 (file)
 #ifndef KFD_SMI_EVENTS_H_INCLUDED
 #define KFD_SMI_EVENTS_H_INCLUDED
 
+struct amdgpu_reset_context;
+
 int kfd_smi_event_open(struct kfd_node *dev, uint32_t *fd);
 void kfd_smi_event_update_vmfault(struct kfd_node *dev, uint16_t pasid);
 void kfd_smi_event_update_thermal_throttling(struct kfd_node *dev,
                                             uint64_t throttle_bitmask);
-void kfd_smi_event_update_gpu_reset(struct kfd_node *dev, bool post_reset);
+void kfd_smi_event_update_gpu_reset(struct kfd_node *dev, bool post_reset,
+                                   struct amdgpu_reset_context *reset_context);
 void kfd_smi_event_page_fault_start(struct kfd_node *node, pid_t pid,
                                    unsigned long address, bool write_fault,
                                    ktime_t ts);