[Mesa-dev] [PATCH v2 02/24] anv: do not try to ref/unref NULL shaders
Pohjolainen, Topi
topi.pohjolainen at gmail.com
Tue Mar 14 08:22:17 UTC 2017
On Fri, Mar 10, 2017 at 01:38:15PM +0100, Iago Toral Quiroga wrote:
> This situation can happen if we failed to allocate memory for the shader.
>
> v2:
> - We shouldn't see NULL shaders in anv_shader_bin_ref so we should not check
> for that (Jason). Make sure that callers don't attempt to call this
> function with a NULL shader and assert that this never happens (Iago).
> ---
> src/intel/vulkan/anv_pipeline_cache.c | 5 ++++-
> src/intel/vulkan/anv_private.h | 5 ++++-
> 2 files changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_pipeline_cache.c b/src/intel/vulkan/anv_pipeline_cache.c
> index a8ea80f..d6c8413 100644
> --- a/src/intel/vulkan/anv_pipeline_cache.c
> +++ b/src/intel/vulkan/anv_pipeline_cache.c
> @@ -308,7 +308,8 @@ anv_pipeline_cache_upload_kernel(struct anv_pipeline_cache *cache,
> pthread_mutex_unlock(&cache->mutex);
>
> /* We increment refcount before handing it to the caller */
> - anv_shader_bin_ref(bin);
> + if (bin)
> + anv_shader_bin_ref(bin);
>
> return bin;
> } else {
> @@ -546,6 +547,8 @@ VkResult anv_MergePipelineCaches(
> struct hash_entry *entry;
> hash_table_foreach(src->cache, entry) {
> struct anv_shader_bin *bin = entry->data;
> + assert(bin);
> +
> if (_mesa_hash_table_search(dst->cache, bin->key))
> continue;
>
> diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
> index 27c1923..aa2b6d7 100644
> --- a/src/intel/vulkan/anv_private.h
> +++ b/src/intel/vulkan/anv_private.h
> @@ -1543,13 +1543,16 @@ anv_shader_bin_destroy(struct anv_device *device, struct anv_shader_bin *shader)
> static inline void
> anv_shader_bin_ref(struct anv_shader_bin *shader)
> {
> - assert(shader->ref_cnt >= 1);
> + assert(shader && shader->ref_cnt >= 1);
> __sync_fetch_and_add(&shader->ref_cnt, 1);
> }
>
> static inline void
> anv_shader_bin_unref(struct anv_device *device, struct anv_shader_bin *shader)
> {
> + if (!shader)
> + return;
> +
There are two callers in anv_pipeline.c: anv_DestroyPipeline and
anv_pipeline_init. Both check against NULL before calling.
In anv_pipeline_cache.c::anv_pipeline_cache_finish() this is only called if
item is found in cache.
Finally lookup_blorp_shader() and upload_blorp_shader() call this if and only
if earlier reference is found in cache. Assert instead?
> assert(shader->ref_cnt >= 1);
> if (__sync_fetch_and_add(&shader->ref_cnt, -1) == 1)
> anv_shader_bin_destroy(device, shader);
> --
> 2.7.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list