mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 15:20:10 +01:00
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@gmail.com> Reviewed-by: Marek Olšák <maraeo@gmail.com>
This commit is contained in:
parent
175fdd7b86
commit
9aa8bac98b
2 changed files with 6 additions and 8 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue