Mesa (8.0): winsys/radeon: fix relocs caching
Andreas Boll
ab at kemper.freedesktop.org
Tue Oct 16 20:06:33 UTC 2012
Module: Mesa
Branch: 8.0
Commit: 8f89e44365a7b406252a458415129ad7683894b3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=8f89e44365a7b406252a458415129ad7683894b3
Author: Vadim Girlin <vadimgirlin at gmail.com>
Date: Wed Sep 19 04:48:16 2012 +0400
winsys/radeon: fix relocs caching
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 <vadimgirlin at gmail.com>
Reviewed-by: Marek Olšák <maraeo at gmail.com>
(cherry picked from commit 9aa8bac98b823e8783bc3a06a6e5b23fbf8d87fb)
---
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 a19a7fa..74f2350 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
@@ -198,9 +198,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. */
@@ -217,7 +218,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;
@@ -241,10 +241,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. */
@@ -254,7 +255,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;
@@ -287,7 +287,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 904000d..474463a 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;
More information about the mesa-commit
mailing list