amdgpu kfd TTM USERPTR
-
- USERPTR
-
- alloc of gpu
-
- vm_alloc_memory_of_gpu
- bo_create
- wrapper 驅動gfx 側自己的bo, 管理chardev側的bo, 标記這個bo是chardev這邊申請的
- init_user_pages 将真正的userptr綁定到tbo的ttm_tt
- 将 kgd_mem轉換為idr
- map to gpu
USERPTR
alloc of gpu
vm_alloc_memory_of_gpu
domain = AMDGPU_GEM_DOMAIN_GTT;
alloc_domain = AMDGPU_GEM_DOMAIN_CPU;
alloc_flags = 0;
bp:
domain: GEM_DOMAIN_CPU(alloc_domain)
bo_type: ttm_bo_type_device
alloc_flags: 0
bo_create
為了shadow bo, wrapper了do_create
-
bo_do_create
acc_size = 存儲這個bo占用的真正頁面所需要的空間
preferred_domain = domain = GEM_DOMAIN_CPU;
— bo_placement_from_domain()
places[c].fpfn = 0;
places[c].lpfn = 0;
places[c].flags = TTM_PL_FLAG_SYSTEM;
bo->allowed_domains = bo->preferred_domains;
bo->flags = bp->flags;
-
ttm_bo_init_reserved
bo->type = ttm_bo_type_device;
bo->num_pages (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
bo->mem.size = page對齊的位元組數量
bo->mem.mm_node = NULL; 存儲bo在目前domain的位置的node
bo->mem.mem_type = TTM_PL_SYSTEM . 預設建立的是SYSTEM,
bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED); 預設
屬性是SYSTEM | cached
placement->busy_placement = places; 移動位置和建立位置是一樣的, USERPTR都是在SYSTEM
上述三步 , USERPTR的tbo在第一次invalid校驗compact是通過的
bo->acc_size = acc_size; 這個size包括三部分(page ,CPU, DMA)
drm_vma_offset_add 如果是CPU可見記憶體, 将目前bo的vma添加到drm, 可以進行mmap了. 需要ttm_vm.c處理fault.
- ttm_bo_validate()
- 相容性比對 ttm_bo_mem_compat , USERPTR是相容的, 不走 下邊的2, 隻走到3
- palcement不相容需要移動bo ttm_bo_move_buffer
- 建立存儲系統記憶體頁面的結構 ttm_tt_create
-
bdev->driver->ttm_tt_create(bo, TTM_PAGE_FLAG_ZERO_ALLOC);
申請GTT的存儲結構(page array ) 以及對應的頁面映射(bind)的方式
-
- ttm_bo_validate()
-
wrapper 驅動gfx 側自己的bo, 管理chardev側的bo, 标記這個bo是chardev這邊申請的
使用的是 struct kgd_mem
bo->kfd_bo = *mem; 标記這個bo是給chardev使用
(*mem)->bo = bo; chardev這邊找到tbo;
(*mem)->va = va; 申請時提供的va
(*mem)->domain = domain; 最終需要映射到的位置
(*mem)->mapped_to_gpu_memory = 0; 申請時還沒有映射到GPU側
(*mem)->process_info = avm->process_info; 儲存計算的程序
init_user_pages 将真正的userptr綁定到tbo的ttm_tt
`amdgpu_ttm_tt_get_user_pages`
`amdgpu_bo_reserve`
`hmm_device_entry_to_page` 擷取頁面資訊,登記到pages的數組中, 這個數組就是ttm_tt
将 kgd_mem轉換為idr
map to gpu
根據裝置(n_device) 來循環頁表映射的
- 通過handel找到 alloc時的mem
- 通過mem就知道對應的tbo, 并且在alloc時已經設定這個bo的目标domain(GTT)
- reserve_bo_and_vm 目前bo停止移動, 需要預留進行map
- 1388 – 1411 mapping , 進行頁表更新