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

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdkfd: use tlb_seq from the VM subsystem for SVM as well v2

Instead of hand rolling the table_freed parameter.

v2: add some changes suggested by Philip

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Philip Yang<Philip.Yang@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Christian König and committed by
Alex Deucher
4d30a83c bffa91da

+22 -29
+2 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
··· 273 273 int amdgpu_amdkfd_gpuvm_free_memory_of_gpu( 274 274 struct amdgpu_device *adev, struct kgd_mem *mem, void *drm_priv, 275 275 uint64_t *size); 276 - int amdgpu_amdkfd_gpuvm_map_memory_to_gpu( 277 - struct amdgpu_device *adev, struct kgd_mem *mem, void *drm_priv, 278 - bool *table_freed); 276 + int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(struct amdgpu_device *adev, 277 + struct kgd_mem *mem, void *drm_priv); 279 278 int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu( 280 279 struct amdgpu_device *adev, struct kgd_mem *mem, void *drm_priv); 281 280 int amdgpu_amdkfd_gpuvm_sync_memory(
+8 -10
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
··· 1093 1093 1094 1094 static int update_gpuvm_pte(struct kgd_mem *mem, 1095 1095 struct kfd_mem_attachment *entry, 1096 - struct amdgpu_sync *sync, 1097 - bool *table_freed) 1096 + struct amdgpu_sync *sync) 1098 1097 { 1099 1098 struct amdgpu_bo_va *bo_va = entry->bo_va; 1100 1099 struct amdgpu_device *adev = entry->adev; ··· 1104 1105 return ret; 1105 1106 1106 1107 /* Update the page tables */ 1107 - ret = amdgpu_vm_bo_update(adev, bo_va, false, table_freed); 1108 + ret = amdgpu_vm_bo_update(adev, bo_va, false, NULL); 1108 1109 if (ret) { 1109 1110 pr_err("amdgpu_vm_bo_update failed\n"); 1110 1111 return ret; ··· 1116 1117 static int map_bo_to_gpuvm(struct kgd_mem *mem, 1117 1118 struct kfd_mem_attachment *entry, 1118 1119 struct amdgpu_sync *sync, 1119 - bool no_update_pte, 1120 - bool *table_freed) 1120 + bool no_update_pte) 1121 1121 { 1122 1122 int ret; 1123 1123 ··· 1133 1135 if (no_update_pte) 1134 1136 return 0; 1135 1137 1136 - ret = update_gpuvm_pte(mem, entry, sync, table_freed); 1138 + ret = update_gpuvm_pte(mem, entry, sync); 1137 1139 if (ret) { 1138 1140 pr_err("update_gpuvm_pte() failed\n"); 1139 1141 goto update_gpuvm_pte_failed; ··· 1743 1745 1744 1746 int amdgpu_amdkfd_gpuvm_map_memory_to_gpu( 1745 1747 struct amdgpu_device *adev, struct kgd_mem *mem, 1746 - void *drm_priv, bool *table_freed) 1748 + void *drm_priv) 1747 1749 { 1748 1750 struct amdgpu_vm *avm = drm_priv_to_vm(drm_priv); 1749 1751 int ret; ··· 1830 1832 entry->va, entry->va + bo_size, entry); 1831 1833 1832 1834 ret = map_bo_to_gpuvm(mem, entry, ctx.sync, 1833 - is_invalid_userptr, table_freed); 1835 + is_invalid_userptr); 1834 1836 if (ret) { 1835 1837 pr_err("Failed to map bo to gpuvm\n"); 1836 1838 goto out_unreserve; ··· 2298 2300 continue; 2299 2301 2300 2302 kfd_mem_dmaunmap_attachment(mem, attachment); 2301 - ret = update_gpuvm_pte(mem, attachment, &sync, NULL); 2303 + ret = update_gpuvm_pte(mem, attachment, &sync); 2302 2304 if (ret) { 2303 2305 pr_err("%s: update PTE failed\n", __func__); 2304 2306 /* make sure this gets validated again */ ··· 2504 2506 continue; 2505 2507 2506 2508 kfd_mem_dmaunmap_attachment(mem, attachment); 2507 - ret = update_gpuvm_pte(mem, attachment, &sync_obj, NULL); 2509 + ret = update_gpuvm_pte(mem, attachment, &sync_obj); 2508 2510 if (ret) { 2509 2511 pr_debug("Memory eviction: update PTE failed. Try again\n"); 2510 2512 goto validate_map_fail;
+8 -11
drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
··· 1146 1146 long err = 0; 1147 1147 int i; 1148 1148 uint32_t *devices_arr = NULL; 1149 - bool table_freed = false; 1150 1149 1151 1150 if (!args->n_devices) { 1152 1151 pr_debug("Device IDs array empty\n"); ··· 1207 1208 1208 1209 err = amdgpu_amdkfd_gpuvm_map_memory_to_gpu( 1209 1210 peer_pdd->dev->adev, (struct kgd_mem *)mem, 1210 - peer_pdd->drm_priv, &table_freed); 1211 + peer_pdd->drm_priv); 1211 1212 if (err) { 1212 1213 struct pci_dev *pdev = peer_pdd->dev->adev->pdev; 1213 1214 ··· 1232 1233 } 1233 1234 1234 1235 /* Flush TLBs after waiting for the page table updates to complete */ 1235 - if (table_freed || !kfd_flush_tlb_after_unmap(dev)) { 1236 - for (i = 0; i < args->n_devices; i++) { 1237 - peer_pdd = kfd_process_device_data_by_id(p, devices_arr[i]); 1238 - if (WARN_ON_ONCE(!peer_pdd)) 1239 - continue; 1240 - kfd_flush_tlb(peer_pdd, TLB_FLUSH_LEGACY); 1241 - } 1236 + for (i = 0; i < args->n_devices; i++) { 1237 + peer_pdd = kfd_process_device_data_by_id(p, devices_arr[i]); 1238 + if (WARN_ON_ONCE(!peer_pdd)) 1239 + continue; 1240 + kfd_flush_tlb(peer_pdd, TLB_FLUSH_LEGACY); 1242 1241 } 1243 1242 kfree(devices_arr); 1244 1243 ··· 2203 2206 if (IS_ERR(peer_pdd)) 2204 2207 return PTR_ERR(peer_pdd); 2205 2208 2206 - ret = amdgpu_amdkfd_gpuvm_map_memory_to_gpu(peer->adev, kgd_mem, peer_pdd->drm_priv, 2207 - NULL); 2209 + ret = amdgpu_amdkfd_gpuvm_map_memory_to_gpu(peer->adev, kgd_mem, 2210 + peer_pdd->drm_priv); 2208 2211 if (ret) { 2209 2212 pr_err("Failed to map to gpu %d/%d\n", j, p->n_pdds); 2210 2213 return ret;
+1 -1
drivers/gpu/drm/amd/amdkfd/kfd_process.c
··· 722 722 goto err_alloc_mem; 723 723 724 724 err = amdgpu_amdkfd_gpuvm_map_memory_to_gpu(kdev->adev, *mem, 725 - pdd->drm_priv, NULL); 725 + pdd->drm_priv); 726 726 if (err) 727 727 goto err_map_mem; 728 728
+3 -4
drivers/gpu/drm/amd/amdkfd/kfd_svm.c
··· 1243 1243 { 1244 1244 struct amdgpu_device *adev = pdd->dev->adev; 1245 1245 struct amdgpu_vm *vm = drm_priv_to_vm(pdd->drm_priv); 1246 - bool table_freed = false; 1247 1246 uint64_t pte_flags; 1248 1247 unsigned long last_start; 1249 1248 int last_domain; ··· 1283 1284 last_start - prange->start, 1284 1285 NULL, dma_addr, 1285 1286 &vm->last_update, 1286 - &table_freed); 1287 + NULL); 1287 1288 1288 1289 for (j = last_start - prange->start; j <= i; j++) 1289 1290 dma_addr[j] |= last_domain; ··· 1305 1306 if (fence) 1306 1307 *fence = dma_fence_get(vm->last_update); 1307 1308 1308 - if (table_freed) 1309 - kfd_flush_tlb(pdd, TLB_FLUSH_LEGACY); 1310 1309 out: 1311 1310 return r; 1312 1311 } ··· 1360 1363 break; 1361 1364 } 1362 1365 } 1366 + 1367 + kfd_flush_tlb(pdd, TLB_FLUSH_LEGACY); 1363 1368 } 1364 1369 1365 1370 return r;