]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/amdgpu: fix amdgpu_vm_handle_moved as well v2
authorChristian König <christian.koenig@amd.com>
Mon, 11 Sep 2017 14:54:59 +0000 (16:54 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 13 Sep 2017 16:10:06 +0000 (12:10 -0400)
There is no guarantee that the last BO_VA actually needed an update.

Additional to that all command submissions must wait for moved BOs to
be cleared, not just the first one.

v2: Don't overwrite any newer fence.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h

index ff61073b7181f4261e1625a8b1648ab25442a778..9f1202a4182f67acc3d739d2c50e37daec2df57b 100644 (file)
@@ -814,7 +814,7 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
 
        }
 
-       r = amdgpu_vm_handle_moved(adev, vm, &p->job->sync);
+       r = amdgpu_vm_handle_moved(adev, vm);
        if (r)
                return r;
 
index 64baa31389657ca7275938cc0fbd1ff3603c9e9e..2df254cc802e2e63d9eae472c718dcfffaf72d1b 100644 (file)
@@ -1743,7 +1743,7 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
        dma_addr_t *pages_addr = NULL;
        struct ttm_mem_reg *mem;
        struct drm_mm_node *nodes;
-       struct dma_fence *exclusive;
+       struct dma_fence *exclusive, **last_update;
        uint64_t flags;
        int r;
 
@@ -1769,6 +1769,11 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
        else
                flags = 0x0;
 
+       if (clear || (bo && bo->tbo.resv == vm->root.base.bo->tbo.resv))
+               last_update = &vm->last_update;
+       else
+               last_update = &bo_va->last_pt_update;
+
        if (!clear && bo_va->base.moved) {
                bo_va->base.moved = false;
                list_splice_init(&bo_va->valids, &bo_va->invalids);
@@ -1780,7 +1785,7 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
        list_for_each_entry(mapping, &bo_va->invalids, list) {
                r = amdgpu_vm_bo_split_mapping(adev, exclusive, pages_addr, vm,
                                               mapping, flags, nodes,
-                                              &bo_va->last_pt_update);
+                                              last_update);
                if (r)
                        return r;
        }
@@ -1803,12 +1808,6 @@ int amdgpu_vm_bo_update(struct amdgpu_device *adev,
                        trace_amdgpu_vm_bo_mapping(mapping);
        }
 
-       if (bo_va->base.bo &&
-           bo_va->base.bo->tbo.resv == vm->root.base.bo->tbo.resv) {
-               dma_fence_put(vm->last_update);
-               vm->last_update = dma_fence_get(bo_va->last_pt_update);
-       }
-
        return 0;
 }
 
@@ -2006,15 +2005,15 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
  * PTs have to be reserved!
  */
 int amdgpu_vm_handle_moved(struct amdgpu_device *adev,
-                          struct amdgpu_vm *vm,
-                          struct amdgpu_sync *sync)
+                          struct amdgpu_vm *vm)
 {
-       struct amdgpu_bo_va *bo_va = NULL;
        bool clear;
        int r = 0;
 
        spin_lock(&vm->status_lock);
        while (!list_empty(&vm->moved)) {
+               struct amdgpu_bo_va *bo_va;
+
                bo_va = list_first_entry(&vm->moved,
                        struct amdgpu_bo_va, base.vm_status);
                spin_unlock(&vm->status_lock);
@@ -2030,9 +2029,6 @@ int amdgpu_vm_handle_moved(struct amdgpu_device *adev,
        }
        spin_unlock(&vm->status_lock);
 
-       if (bo_va)
-               r = amdgpu_sync_fence(adev, sync, bo_va->last_pt_update);
-
        return r;
 }
 
index cb6a6222fc3f14fded849414d07bf90abcdef8ca..48c58ae4bb3a14270179c8181258ed7f6aa0f960 100644 (file)
@@ -250,8 +250,7 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
                          struct amdgpu_vm *vm,
                          struct dma_fence **fence);
 int amdgpu_vm_handle_moved(struct amdgpu_device *adev,
-                          struct amdgpu_vm *vm,
-                          struct amdgpu_sync *sync);
+                          struct amdgpu_vm *vm);
 int amdgpu_vm_bo_update(struct amdgpu_device *adev,
                        struct amdgpu_bo_va *bo_va,
                        bool clear);