drm/amdgpu: always wait before kmap a BO
authorChristian König <christian.koenig@amd.com>
Thu, 10 Mar 2016 15:21:04 +0000 (16:21 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 14 Mar 2016 17:43:09 +0000 (13:43 -0400)
When a BO is currently moving we otherwise would blindly
access the new location without checking.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c

index 9a025a77958d0579ce25dce653af067838b29ac6..151a2d42c639c95f9c15eaec58873fdc340cdbb2 100644 (file)
@@ -308,7 +308,7 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
 int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr)
 {
        bool is_iomem;
-       int r;
+       long r;
 
        if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS)
                return -EPERM;
@@ -319,14 +319,20 @@ int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr)
                }
                return 0;
        }
+
+       r = reservation_object_wait_timeout_rcu(bo->tbo.resv, false, false,
+                                               MAX_SCHEDULE_TIMEOUT);
+       if (r < 0)
+               return r;
+
        r = ttm_bo_kmap(&bo->tbo, 0, bo->tbo.num_pages, &bo->kmap);
-       if (r) {
+       if (r)
                return r;
-       }
+
        bo->kptr = ttm_kmap_obj_virtual(&bo->kmap, &is_iomem);
-       if (ptr) {
+       if (ptr)
                *ptr = bo->kptr;
-       }
+
        return 0;
 }