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 , 进行页表更新