Upgrade to Pro — share decks privately, control downloads, hide ads and more …

myread

a1933b51019
February 21, 2024
10

 myread

a1933b51019

February 21, 2024
Tweet

Transcript

  1. Virt user buffer physical user buffer Virt data block physical

    user buffer Page table Share buffer dpu cpu 共享 Task array (host 端)
  2. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_block Dst: phys_buf

    Size: 2K Type:read 針對點的地方(2K size)的data copy,產生對應read task 產生read task ,先暫存起來
  3. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block 透過file inode 和index(1)和write entry

    尋找index 1 的block的virtual address Virt_data_block A Virt_data_block A Src: phys_data_block Dst: phys_buf Size: 2K Type:read
  4. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block phys_data_blockA=Virt_data_blockA- offset Virt_data_block A

    Src: phys_data_block Dst: phys_buf Size: 2K Type:read phys_data_blockA 通過-offset的方式找到Virt_data_blockA 的phys address phys_data_blockA
  5. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read 產生read task,先暫存起來 Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA 針對點的地方(2K size)的data copy,產生對應read task
  6. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read 產生read task,先暫存起來 Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA
  7. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K Virt_buf+4K phys_bufA Pgd 查表取得virt_buf+4K對應的phys address phys_bufA
  8. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K Virt_buf+4K phys_bufA Pgd phys_bufA 查表取得virt_buf+4K對應的phys address phys_bufA
  9. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read 產生read task,先暫存起來 針對點的地方(2K size)的data copy,產生對應read task
  10. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read 產生read task,先暫存起來
  11. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read 透過file inode 和index(2)和write entry 尋找index 2 的block的virtual address Virt_data_block B
  12. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read 透過file inode 和index(2)和write entry 尋找index 2 的block的virtual address Virt_data_block B Virt_data_block B
  13. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB=Virt_data_blockB- offset 通過-offset的方式找到Virt_data_blockB 的phys address phys_data_blockB phys_data_blockB
  14. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read 產生read task,先暫存起來 針對點的地方(2K size)的data copy,產生對應read task
  15. Virt_buf Virt_data_block Host cpu(filesystem) phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K

    Size: 2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read 產生read task,先暫存起來
  16. Pim driver(cpu) Src: phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read Src:

    phys_data_block Dst: phys_buf Size: 2K Type:read Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read 將存在filesystem(host端)的task填入 dpu與cpu的shared buffer 此處應該還會判斷shared buffer是否滿,那些欄位在使用,但先暫時省略
  17. Virt_buf Virt_data_block DPU phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K Size:

    2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 1的參數執行copy
  18. Virt_buf Virt_data_block DPU phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K Size:

    2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 1的參數執行copy clflush(phys_buf, 2K); memcpy_v(phys_buf, phys_data_block, 2K);
  19. Virt_buf Virt_data_block DPU phys_buf phys_data_block Src: phys_data_blockA Dst: phys_buf+2K Size:

    2K Type:read Src: phys_data_block Dst: phys_buf Size: 2K Type:read Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 1的參數執行copy clflush(phys_buf, 2K); memcpy_v(phys_buf, phys_data_block, 2K); DPU
  20. Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA

    Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 2的參數執行copy Src: phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read
  21. Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA

    Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 2的參數執行copy clflush(phys_buf+2K, 2K); memcpy_v(phys_buf+2K, phys_data_blockS, 2K); Src: phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read
  22. Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA

    Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 2的參數執行copy clflush(phys_buf+2K, 2K); memcpy_v(phys_buf+2K, phys_data_blockS, 2K); Src: phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read DPU
  23. Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA

    Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 3的參數執行copy
  24. Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA

    Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 3的參數執行copy clflush(phys_buf+2K, 2K); memcpy_v(phys_buf+2K, phys_data_blockA, 2K); Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read
  25. Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA

    Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 3的參數執行copy clflush(phys_bufA, 2K); memcpy_v(phys_bufA, phys_data_blockA, 2K); Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read DPU
  26. Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA

    Virt_data_block B phys_data_blockB Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Dpu根據task 4的參數執行copy
  27. Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA

    Virt_data_block B phys_data_blockB Dpu根據task 4的參數執行copy clflush(phys_bufA+2K, 2K); memcpy_v(phys_bufA+2K, phys_data_blockB, 2K); Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read
  28. Virt_buf Virt_data_block DPU phys_buf phys_data_block Virt_data_block A phys_data_blockA Virt_buf+4K phys_bufA

    Virt_data_block B phys_data_blockB Dpu根據task 4的參數執行copy clflush(phys_bufA+2K, 2K); memcpy_v(phys_bufA+2K, phys_data_blockB, 2K); Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read DPU
  29. Pim driver(cpu) Check shared buffer 中task 4的狀態,發現dpu處理完成 (busy waiting的方式) Src:

    phys_data_blockA Dst: phys_buf+2K Size: 2K Type:read Done:ok Src: phys_data_block Dst: phys_buf Size: 2K Type:read Done:ok Src: phys_data_blockA+2K Dst: phys_bufA Size: 2K Type:read Done:ok Src: phys_data_blockB Dst: phys_bufA+2K Size: 2K Type:read Done:ok