mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	drm/amdgpu: stop scheduler when calling hw_fini (v2)
This gurantees no more work on the ring can be submitted to hardware in suspend/resume case, otherwise a potential race will occur and the ring will get no chance to stay empty before suspend. v2: Call drm_sched_resubmit_job before drm_sched_start to restart jobs from the pending list. Suggested-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com> Suggested-by: Christian König <christian.koenig@amd.com> Signed-off-by: Guchun Chen <guchun.chen@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: stable@vger.kernel.org
This commit is contained in:
		
							parent
							
								
									156872b07e
								
							
						
					
					
						commit
						f7d6779df6
					
				
					 1 changed files with 8 additions and 0 deletions
				
			
		| 
						 | 
					@ -552,6 +552,9 @@ void amdgpu_fence_driver_hw_fini(struct amdgpu_device *adev)
 | 
				
			||||||
		if (!ring || !ring->fence_drv.initialized)
 | 
							if (!ring || !ring->fence_drv.initialized)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!ring->no_scheduler)
 | 
				
			||||||
 | 
								drm_sched_stop(&ring->sched, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* You can't wait for HW to signal if it's gone */
 | 
							/* You can't wait for HW to signal if it's gone */
 | 
				
			||||||
		if (!drm_dev_is_unplugged(&adev->ddev))
 | 
							if (!drm_dev_is_unplugged(&adev->ddev))
 | 
				
			||||||
			r = amdgpu_fence_wait_empty(ring);
 | 
								r = amdgpu_fence_wait_empty(ring);
 | 
				
			||||||
| 
						 | 
					@ -611,6 +614,11 @@ void amdgpu_fence_driver_hw_init(struct amdgpu_device *adev)
 | 
				
			||||||
		if (!ring || !ring->fence_drv.initialized)
 | 
							if (!ring || !ring->fence_drv.initialized)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!ring->no_scheduler) {
 | 
				
			||||||
 | 
								drm_sched_resubmit_jobs(&ring->sched);
 | 
				
			||||||
 | 
								drm_sched_start(&ring->sched, true);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* enable the interrupt */
 | 
							/* enable the interrupt */
 | 
				
			||||||
		if (ring->fence_drv.irq_src)
 | 
							if (ring->fence_drv.irq_src)
 | 
				
			||||||
			amdgpu_irq_get(adev, ring->fence_drv.irq_src,
 | 
								amdgpu_irq_get(adev, ring->fence_drv.irq_src,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue