翻譯自LWN.NET
因為要在struct page這一小段內(nèi)存中填入最大量的信息欣范,linux kernel中的結(jié)構(gòu)體page是最復雜的結(jié)構(gòu)體之一。struct page中每一個區(qū)域都重度過載鼻疮,開發(fā)者們都傾向于:若能避免地技,絕不對struct page做修改几颜。不過笼踩,這并沒有阻止Jér?meGlisse在2018年Linux存儲获列,文件系統(tǒng)和內(nèi)存管理峰會的兩次全體會議上提出重大更改的建議谷市。建議提供了一些有趣的增益,但是要實現(xiàn)這一目標并不是一件容易的事击孩。
mapping段在struct page中用于描述這個頁的來路迫悠;對于緩存頁面,mapping指向struct address_space來指示這個頁面的歸屬巩梢,匿名頁面使用mapping來反向映射到struct anon_vma创泄。對于kernel自己用的頁面,mapping段可以被slab分配器使用括蝠。就像struct page中其他的數(shù)據(jù)段一樣鞠抑,mapping是一個復雜的區(qū)域,可以根據(jù)頁面在當前的用途提供不同的含義忌警。
Glisse對于這一區(qū)域有著自己的設(shè)計碍拆,但是首先他必須找到清除mapping當前使用方式的辦法。大多數(shù)時候慨蓝,與struct page相關(guān)的代碼都是通過VMA或是struct file找到struct page感混,在這兩種情況下,mapping的信息可以從這兩個結(jié)構(gòu)體中獲得礼烈。在可獲得該信息的上下文中弧满,無需將其存儲在頁面結(jié)構(gòu)本身中;可以通過更改接口來代替它此熬,以將映射信息向下傳遞到調(diào)用鏈庭呜。這樣做就允許他清除大多數(shù)使用mapping的情況滑进,然后就將mapping段移做他用。
特別是募谎,他正在考慮使用該字段為頁面上正在等待的線程接上一個結(jié)構(gòu)體扶关。當前,在線程等待特定頁面是通過一組256個共享等待隊列完成的数冬,替換掉這些隊列节槐,將會加快隊列變長的情況下線程的喚醒速度。在一般情況下拐纱,沒有人在等這個頁面時铜异,mapping段將會指向一個結(jié)構(gòu)體:
struct page_mapping{
struct address_space* mapping;
unsigned long flags;
}
本質(zhì)上,此機制是添加用于訪問映射信息的間接層秸架,并添加一些標志以達到良好的效果揍庄。但是,當有人需要在該頁面上等待時东抹,此結(jié)構(gòu)將被替換為: