get_user_pages()
增加页面引用计数。这就是为什么它可以将页面固定在内存中。
所以我想知道
get_user_pages()
获得的页面是否可以直接回收或者换出而不使用put_user_pages()?
因为操作系统的LRU机制会自动维护页面引用计数。
如果不能,是否意味着由
get_user_pages()
分配的页面的引用计数必须减少 put_user_pages()
,然后才能通过一系列 LRU 操作回收或换出?
注意:从 v5.6 开始,
get_user_pages()
和 put_user_pages()
似乎已被 pin_user_pages()
和 unpin_user_pages()
取代。您可能应该使用它们。
get_user_pages()
之后,页面肯定不能换出。它们被固定在内存中并映射到内核虚拟内存中,以便内核代码能够访问它们。交换只能在put_user_pages()
之后进行。
但是,它们可以从持有它们的原始任务中取消映射并重新用于其他用途(我认为这就是您所说的“回收”的意思)。 在
get_user_pages_remote()
的文档字符串中也说明了这一点:
/**
* get_user_pages_remote() - pin user pages in memory
* [...]
*
* This does not guarantee that the page exists in the user mappings when
* get_user_pages_remote returns, and there may even be a completely different
* page there in some cases (eg. if mmapped pagecache has been invalidated
* and subsequently re-faulted). However it does guarantee that the page
* won't be freed completely. And mostly callers simply care that the page
* contains data that was valid *at some point in time*. Typically, an IO
* or similar operation cannot guarantee anything stronger anyway because
* locks can't be held over the syscall boundary.
*
* [...]
*/