[Mesa-dev] [PATCH 7/7] radeonsi: reduce the scope of sel->mutex in si_shader_select_with_key

Grazvydas Ignotas notasas at gmail.com
Mon Oct 23 11:53:45 UTC 2017


On Sun, Oct 22, 2017 at 9:33 PM, Nicolai Hähnle <nhaehnle at gmail.com> wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> We only need the lock to guard changes in the variant linked list. The
> actual compilation can happen outside the lock, since we use the ready
> fence as a guard.
> ---
>  src/gallium/drivers/radeonsi/si_state_shaders.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
> index 8c589928b8c..d0bef09748f 100644
> --- a/src/gallium/drivers/radeonsi/si_state_shaders.c
> +++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
> @@ -1618,41 +1618,42 @@ current_not_ready:
>         if (thread_index < 0)
>                 util_queue_fence_wait(&sel->ready);
>
>         mtx_lock(&sel->mutex);
>
>         /* Find the shader variant. */
>         for (iter = sel->first_variant; iter; iter = iter->next_variant) {
>                 /* Don't check the "current" shader. We checked it above. */
>                 if (current != iter &&
>                     memcmp(&iter->key, key, sizeof(*key)) == 0) {
> +                       mtx_unlock(&sel->mutex);
> +
>                         if (unlikely(!util_queue_fence_is_signalled(&iter->ready))) {
>                                 /* If it's an optimized shader and its compilation has
>                                  * been started but isn't done, use the unoptimized
>                                  * shader so as not to cause a stall due to compilation.
>                                  */
>                                 if (iter->is_optimized) {
>                                         memset(&key->opt, 0, sizeof(key->opt));
>                                         mtx_unlock(&sel->mutex);

Double unlock

>                                         goto again;
>                                 }
>
>                                 util_queue_fence_wait(&iter->ready);
>                         }
>
>                         if (iter->compilation_failed) {
>                                 mtx_unlock(&sel->mutex);

here too.

>                                 return -1; /* skip the draw call */
>                         }
>
>                         state->current = iter;
> -                       mtx_unlock(&sel->mutex);
>                         return 0;
>                 }
>         }
>
>         /* Build a new shader. */
>         shader = CALLOC_STRUCT(si_shader);
>         if (!shader) {
>                 mtx_unlock(&sel->mutex);
>                 return -ENOMEM;
>         }

Gražvydas


More information about the mesa-dev mailing list