]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amdgpu: Move KFD sched stop/start into PTL control path
authorPerry Yuan <perry.yuan@amd.com>
Thu, 26 Feb 2026 09:50:33 +0000 (17:50 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 11 May 2026 19:55:56 +0000 (15:55 -0400)
Move amdgpu_amdkfd_stop/start_sched calls from kfd_ptl_control()
into amdgpu_ptl_perf_monitor_ctrl() so all PTL callers (KFD ioctl,
sysfs, GFX init) get consistent scheduling management.

Add amdgpu_amdkfd_stop/start_sched_all() wrappers to stop and
restart KFD scheduling on all nodes without assuming node ID ordering.

v3:
 * call start/stop for PTL Set Only
v2:
 * move the stop/start sched function to
   amdgpu_ptl_perf_monitor_ctrl(Lijo)
 * add wrapper amdgpu_amdkfd_stop_sched_all and
   amdgpu_amdkfd_start_sched_all (Lijo)

Signed-off-by: Perry Yuan <perry.yuan@amd.com>
Reviewed-by: Yifan Zhang <yifan1.zhang@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
drivers/gpu/drm/amd/amdkfd/kfd_device.c

index 4fee011c2e261e7ff4e762a227edb67ad62d6974..2bf6a31c194da25cd02124c12a8f207106674791 100644 (file)
@@ -436,8 +436,10 @@ int kgd2kfd_check_and_lock_kfd(struct kfd_dev *kfd);
 void kgd2kfd_unlock_kfd(struct kfd_dev *kfd);
 int kgd2kfd_start_sched(struct kfd_dev *kfd, uint32_t node_id);
 int kgd2kfd_start_sched_all_nodes(struct kfd_dev *kfd);
+int amdgpu_amdkfd_start_sched_all(struct amdgpu_device *adev);
 int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id);
 int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd);
+int amdgpu_amdkfd_stop_sched_all(struct amdgpu_device *adev);
 bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id);
 bool kgd2kfd_vmfault_fast_path(struct amdgpu_device *adev, struct amdgpu_iv_entry *entry,
                               bool retry_fault);
@@ -534,6 +536,11 @@ static inline int kgd2kfd_start_sched_all_nodes(struct kfd_dev *kfd)
        return 0;
 }
 
+static inline int amdgpu_amdkfd_start_sched_all(struct amdgpu_device *adev)
+{
+       return 0;
+}
+
 static inline int kgd2kfd_stop_sched(struct kfd_dev *kfd, uint32_t node_id)
 {
        return 0;
@@ -544,6 +551,11 @@ static inline int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd)
        return 0;
 }
 
+static inline int amdgpu_amdkfd_stop_sched_all(struct amdgpu_device *adev)
+{
+       return 0;
+}
+
 static inline bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
 {
        return false;
index 5f8f0026483b2fb8c2dfdd3fe711b88e6181a2c3..a1db694063b1aeec6560aaa87845269752875eac 100644 (file)
@@ -1358,17 +1358,23 @@ int amdgpu_ptl_perf_monitor_ctrl(struct amdgpu_device *adev, u32 req_code,
                }
        }
 
-       /* Wait for GFX engine idle before PTL state transition */
        if (req_code == PSP_PTL_PERF_MON_SET) {
+               amdgpu_amdkfd_stop_sched_all(adev);
+               /* Wait for GFX engine idle before PTL state transition */
                ret = amdgpu_device_ip_wait_for_idle(adev,
                                AMD_IP_BLOCK_TYPE_GFX);
                if (ret) {
+                       amdgpu_amdkfd_start_sched_all(adev);
                        dev_err(adev->dev, "GFX not idle before PTL operation (%d)\n", ret);
                        return ret;
                }
+               ret = psp_ptl_invoke(psp, req_code, ptl_state, &ptl_fmt1, &ptl_fmt2);
+               amdgpu_amdkfd_start_sched_all(adev);
+       } else {
+               ret = psp_ptl_invoke(psp, req_code, ptl_state, &ptl_fmt1, &ptl_fmt2);
        }
 
-       return psp_ptl_invoke(psp, req_code, ptl_state, &ptl_fmt1, &ptl_fmt2);
+       return ret;
 }
 
 static enum amdgpu_ptl_fmt str_to_ptl_fmt(const char *str)
index 5bea583732cbb98ccd1de48c3352efff38cf813e..04ae3cb3a65ca172d08e1471298b93c0ec048a5e 100644 (file)
@@ -1789,17 +1789,11 @@ static int kfd_ptl_control(struct kfd_process_device *pdd, bool enable)
        if (!pdd->dev->kfd2kgd || !pdd->dev->kfd2kgd->ptl_ctrl)
                return -EOPNOTSUPP;
 
-       if (adev->kfd.init_complete)
-               amdgpu_amdkfd_stop_sched(adev, pdd->dev->node_id);
-
        ret = pdd->dev->kfd2kgd->ptl_ctrl(adev, PSP_PTL_PERF_MON_SET,
                                          &ptl_state,
                                          &pref_format1,
                                          &pref_format2);
 
-       if (adev->kfd.init_complete)
-               amdgpu_amdkfd_start_sched(adev, pdd->dev->node_id);
-
        return ret;
 }
 
index d649d8603e28e07a0bb64e807aedca4cc12c64d0..c2c59781feee9e123c89c68feaa397bd372d25e6 100644 (file)
@@ -1651,6 +1651,22 @@ int kgd2kfd_stop_sched_all_nodes(struct kfd_dev *kfd)
        return 0;
 }
 
+int amdgpu_amdkfd_stop_sched_all(struct amdgpu_device *adev)
+{
+       if (!adev->kfd.init_complete)
+               return 0;
+
+       return kgd2kfd_stop_sched_all_nodes(adev->kfd.dev);
+}
+
+int amdgpu_amdkfd_start_sched_all(struct amdgpu_device *adev)
+{
+       if (!adev->kfd.init_complete)
+               return 0;
+
+       return kgd2kfd_start_sched_all_nodes(adev->kfd.dev);
+}
+
 bool kgd2kfd_compute_active(struct kfd_dev *kfd, uint32_t node_id)
 {
        struct kfd_node *node;