|
@@ -1382,6 +1382,8 @@ static void amdgpu_vm_prt_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
|
|
*
|
|
*
|
|
* @adev: amdgpu_device pointer
|
|
* @adev: amdgpu_device pointer
|
|
* @vm: requested vm
|
|
* @vm: requested vm
|
|
|
|
+ * @fence: optional resulting fence (unchanged if no work needed to be done
|
|
|
|
+ * or if an error occurred)
|
|
*
|
|
*
|
|
* Make sure all freed BOs are cleared in the PT.
|
|
* Make sure all freed BOs are cleared in the PT.
|
|
* Returns 0 for success.
|
|
* Returns 0 for success.
|
|
@@ -1389,10 +1391,11 @@ static void amdgpu_vm_prt_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm)
|
|
* PTs have to be reserved and mutex must be locked!
|
|
* PTs have to be reserved and mutex must be locked!
|
|
*/
|
|
*/
|
|
int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
|
|
int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
|
|
- struct amdgpu_vm *vm)
|
|
|
|
|
|
+ struct amdgpu_vm *vm,
|
|
|
|
+ struct dma_fence **fence)
|
|
{
|
|
{
|
|
struct amdgpu_bo_va_mapping *mapping;
|
|
struct amdgpu_bo_va_mapping *mapping;
|
|
- struct dma_fence *fence = NULL;
|
|
|
|
|
|
+ struct dma_fence *f = NULL;
|
|
int r;
|
|
int r;
|
|
|
|
|
|
while (!list_empty(&vm->freed)) {
|
|
while (!list_empty(&vm->freed)) {
|
|
@@ -1401,15 +1404,21 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
|
|
list_del(&mapping->list);
|
|
list_del(&mapping->list);
|
|
|
|
|
|
r = amdgpu_vm_bo_split_mapping(adev, NULL, 0, NULL, vm, mapping,
|
|
r = amdgpu_vm_bo_split_mapping(adev, NULL, 0, NULL, vm, mapping,
|
|
- 0, 0, &fence);
|
|
|
|
- amdgpu_vm_free_mapping(adev, vm, mapping, fence);
|
|
|
|
|
|
+ 0, 0, &f);
|
|
|
|
+ amdgpu_vm_free_mapping(adev, vm, mapping, f);
|
|
if (r) {
|
|
if (r) {
|
|
- dma_fence_put(fence);
|
|
|
|
|
|
+ dma_fence_put(f);
|
|
return r;
|
|
return r;
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ if (fence && f) {
|
|
|
|
+ dma_fence_put(*fence);
|
|
|
|
+ *fence = f;
|
|
|
|
+ } else {
|
|
|
|
+ dma_fence_put(f);
|
|
}
|
|
}
|
|
- dma_fence_put(fence);
|
|
|
|
|
|
+
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
}
|
|
}
|