iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
Software Development

閱讀 Linux Kernel 文件系列 第 27

# Day 27 Page Migration (二)

文件

核心中使用 migrate_pages()
=========================

1. 將分頁從 LRU 串列中移除

   要被遷移的分頁串列們是透過掃描各個分頁,
   並將之移動到串列中而產生。
   這是由呼叫 isolate_lru_page() 來達成。
   呼叫 isolate_lru_page 增加對分頁的引用數量,
   所以便在分頁遷移發生時它不會消失。
   它還可以防止 swapper 或其他掃描遇到該分頁。

2. 我們需要一個 new_page_t 類型的函數,
   可以被傳遞給 migrate_pages()。
   這個函數需要知道,在給定一個舊的分頁下,
   如何正確地分配一個新的分頁。

3. 呼叫 migrate_pages() 函數來嘗試做遷移。
   它會呼叫函數來為每個有被考慮要做遷移的分頁分配新的分頁。

migrate_pages() 是如何運作
=========================

migrate_pages() 會對其分頁串列進行多次的處理。
如果對該分頁的引用在某時刻是可以移除的,則該分頁就會被移動。
該分頁已經透過 isolate_lru_page() 從 LRU 串列中被移除,
且該分頁的引用數目已增加,使得該分頁不會在分頁遷移的過程中被釋放。

步驟:

1. 將要被遷移的分頁上鎖。

2. 確認已經完成寫回(writeback)。

3. 將要遷移到的新分頁上鎖。
   該分頁已被上鎖,所以對它的存取 (尚未更新)
   會馬上鎖住,而遷移正在進行。

4. 所有對該分頁的分頁表引用都轉換為遷移項。
   這會減少分頁面的 mapcount 。
   如果減少後的 mapcount 不為零,那麼我們不遷移頁面。
   所有嘗試去存取該分頁的使用者空間程序,
   現在將會在獲取分頁鎖上等待解鎖。
   嘗試訪問頁面的進程現在將等待頁面鎖定。
   
5. i_pages 鎖已被持有。
   這會使得所有嘗試透過映射去存取該分頁的程序,
   在 spinlock 中阻塞。

6. 分頁的索引數目會被檢視。
   如果有殘存數目那麼我們就罷手,
   否則我們會知道我們正是唯一正在所引這個分頁的使用者。
   
7. radix tree 會被檢視,而若該 tree 並為包含指向本分頁的指標,
   那們我們罷手,因為有人有修改過這個 tree。

8. 新分頁已被設置了舊分頁的設定,
   以使新分頁的存取能有正確的設定。

9. radix tree 被修改程指向新的分頁。

10. 舊分頁的引用計數會被棄置,
    因為定址空間的索引已消失。
    建立對新分頁的引用,
    因為該新頁面被定址空間所引用。

11. i_pages 的鎖被棄置。
    當可以在映射中尋找時,
    程序會從在鎖上 spinning 變成在上鎖的新分頁上睡。
    
12. 分頁內容被複製到新的分頁。

13. 剩餘的分頁旗標會被複製到新的分頁。

14. 舊分頁的旗標被清除以表示該分頁不再提供任何資訊。

15. 在新分頁上,將 writeback 排進隊列這件事情被觸發。

16. 如果遷移項目是分頁的話,將他們帶換成實際的 ptes。
    如此的操作可以使得,
    沒有在等待分頁鎖的使用者空間的程序可以進行存取。

19. 新舊分頁的分頁鎖都被移除。
    在分頁鎖上等待的程序,會重新執行他們的分頁錯誤流程
    並且抵達到新的分頁。

20. 新的分頁被移動到 LRU 串列,且可已被 swapper 等等所掃瞄。

我的理解

  • migrate_pages() does several passes over its list of pages. 這裡的 pass 和 compiler 會做幾次 pass 來產生出結果的 pass 應該是一樣意思,表示會經過多次的處理。
  • page cache 使用的 data structure 是 radix tree
  • 文件開始描述一些我並不是很熟悉的細節了!XD

參考資料

延伸閱讀


上一篇
# Day 26 Page migration (一)
下一篇
# Day 28 Page Migration (三)
系列文
閱讀 Linux Kernel 文件30

尚未有邦友留言

立即登入留言