Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c036389 authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/radeon: drop doing resets in a work item



Blocking completely innocent processes with a GPU reset is
a pretty bad idea. Just set needs_reset and let the next
command submission or fence wait do the job.

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarMaarten Lankhorst <maarten.lankhorst@canonical.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent d6d5c5b8
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -8246,8 +8246,10 @@ int cik_irq_process(struct radeon_device *rdev)
	}
	if (queue_hotplug)
		schedule_work(&rdev->hotplug_work);
	if (queue_reset)
		schedule_work(&rdev->reset_work);
	if (queue_reset) {
		rdev->needs_reset = true;
		wake_up_all(&rdev->fence_queue);
	}
	if (queue_thermal)
		schedule_work(&rdev->pm.dpm.thermal.work);
	rdev->ih.rptr = rptr;
+0 −1
Original line number Diff line number Diff line
@@ -2346,7 +2346,6 @@ struct radeon_device {
	struct radeon_mec mec;
	struct work_struct hotplug_work;
	struct work_struct audio_work;
	struct work_struct reset_work;
	int num_crtc; /* number of crtcs */
	struct mutex dc_hw_i2c_mutex; /* display controller hw i2c mutex */
	bool has_uvd;
+4 −3
Original line number Diff line number Diff line
@@ -1673,9 +1673,6 @@ int radeon_gpu_reset(struct radeon_device *rdev)
		return 0;
	}

	rdev->in_reset = true;
	rdev->needs_reset = false;

	radeon_save_bios_scratch_regs(rdev);
	/* block TTM */
	resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
@@ -1738,6 +1735,10 @@ int radeon_gpu_reset(struct radeon_device *rdev)
	radeon_hpd_init(rdev);

	ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);

	rdev->in_reset = true;
	rdev->needs_reset = false;

	downgrade_write(&rdev->exclusive_lock);

	drm_helper_resume_force_mode(rdev->ddev);
+0 −18
Original line number Diff line number Diff line
@@ -87,23 +87,6 @@ static void radeon_hotplug_work_func(struct work_struct *work)
	drm_helper_hpd_irq_event(dev);
}

/**
 * radeon_irq_reset_work_func - execute gpu reset
 *
 * @work: work struct
 *
 * Execute scheduled gpu reset (cayman+).
 * This function is called when the irq handler
 * thinks we need a gpu reset.
 */
static void radeon_irq_reset_work_func(struct work_struct *work)
{
	struct radeon_device *rdev = container_of(work, struct radeon_device,
						  reset_work);

	radeon_gpu_reset(rdev);
}

/**
 * radeon_driver_irq_preinstall_kms - drm irq preinstall callback
 *
@@ -284,7 +267,6 @@ int radeon_irq_kms_init(struct radeon_device *rdev)

	INIT_WORK(&rdev->hotplug_work, radeon_hotplug_work_func);
	INIT_WORK(&rdev->audio_work, r600_audio_update_hdmi);
	INIT_WORK(&rdev->reset_work, radeon_irq_reset_work_func);

	rdev->irq.installed = true;
	r = drm_irq_install(rdev->ddev, rdev->ddev->pdev->irq);