[Mesa-dev] [PATCH] winsys/radeon: fix relocs caching

Marek Olšák maraeo at gmail.com
Tue Sep 18 17:36:56 PDT 2012


Well spotted! Thanks a lot.

Reviewed-by: Marek Olšák <maraeo at gmail.com>

This patch should also be marked as a candidate for stable branches.

Marek

On Wed, Sep 19, 2012 at 2:09 AM, Vadim Girlin <vadimgirlin at gmail.com> wrote:
> Don't cache pointers to elements of reallocatable array.
> In some circumstances it caused false cache hits resulting in incorrect
> command stream and gpu lockup.
>
> Signed-off-by: Vadim Girlin <vadimgirlin at gmail.com>
> ---
>
> Fixes lockups with "longprim" test for me and probably some other random issues.
>
>  src/gallium/winsys/radeon/drm/radeon_drm_cs.c | 13 ++++++-------
>  src/gallium/winsys/radeon/drm/radeon_drm_cs.h |  1 -
>  2 files changed, 6 insertions(+), 8 deletions(-)
>
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> index 5cd75d8..c6498ef 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
> @@ -214,9 +214,10 @@ int radeon_get_reloc(struct radeon_cs_context *csc, struct radeon_bo *bo)
>      unsigned hash = bo->handle & (sizeof(csc->is_handle_added)-1);
>
>      if (csc->is_handle_added[hash]) {
> -        reloc = csc->relocs_hashlist[hash];
> +        i = csc->reloc_indices_hashlist[hash];
> +        reloc = &csc->relocs[i];
>          if (reloc->handle == bo->handle) {
> -            return csc->reloc_indices_hashlist[hash];
> +            return i;
>          }
>
>          /* Hash collision, look for the BO in the list of relocs linearly. */
> @@ -233,7 +234,6 @@ int radeon_get_reloc(struct radeon_cs_context *csc, struct radeon_bo *bo)
>                   *         AAAAAAAAAAABBBBBBBBBBBBBBCCCCCCCC
>                   * will collide here: ^ and here:   ^,
>                   * meaning that we should get very few collisions in the end. */
> -                csc->relocs_hashlist[hash] = reloc;
>                  csc->reloc_indices_hashlist[hash] = i;
>                  /*printf("write_reloc collision, hash: %i, handle: %i\n", hash, bo->handle);*/
>                  return i;
> @@ -257,10 +257,11 @@ static unsigned radeon_add_reloc(struct radeon_cs_context *csc,
>      enum radeon_bo_domain wd = usage & RADEON_USAGE_WRITE ? domains : 0;
>
>      if (csc->is_handle_added[hash]) {
> -        reloc = csc->relocs_hashlist[hash];
> +        i = csc->reloc_indices_hashlist[hash];
> +        reloc = &csc->relocs[i];
>          if (reloc->handle == bo->handle) {
>              update_reloc_domains(reloc, rd, wd, added_domains);
> -            return csc->reloc_indices_hashlist[hash];
> +            return i;
>          }
>
>          /* Hash collision, look for the BO in the list of relocs linearly. */
> @@ -270,7 +271,6 @@ static unsigned radeon_add_reloc(struct radeon_cs_context *csc,
>              if (reloc->handle == bo->handle) {
>                  update_reloc_domains(reloc, rd, wd, added_domains);
>
> -                csc->relocs_hashlist[hash] = reloc;
>                  csc->reloc_indices_hashlist[hash] = i;
>                  /*printf("write_reloc collision, hash: %i, handle: %i\n", hash, bo->handle);*/
>                  return i;
> @@ -303,7 +303,6 @@ static unsigned radeon_add_reloc(struct radeon_cs_context *csc,
>      reloc->flags = 0;
>
>      csc->is_handle_added[hash] = TRUE;
> -    csc->relocs_hashlist[hash] = reloc;
>      csc->reloc_indices_hashlist[hash] = csc->crelocs;
>
>      csc->chunks[1].length_dw += RELOC_DWORDS;
> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
> index 5ce0002..6336d3a 100644
> --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
> @@ -48,7 +48,6 @@ struct radeon_cs_context {
>
>      /* 0 = BO not added, 1 = BO added */
>      char                        is_handle_added[256];
> -    struct drm_radeon_cs_reloc  *relocs_hashlist[256];
>      unsigned                    reloc_indices_hashlist[256];
>
>      unsigned                    used_vram;
> --
> 1.7.11.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list