Skip to content

Commit 81d75a3

Browse files
jimqualexdeucher
jimqu
authored andcommitted
drm/amdgpu: add spin lock to protect freed list in vm (v2)
there is a protection fault about freed list when OCL test. add a spin lock to protect it. v2: drop changes in vm_fini Signed-off-by: JimQu <jim.qu@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com>
1 parent 9c97b5a commit 81d75a3

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

drivers/gpu/drm/amd/amdgpu/amdgpu.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -956,6 +956,8 @@ struct amdgpu_vm {
956956
struct amdgpu_vm_id ids[AMDGPU_MAX_RINGS];
957957
/* for interval tree */
958958
spinlock_t it_lock;
959+
/* protecting freed */
960+
spinlock_t freed_lock;
959961
};
960962

961963
struct amdgpu_vm_manager {

drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -885,17 +885,21 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev,
885885
struct amdgpu_bo_va_mapping *mapping;
886886
int r;
887887

888+
spin_lock(&vm->freed_lock);
888889
while (!list_empty(&vm->freed)) {
889890
mapping = list_first_entry(&vm->freed,
890891
struct amdgpu_bo_va_mapping, list);
891892
list_del(&mapping->list);
892-
893+
spin_unlock(&vm->freed_lock);
893894
r = amdgpu_vm_bo_update_mapping(adev, vm, mapping, 0, 0, NULL);
894895
kfree(mapping);
895896
if (r)
896897
return r;
897898

899+
spin_lock(&vm->freed_lock);
898900
}
901+
spin_unlock(&vm->freed_lock);
902+
899903
return 0;
900904

901905
}
@@ -1155,10 +1159,13 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev,
11551159
spin_unlock(&vm->it_lock);
11561160
trace_amdgpu_vm_bo_unmap(bo_va, mapping);
11571161

1158-
if (valid)
1162+
if (valid) {
1163+
spin_lock(&vm->freed_lock);
11591164
list_add(&mapping->list, &vm->freed);
1160-
else
1165+
spin_unlock(&vm->freed_lock);
1166+
} else {
11611167
kfree(mapping);
1168+
}
11621169

11631170
return 0;
11641171
}
@@ -1191,7 +1198,9 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev,
11911198
interval_tree_remove(&mapping->it, &vm->va);
11921199
spin_unlock(&vm->it_lock);
11931200
trace_amdgpu_vm_bo_unmap(bo_va, mapping);
1201+
spin_lock(&vm->freed_lock);
11941202
list_add(&mapping->list, &vm->freed);
1203+
spin_unlock(&vm->freed_lock);
11951204
}
11961205
list_for_each_entry_safe(mapping, next, &bo_va->invalids, list) {
11971206
list_del(&mapping->list);
@@ -1252,6 +1261,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm)
12521261
INIT_LIST_HEAD(&vm->cleared);
12531262
INIT_LIST_HEAD(&vm->freed);
12541263
spin_lock_init(&vm->it_lock);
1264+
spin_lock_init(&vm->freed_lock);
12551265
pd_size = amdgpu_vm_directory_size(adev);
12561266
pd_entries = amdgpu_vm_num_pdes(adev);
12571267

0 commit comments

Comments
 (0)