get_user_pages()获得的页面可以直接回收或者换出,而不使用put_user_pages()吗?

问题描述 投票:0回答:1

get_user_pages()
增加页面引用计数。这就是为什么它可以将页面固定在内存中。

所以我想知道

get_user_pages()
获得的页面是否可以直接回收或者换出而不使用
put_user_pages()?
因为操作系统的LRU机制会自动维护页面引用计数。

如果不能,是否意味着由

get_user_pages()
分配的页面的引用计数必须减少
put_user_pages()
,然后才能通过一系列 LRU 操作回收或换出

linux memory linux-kernel reference-counting lru
1个回答
0
投票

注意:从 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.
 *
 * [...]
 */
© www.soinside.com 2019 - 2024. All rights reserved.