diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 16 |
1 files changed, 3 insertions, 13 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 330e307c36ed..7e73e54eadb9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |||
| @@ -971,22 +971,18 @@ int amdgpu_vm_clear_freed(struct amdgpu_device *adev, | |||
| 971 | struct amdgpu_bo_va_mapping *mapping; | 971 | struct amdgpu_bo_va_mapping *mapping; |
| 972 | int r; | 972 | int r; |
| 973 | 973 | ||
| 974 | spin_lock(&vm->freed_lock); | ||
| 975 | while (!list_empty(&vm->freed)) { | 974 | while (!list_empty(&vm->freed)) { |
| 976 | mapping = list_first_entry(&vm->freed, | 975 | mapping = list_first_entry(&vm->freed, |
| 977 | struct amdgpu_bo_va_mapping, list); | 976 | struct amdgpu_bo_va_mapping, list); |
| 978 | list_del(&mapping->list); | 977 | list_del(&mapping->list); |
| 979 | spin_unlock(&vm->freed_lock); | 978 | |
| 980 | r = amdgpu_vm_bo_split_mapping(adev, NULL, 0, vm, mapping, | 979 | r = amdgpu_vm_bo_split_mapping(adev, NULL, 0, vm, mapping, |
| 981 | 0, NULL); | 980 | 0, NULL); |
| 982 | kfree(mapping); | 981 | kfree(mapping); |
| 983 | if (r) | 982 | if (r) |
| 984 | return r; | 983 | return r; |
| 985 | 984 | ||
| 986 | spin_lock(&vm->freed_lock); | ||
| 987 | } | 985 | } |
| 988 | spin_unlock(&vm->freed_lock); | ||
| 989 | |||
| 990 | return 0; | 986 | return 0; |
| 991 | 987 | ||
| 992 | } | 988 | } |
| @@ -1252,13 +1248,10 @@ int amdgpu_vm_bo_unmap(struct amdgpu_device *adev, | |||
| 1252 | spin_unlock(&vm->it_lock); | 1248 | spin_unlock(&vm->it_lock); |
| 1253 | trace_amdgpu_vm_bo_unmap(bo_va, mapping); | 1249 | trace_amdgpu_vm_bo_unmap(bo_va, mapping); |
| 1254 | 1250 | ||
| 1255 | if (valid) { | 1251 | if (valid) |
| 1256 | spin_lock(&vm->freed_lock); | ||
| 1257 | list_add(&mapping->list, &vm->freed); | 1252 | list_add(&mapping->list, &vm->freed); |
| 1258 | spin_unlock(&vm->freed_lock); | 1253 | else |
| 1259 | } else { | ||
| 1260 | kfree(mapping); | 1254 | kfree(mapping); |
| 1261 | } | ||
| 1262 | 1255 | ||
| 1263 | return 0; | 1256 | return 0; |
| 1264 | } | 1257 | } |
| @@ -1291,9 +1284,7 @@ void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, | |||
| 1291 | interval_tree_remove(&mapping->it, &vm->va); | 1284 | interval_tree_remove(&mapping->it, &vm->va); |
| 1292 | spin_unlock(&vm->it_lock); | 1285 | spin_unlock(&vm->it_lock); |
| 1293 | trace_amdgpu_vm_bo_unmap(bo_va, mapping); | 1286 | trace_amdgpu_vm_bo_unmap(bo_va, mapping); |
| 1294 | spin_lock(&vm->freed_lock); | ||
| 1295 | list_add(&mapping->list, &vm->freed); | 1287 | list_add(&mapping->list, &vm->freed); |
| 1296 | spin_unlock(&vm->freed_lock); | ||
| 1297 | } | 1288 | } |
| 1298 | list_for_each_entry_safe(mapping, next, &bo_va->invalids, list) { | 1289 | list_for_each_entry_safe(mapping, next, &bo_va->invalids, list) { |
| 1299 | list_del(&mapping->list); | 1290 | list_del(&mapping->list); |
| @@ -1357,7 +1348,6 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm) | |||
| 1357 | INIT_LIST_HEAD(&vm->cleared); | 1348 | INIT_LIST_HEAD(&vm->cleared); |
| 1358 | INIT_LIST_HEAD(&vm->freed); | 1349 | INIT_LIST_HEAD(&vm->freed); |
| 1359 | spin_lock_init(&vm->it_lock); | 1350 | spin_lock_init(&vm->it_lock); |
| 1360 | spin_lock_init(&vm->freed_lock); | ||
| 1361 | pd_size = amdgpu_vm_directory_size(adev); | 1351 | pd_size = amdgpu_vm_directory_size(adev); |
| 1362 | pd_entries = amdgpu_vm_num_pdes(adev); | 1352 | pd_entries = amdgpu_vm_num_pdes(adev); |
| 1363 | 1353 | ||
