Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/radeon: check if BO_VA is set before adding it to the invalidation list

Otherwise we try to clear BO_VAs without an address.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=91141

Signed-off-by: Christian König <christian.koenig@amd.com>
Test-by: hadack@gmx.de
Tested-by: Michel Dänzer <michel.daenzer@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Christian König and committed by
Alex Deucher
dbedff05 eb99070b

+5 -5
+5 -5
drivers/gpu/drm/radeon/radeon_vm.c
··· 507 507 tmp->bo = radeon_bo_ref(bo_va->bo); 508 508 509 509 interval_tree_remove(&bo_va->it, &vm->va); 510 + spin_lock(&vm->status_lock); 510 511 bo_va->it.start = 0; 511 512 bo_va->it.last = 0; 512 - 513 - spin_lock(&vm->status_lock); 514 513 list_del_init(&bo_va->vm_status); 515 514 list_add(&tmp->vm_status, &vm->freed); 516 515 spin_unlock(&vm->status_lock); 517 516 } 518 517 519 518 if (soffset || eoffset) { 519 + spin_lock(&vm->status_lock); 520 520 bo_va->it.start = soffset; 521 521 bo_va->it.last = eoffset - 1; 522 - interval_tree_insert(&bo_va->it, &vm->va); 523 - spin_lock(&vm->status_lock); 524 522 list_add(&bo_va->vm_status, &vm->cleared); 525 523 spin_unlock(&vm->status_lock); 524 + interval_tree_insert(&bo_va->it, &vm->va); 526 525 } 527 526 528 527 bo_va->flags = flags; ··· 1155 1156 1156 1157 list_for_each_entry(bo_va, &bo->va, bo_list) { 1157 1158 spin_lock(&bo_va->vm->status_lock); 1158 - if (list_empty(&bo_va->vm_status)) 1159 + if (list_empty(&bo_va->vm_status) && 1160 + (bo_va->it.start || bo_va->it.last)) 1159 1161 list_add(&bo_va->vm_status, &bo_va->vm->invalidated); 1160 1162 spin_unlock(&bo_va->vm->status_lock); 1161 1163 }