天天看点

amdgpu kfd TTM USERPTR

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

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

继续阅读