From 9aa8bac98b823e8783bc3a06a6e5b23fbf8d87fb Mon Sep 17 00:00:00 2001 From: Vadim Girlin Date: Wed, 19 Sep 2012 04:48:16 +0400 Subject: [PATCH] winsys/radeon: fix relocs caching MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. Note: This is a candidate for the stable branches. Signed-off-by: Vadim Girlin Reviewed-by: Marek Olšák --- 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; -- 2.7.4