amdgpu kfd TTM USERPTR

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

  1. 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;

    1. 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.

      1. ttm_bo_validate()
        1. 兼容性匹配 ttm_bo_mem_compat , USERPTR是兼容的, 不走 下边的2, 只走到3
        2. palcement不兼容需要移动bo ttm_bo_move_buffer
        3. 创建存储系统内存页面的结构 ttm_tt_create
          1. bdev->driver->ttm_tt_create(bo, TTM_PAGE_FLAG_ZERO_ALLOC);
            申请GTT的存储结构(page array ) 以及对应的页面映射(bind)的方式
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) 来循环页表映射的

  1. 通过handel找到 alloc时的mem
  2. 通过mem就知道对应的tbo, 并且在alloc时已经设置这个bo的目标domain(GTT)
  3. reserve_bo_and_vm 当前bo停止移动, 需要预留进行map
  4. 1388 – 1411 mapping , 进行页表更新
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值