iT邦幫忙

2021 iThome 鐵人賽

DAY 25
0
Software Development

閱讀 Linux Kernel 文件系列 第 25

# Day 25 Heterogeneous Memory Management (HMM) (Summary)

文件

摘要

  • 這份文件介紹了 HMM 機制,HMM 整合一些非傳統記憶體(ex. GPU 上的記憶體)到 kernel code path,以及提供一些 helper function 來達成 SVM (shared virtual memory)。
  1. 第一小節提到的是 driver specific memory allocator 的問題,一直以來,device 上的記憶體通常由 device driver 來管理和分配 (ex. GPU),這裡提出了這樣分配方式的一些問題
    • device 跟 host 使用的是不同的定址空間,所以要使用 device 來作一些運算的話,需要從 host 把資料複製到 device 上
    • 陣列資列還算相對好複製,但是複雜的資料結構,如 tree、list,有很多 pointer 指來指去的,相對容易在複製上出錯
    • 所以使用 shared memory space,意即 host 和 device 有著相同的定址空間。
  2. 第二小節則是說明匯流排還有裝置記憶體特性,並解釋 SVM 為何不容易達成,不過老實說,筆者覺得文件裡面並沒有提到如何解決"因為 I/O bus 和 device memory 特性所造成的困難",所以這邊就簡單紀錄結論:要達成 SVM 要,device 能存取所有記憶體(包含 host 的),並且任何記憶體都要能"被遷移"(be migrated)到 device 上
  3. 第三小節提到 HMM 提供 helper 來達成的主要兩大功能:Shared Address SpaceMigration
    • 透過 mirror CPU page table 來達成 Shared Address Space,而 device mirror CPU page table,需要 device 自己做一些 device 端的記憶體管理操作 (例如 unmmap、invalidate),所以 HMM 只提供 helper 來作通用的部分,device specific 的部分要 device 自行實作。
    • 還有透過 ZONE_DEVICE 來提供 device memory struct page 使用,讓 CPU 可以透過 struct page 將 device memory 納入 mm 的管轄,以此來實現 migration
      • 從 host migrate 記憶體到 device 對 CPU 來說就像是 swap out 機制,已經有現行可用的程式碼
      • 從 device migrate 回 host,則是當 CPU 想要存取 device memory 的時候,會觸發 page fault 來做處理
  4. 4~7 小節提到的就是實作上的細節還有一些範例程式,如何利用現有的程式碼以及變數來實作 HMM,以及使用 HMM 的 driver 需要注意哪些地方和 HMM 的使用方法;不瞞各位說,這部分筆者其實沒有看的很懂XDD,如果有相關經驗的讀者,筆者有描述不當的地方,或是有想要補充的話,再麻煩各位了!XD
  5. 第8、9小節則是描述加入 HMM 後,會有哪些影響
    • 第 8 小節提到的是 Exclusive Access Memory,這是提供 atomic operation 需要的基礎設施,HMM 這裡提供了 make_device_exclusive_range() 這個函數來標記,讓整個 shared memory space 是可以提供 atomic operation 實作的。
    • 最後一個小節則是描述 cgroup 中的 memcg 還有 RSS 計算上的影響,在 HMM 這樣的實作下,device memory 在 memcg 和 RSS 的計算上,都會等同於一般記憶體,這是故意這樣設計的,想要讓不管有沒有使用 device memory 都會覺得這個改變是 transparent 的,會再有更多相關經驗後來檢驗這個決定是不是合理的!目前這樣子做唯一的壞處是 OOM 有可能會把使用太多 device memory 的 process 優先清除,但這樣並不能釋放最多的 host 端記憶體。

後記

  • 第三小節提到的 ZONE_DEVICE 就是我們在前一個系列,Physical Memory Model 有看到過的!(也是我們閱讀這篇文件的原因之一 XD)
  • 這個系列第三篇文章有提到 sync_cpu_device_pagetables 這個 function 已經不存在在v5.15的 kernel 了,有用 git bisect 來找了一下,是在哪個 commit 把這個相關的 function 刪除的
commit a22dd506400d0f4784ad596f073b9eb5ed7c6a2a (refs/bisect/bad)
Author: Jason Gunthorpe <jgg@mellanox.com>
Date:   Tue Nov 12 16:22:30 2019 -0400

    mm/hmm: remove hmm_mirror and related

    The only two users of this are now converted to use mmu_interval_notifier,
    delete all the code and update hmm.rst.

    Link: https://lore.kernel.org/r/20191112202231.3856-14-jgg@ziepe.ca
    Reviewed-by: Jérôme Glisse <jglisse@redhat.com>
    Tested-by: Ralph Campbell <rcampbell@nvidia.com>
    Reviewed-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>

sync_cpu_device_pagetables 這個其實是 struct hmm_mirror 的一個成員,是一個 function pointer,不過這個還並不是唯一的修改,在這個 commit 之後,文件和 HMM code 都還有再做修改,所以之後會繼續來研究要如何修改現在文件中的 sync_cpu_device_pagetables 的!

  • 原來 GUP 是指 get user page! XDD

  • 這篇文件提到 page migration,那麼下一篇文件,我們就來看看 page migration 吧!

參考資料

延伸閱讀


上一篇
# Day 24 Heterogeneous Memory Management (HMM) (四)
下一篇
# Day 26 Page migration (一)
系列文
閱讀 Linux Kernel 文件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言