[Why] function "devm_memremap_pages" in function "kgd2kfd_init_zone_device", sometimes cost too much time.
[How] move the function "kgd2kfd_init_zone_device" after release full gpu access(amdgpu_virt_release_full_gpu). Signed-off-by: chong li <[email protected]> Change-Id: I3eebd7272b8f0c85d08fec80acee67a2c9e59e52 --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 10 ++++++++- drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 1 + drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 24 ++++++++++++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index 860ac1f9e35d..c293e9a24d48 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -84,6 +84,8 @@ #include <drm/drm_drv.h> +#include <kfd_priv.h> + #if IS_ENABLED(CONFIG_X86) #include <asm/intel-family.h> #include <asm/cpu_device_id.h> @@ -3314,7 +3316,6 @@ static int amdgpu_device_ip_init(struct amdgpu_device *adev) /* Don't init kfd if whole hive need to be reset during init */ if (adev->init_lvl->level != AMDGPU_INIT_LEVEL_MINIMAL_XGMI) { - kgd2kfd_init_zone_device(adev); amdgpu_amdkfd_device_init(adev); } @@ -4918,6 +4919,13 @@ int amdgpu_device_init(struct amdgpu_device *adev, if (adev->init_lvl->level == AMDGPU_INIT_LEVEL_MINIMAL_XGMI) amdgpu_xgmi_reset_on_init(adev); + + /* Don't init kfd if whole hive need to be reset during init */ + if (adev->init_lvl->level != AMDGPU_INIT_LEVEL_MINIMAL_XGMI) { + kgd2kfd_init_zone_device(adev); + kfd_update_svm_support_properties(adev); + } + /* * Place those sysfs registering after `late_init`. As some of those * operations performed in `late_init` might affect the sysfs diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h index 70ef051511bb..bd1c6d1742c8 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h @@ -1358,6 +1358,7 @@ struct process_queue_node { void kfd_process_dequeue_from_device(struct kfd_process_device *pdd); void kfd_process_dequeue_from_all_devices(struct kfd_process *p); +void kfd_update_svm_support_properties(struct amdgpu_device *adev); int pqm_init(struct process_queue_manager *pqm, struct kfd_process *p); void pqm_uninit(struct process_queue_manager *pqm); int pqm_create_queue(struct process_queue_manager *pqm, diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c index 5c98746eb72d..f25d867ec40a 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_topology.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_topology.c @@ -2401,4 +2401,28 @@ int kfd_debugfs_rls_by_device(struct seq_file *m, void *data) return r; } +void kfd_update_svm_support_properties(struct amdgpu_device *adev) +{ + struct kfd_topology_device *dev; + int ret; + down_write(&topology_lock); + + list_for_each_entry(dev, &topology_device_list, list) { + if (dev->gpu && dev->gpu->adev == adev) { + if (KFD_IS_SVM_API_SUPPORTED(adev)) { + dev->node_props.capability |= HSA_CAP_SVMAPI_SUPPORTED; + ret = kfd_topology_update_sysfs(); + if (!ret) + sys_props.generation_count++; + else + dev_err(adev->dev, "Failed to update SVM support properties. ret=%d\n", ret); } + else + dev->node_props.capability &= ~HSA_CAP_SVMAPI_SUPPORTED; + } + } + + up_write(&topology_lock); + return ; +} + #endif -- 2.48.1
