天天看點

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 , 進行頁表更新

繼續閱讀