根据内核对gup api的内联评论:
"这不保证页面存在于用户映射中 当get_user_pages返回时,甚至可能完全 在某些情况下有不同的页面(例如,如果mmapped pagecache已经 失效,随后再次出现故障)。但它确实保证 页面不会被完全释放。而且主要是来电者 注意页面包含有时有效的数据 时间。通常,IO或类似操作无法保证 任何更强大的东西,因为锁不能保持在系统调用上 。边界"
我假设在返回用户空间之前我必须put_page()
。但我也发现系统调用中的ib_umem.c
get_user_pages()
和另一个系统调用中的put_page()
。我想在我的驱动程序中也这样做。是这样吗?
感谢。
2016年11月10日更新: 好的,现在我知道原因了。 gup可以固定页面,这样它就不会被释放。但它无法锁定vma以指向同一页面。 ib_umem没有解决问题,ib_umem_get()和ib_umem_release()应该保持在同一系统调用范围内。
我还找到了一些解决方案,例如http://lwn.net/Articles/600502/。它试图引入VM_PINPED标志来固定VMA。但它没有人对它感兴趣。为什么?