Revert "intel: We don't need to take the bufmgr lock whilst mapping."
authorChris Wilson <chris@chris-wilson.co.uk>
Thu, 13 May 2010 07:24:28 +0000 (08:24 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 13 May 2010 07:25:56 +0000 (08:25 +0100)
This reverts commit 7ca558494dd3f68f29bb6ca981de9b8f49620b60.

This was pushed ahead of an essential review of bo level locking in
mesa, without which we cannot know whether removing this lock is safe.

intel/intel_bufmgr_gem.c

index 9daa89a..54c82d6 100644 (file)
@@ -927,6 +927,8 @@ static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
        struct drm_i915_gem_set_domain set_domain;
        int ret;
 
+       pthread_mutex_lock(&bufmgr_gem->lock);
+
        /* Allow recursive mapping. Mesa may recursively map buffers with
         * nested display loops.
         */
@@ -950,6 +952,7 @@ static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
                                "%s:%d: Error mapping buffer %d (%s): %s .\n",
                                __FILE__, __LINE__, bo_gem->gem_handle,
                                bo_gem->name, strerror(errno));
+                       pthread_mutex_unlock(&bufmgr_gem->lock);
                        return ret;
                }
                bo_gem->mem_virtual = (void *)(uintptr_t) mmap_arg.addr_ptr;
@@ -974,9 +977,12 @@ static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable)
                fprintf(stderr, "%s:%d: Error setting to CPU domain %d: %s\n",
                        __FILE__, __LINE__, bo_gem->gem_handle,
                        strerror(errno));
+               pthread_mutex_unlock(&bufmgr_gem->lock);
                return ret;
        }
 
+       pthread_mutex_unlock(&bufmgr_gem->lock);
+
        return 0;
 }
 
@@ -987,6 +993,8 @@ int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
        struct drm_i915_gem_set_domain set_domain;
        int ret;
 
+       pthread_mutex_lock(&bufmgr_gem->lock);
+
        /* Get a mapping of the buffer if we haven't before. */
        if (bo_gem->gtt_virtual == NULL) {
                struct drm_i915_gem_mmap_gtt mmap_arg;
@@ -1010,6 +1018,7 @@ int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
                                __FILE__, __LINE__,
                                bo_gem->gem_handle, bo_gem->name,
                                strerror(errno));
+                       pthread_mutex_unlock(&bufmgr_gem->lock);
                        return ret;
                }
 
@@ -1025,6 +1034,7 @@ int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
                                __FILE__, __LINE__,
                                bo_gem->gem_handle, bo_gem->name,
                                strerror(errno));
+                       pthread_mutex_unlock(&bufmgr_gem->lock);
                        return ret;
                }
        }
@@ -1051,6 +1061,8 @@ int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
                        strerror(errno));
        }
 
+       pthread_mutex_unlock(&bufmgr_gem->lock);
+
        return ret;
 }
 
@@ -1065,7 +1077,9 @@ int drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo)
 
        assert(bo_gem->gtt_virtual != NULL);
 
+       pthread_mutex_lock(&bufmgr_gem->lock);
        bo->virtual = NULL;
+       pthread_mutex_unlock(&bufmgr_gem->lock);
 
        return ret;
 }
@@ -1082,6 +1096,8 @@ static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
 
        assert(bo_gem->mem_virtual != NULL);
 
+       pthread_mutex_lock(&bufmgr_gem->lock);
+
        /* Cause a flush to happen if the buffer's pinned for scanout, so the
         * results show up in a timely manner.
         */
@@ -1094,6 +1110,7 @@ static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
        ret = ret == -1 ? -errno : 0;
 
        bo->virtual = NULL;
+       pthread_mutex_unlock(&bufmgr_gem->lock);
 
        return ret;
 }