[Intel-gfx] [PATCH 1/3] intel: Expect caller to guarantee thread-safety of individual bo
Eric Anholt
eric at anholt.net
Thu Dec 3 22:08:55 CET 2009
On Wed, 2 Dec 2009 11:43:14 +0000, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> intel/intel_bufmgr_gem.c | 27 +--------------------------
> 1 files changed, 1 insertions(+), 26 deletions(-)
>
> diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c
> index 3b4d3cf..e0585ca 100644
> --- a/intel/intel_bufmgr_gem.c
> +++ b/intel/intel_bufmgr_gem.c
> @@ -841,8 +841,6 @@ 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.
> */
> @@ -865,7 +863,6 @@ 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;
> @@ -889,12 +886,9 @@ 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;
> }
>
> @@ -905,8 +899,6 @@ 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;
> @@ -929,7 +921,6 @@ 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;
> }
>
> @@ -943,7 +934,6 @@ 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 errno;
> }
> }
> @@ -969,27 +959,19 @@ int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo)
> strerror(errno));
> }
>
> - pthread_mutex_unlock(&bufmgr_gem->lock);
> -
> return ret;
> }
>
> int drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo)
> {
> - drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr;
> drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
> - int ret = 0;
> -
> if (bo == NULL)
> return 0;
>
> assert(bo_gem->gtt_virtual != NULL);
> -
> - pthread_mutex_lock(&bufmgr_gem->lock);
> bo->virtual = NULL;
> - pthread_mutex_unlock(&bufmgr_gem->lock);
>
> - return ret;
> + return 0;
> }
>
> static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
> @@ -1004,8 +986,6 @@ 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.
> */
> @@ -1017,7 +997,6 @@ static int drm_intel_gem_bo_unmap(drm_intel_bo *bo)
> } while (ret == -1 && errno == EINTR);
>
> bo->virtual = NULL;
> - pthread_mutex_unlock(&bufmgr_gem->lock);
> return 0;
> }
This is an actual change in the intended behavior of the library.
Mesa's multithreaded handling expected mapping to be reentrant with no
additional protection. So I'm uncomfortable with these hunks.
>
> @@ -1186,8 +1165,6 @@ drm_intel_gem_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
> drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo;
> drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) target_bo;
>
> - pthread_mutex_lock(&bufmgr_gem->lock);
> -
> /* Create a new relocation list if needed */
> if (bo_gem->relocs == NULL)
> drm_intel_setup_reloc_list(bo);
> @@ -1222,8 +1199,6 @@ drm_intel_gem_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset,
>
> bo_gem->reloc_count++;
>
> - pthread_mutex_unlock(&bufmgr_gem->lock);
> -
> return 0;
> }
I liked this hunk, being safe as far as Mesa's concerned, and the
highest thing in the profile for mutex locking.
More information about the Intel-gfx
mailing list