winsys/amdgpu: avoid potential segfault in amdgpu_bo_map()
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Thu, 2 Feb 2017 17:40:18 +0000 (18:40 +0100)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 3 Feb 2017 11:07:14 +0000 (12:07 +0100)
cs can be NULL when it comes from r600_buffer_map_sync_with_rings()
to avoid doing the same checks. It was checked for write mappings
but not for read mappings.

Cc: "17.0" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/winsys/amdgpu/drm/amdgpu_bo.c

index 5ee27b8ede0689b85a957d3de763540231f1940e..5b9bd8c6ddff0e4e1b7b9a869ce14a412cc18076 100644 (file)
@@ -254,14 +254,17 @@ static void *amdgpu_bo_map(struct pb_buffer *buf,
              * (neither one is changing it).
              *
              * Only check whether the buffer is being used for write. */
-            if (cs && amdgpu_bo_is_referenced_by_cs_with_usage(cs, bo,
-                                                               RADEON_USAGE_WRITE)) {
-               cs->flush_cs(cs->flush_data, 0, NULL);
-            } else {
-               /* Try to avoid busy-waiting in amdgpu_bo_wait. */
-               if (p_atomic_read(&bo->num_active_ioctls))
-                  amdgpu_cs_sync_flush(rcs);
+            if (cs) {
+               if (amdgpu_bo_is_referenced_by_cs_with_usage(cs, bo,
+                                                            RADEON_USAGE_WRITE)) {
+                  cs->flush_cs(cs->flush_data, 0, NULL);
+               } else {
+                  /* Try to avoid busy-waiting in amdgpu_bo_wait. */
+                  if (p_atomic_read(&bo->num_active_ioctls))
+                     amdgpu_cs_sync_flush(rcs);
+               }
             }
+
             amdgpu_bo_wait((struct pb_buffer*)bo, PIPE_TIMEOUT_INFINITE,
                            RADEON_USAGE_WRITE);
          } else {