Commit 12938fad authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/amdgpu: cleanup GPU recovery check a bit (v2)



Check if we should call the function instead of providing the forced
flag.

v2: rebase on KFD changes (Alex)

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Acked-by: default avatarAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Reviewed-by: default avatarHuang Rui <ray.huang@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 1849e737
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -1158,8 +1158,9 @@ int emu_soc_asic_init(struct amdgpu_device *adev);
#define amdgpu_asic_need_full_reset(adev) (adev)->asic_funcs->need_full_reset((adev))
#define amdgpu_asic_need_full_reset(adev) (adev)->asic_funcs->need_full_reset((adev))


/* Common functions */
/* Common functions */
bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev);
int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
			      struct amdgpu_job* job, bool force);
			      struct amdgpu_job* job);
void amdgpu_device_pci_config_reset(struct amdgpu_device *adev);
void amdgpu_device_pci_config_reset(struct amdgpu_device *adev);
bool amdgpu_device_need_post(struct amdgpu_device *adev);
bool amdgpu_device_need_post(struct amdgpu_device *adev);


+2 −1
Original line number Original line Diff line number Diff line
@@ -267,7 +267,8 @@ void amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd)
{
{
	struct amdgpu_device *adev = (struct amdgpu_device *)kgd;
	struct amdgpu_device *adev = (struct amdgpu_device *)kgd;


	amdgpu_device_gpu_recover(adev, NULL, false);
	if (amdgpu_device_should_recover_gpu(adev))
		amdgpu_device_gpu_recover(adev, NULL);
}
}


int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
int alloc_gtt_mem(struct kgd_dev *kgd, size_t size,
+25 −13
Original line number Original line Diff line number Diff line
@@ -3243,32 +3243,44 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,
	return r;
	return r;
}
}


/**
 * amdgpu_device_should_recover_gpu - check if we should try GPU recovery
 *
 * @adev: amdgpu device pointer
 *
 * Check amdgpu_gpu_recovery and SRIOV status to see if we should try to recover
 * a hung GPU.
 */
bool amdgpu_device_should_recover_gpu(struct amdgpu_device *adev)
{
	if (!amdgpu_device_ip_check_soft_reset(adev)) {
		DRM_INFO("Timeout, but no hardware hang detected.\n");
		return false;
	}

	if (amdgpu_gpu_recovery == 0 || (amdgpu_gpu_recovery == -1  &&
					 !amdgpu_sriov_vf(adev))) {
		DRM_INFO("GPU recovery disabled.\n");
		return false;
	}

	return true;
}

/**
/**
 * amdgpu_device_gpu_recover - reset the asic and recover scheduler
 * amdgpu_device_gpu_recover - reset the asic and recover scheduler
 *
 *
 * @adev: amdgpu device pointer
 * @adev: amdgpu device pointer
 * @job: which job trigger hang
 * @job: which job trigger hang
 * @force: forces reset regardless of amdgpu_gpu_recovery
 *
 *
 * Attempt to reset the GPU if it has hung (all asics).
 * Attempt to reset the GPU if it has hung (all asics).
 * Returns 0 for success or an error on failure.
 * Returns 0 for success or an error on failure.
 */
 */
int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
int amdgpu_device_gpu_recover(struct amdgpu_device *adev,
			      struct amdgpu_job *job, bool force)
			      struct amdgpu_job *job)
{
{
	int i, r, resched;
	int i, r, resched;


	if (!force && !amdgpu_device_ip_check_soft_reset(adev)) {
		DRM_INFO("No hardware hang detected. Did some blocks stall?\n");
		return 0;
	}

	if (!force && (amdgpu_gpu_recovery == 0 ||
			(amdgpu_gpu_recovery == -1  && !amdgpu_sriov_vf(adev)))) {
		DRM_INFO("GPU recovery disabled.\n");
		return 0;
	}

	dev_info(adev->dev, "GPU reset begin!\n");
	dev_info(adev->dev, "GPU reset begin!\n");


	mutex_lock(&adev->lock_reset);
	mutex_lock(&adev->lock_reset);
+1 −1
Original line number Original line Diff line number Diff line
@@ -701,7 +701,7 @@ static int amdgpu_debugfs_gpu_recover(struct seq_file *m, void *data)
	struct amdgpu_device *adev = dev->dev_private;
	struct amdgpu_device *adev = dev->dev_private;


	seq_printf(m, "gpu recover\n");
	seq_printf(m, "gpu recover\n");
	amdgpu_device_gpu_recover(adev, NULL, true);
	amdgpu_device_gpu_recover(adev, NULL);


	return 0;
	return 0;
}
}
+2 −2
Original line number Original line Diff line number Diff line
@@ -105,8 +105,8 @@ static void amdgpu_irq_reset_work_func(struct work_struct *work)
	struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
	struct amdgpu_device *adev = container_of(work, struct amdgpu_device,
						  reset_work);
						  reset_work);


	if (!amdgpu_sriov_vf(adev))
	if (!amdgpu_sriov_vf(adev) && amdgpu_device_should_recover_gpu(adev))
		amdgpu_device_gpu_recover(adev, NULL, false);
		amdgpu_device_gpu_recover(adev, NULL);
}
}


/**
/**
Loading