diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 8 | 
1 files changed, 7 insertions, 1 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c index 08478fce00f2..2430d6223c2d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c @@ -350,6 +350,7 @@ static inline uint64_t amdgpu_gmc_fault_key(uint64_t addr, uint16_t pasid)   * amdgpu_gmc_filter_faults - filter VM faults   *   * @adev: amdgpu device structure + * @ih: interrupt ring that the fault received from   * @addr: address of the VM fault   * @pasid: PASID of the process causing the fault   * @timestamp: timestamp of the fault @@ -358,7 +359,8 @@ static inline uint64_t amdgpu_gmc_fault_key(uint64_t addr, uint16_t pasid)   * True if the fault was filtered and should not be processed further.   * False if the fault is a new one and needs to be handled.   */ -bool amdgpu_gmc_filter_faults(struct amdgpu_device *adev, uint64_t addr, +bool amdgpu_gmc_filter_faults(struct amdgpu_device *adev, +			      struct amdgpu_ih_ring *ih, uint64_t addr,  			      uint16_t pasid, uint64_t timestamp)  {  	struct amdgpu_gmc *gmc = &adev->gmc; @@ -366,6 +368,10 @@ bool amdgpu_gmc_filter_faults(struct amdgpu_device *adev, uint64_t addr,  	struct amdgpu_gmc_fault *fault;  	uint32_t hash; +	/* Stale retry fault if timestamp goes backward */ +	if (amdgpu_ih_ts_after(timestamp, ih->processed_timestamp)) +		return true; +  	/* If we don't have space left in the ring buffer return immediately */  	stamp = max(timestamp, AMDGPU_GMC_FAULT_TIMEOUT + 1) -  		AMDGPU_GMC_FAULT_TIMEOUT; |