-
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/include/linux/mm.h?id=768ae309a96103ed02eb1e111e838c87854d8b51 - This commit replaces get_user_pages() write/force parameters with gup_flags, but nvidia driver uses old parameters. That causes a lot of build errors.
-
Build fails with error in nvidia-drm-mmap.c caused by filp type in drm_vma_node_is_allowed (drm_file is expected, but file is used). I don’t know what commit in kernel is causing an error (maybe https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/include/drm/drm_vma_manager.h?id=d9a1f0b4eb6080dc42bb6373ab9abb0314cea41e?).
I’ve made patch to fix those two issues:
# Issue №1
diff -Naur kernel/common/inc/nv-mm.h b/kernel/common/inc/nv-mm.h
--- kernel/common/inc/nv-mm.h 2016-10-22 13:42:48.220791689 +0300
+++ b/kernel/common/inc/nv-mm.h 2016-10-22 13:51:23.906406480 +0300
@@ -45,8 +45,8 @@
#define NV_GET_USER_PAGES get_user_pages
#define NV_GET_USER_PAGES_REMOTE get_user_pages_remote
#else
- #define NV_GET_USER_PAGES(start, nr_pages, write, force, pages, vmas) \
- get_user_pages(current, current->mm, start, nr_pages, write, force, pages, vmas)
+ #define NV_GET_USER_PAGES(start, nr_pages, gup_flags, pages, vmas) \
+ get_user_pages(current, current->mm, start, nr_pages, gup_flags, pages, vmas)
#define NV_GET_USER_PAGES_REMOTE get_user_pages
#endif
diff -Naur kernel/nvidia/os-mlock.c b/kernel/nvidia/os-mlock.c
--- kernel/nvidia/os-mlock.c 2016-10-22 13:42:48.222791633 +0300
+++ b/kernel/nvidia/os-mlock.c 2016-10-22 13:51:23.908406424 +0300
@@ -117,7 +117,7 @@
down_read(&mm->mmap_sem);
ret = NV_GET_USER_PAGES((unsigned long)address,
- page_count, write, force, user_pages, NULL);
+ page_count, write ? FOLL_WRITE : 0, user_pages, NULL);
up_read(&mm->mmap_sem);
pinned = ret;
diff -Naur kernel/nvidia-drm/nvidia-drm-linux.c b/kernel/nvidia-drm/nvidia-drm-linux.c
--- kernel/nvidia-drm/nvidia-drm-linux.c 2016-10-22 13:42:48.243791048 +0300
+++ b/kernel/nvidia-drm/nvidia-drm-linux.c 2016-10-22 13:51:23.931405780 +0300
@@ -137,7 +137,7 @@
down_read(&mm->mmap_sem);
- pages_pinned = NV_GET_USER_PAGES(address, pages_count, write, force,
+ pages_pinned = NV_GET_USER_PAGES(address, pages_count, write ? FOLL_WRITE :0,
user_pages, NULL);
up_read(&mm->mmap_sem);
diff -Naur kernel/nvidia-uvm/uvm8_tools.c b/kernel/nvidia-uvm/uvm8_tools.c
--- kernel/nvidia-uvm/uvm8_tools.c 2016-10-22 13:42:48.251790826 +0300
+++ b/kernel/nvidia-uvm/uvm8_tools.c 2016-10-22 13:51:23.938405584 +0300
@@ -224,7 +224,7 @@
}
down_read(¤t->mm->mmap_sem);
- ret = NV_GET_USER_PAGES(user_va, num_pages, 1, 0, *pages, vmas);
+ ret = NV_GET_USER_PAGES(user_va, num_pages, 1 ? FOLL_WRITE : 0, *pages, vmas);
up_read(¤t->mm->mmap_sem);
if (ret != num_pages) {
status = NV_ERR_INVALID_ARGUMENT;
# Issue №2
diff -Naur kernel/nvidia-drm/nvidia-drm-mmap.c b/kernel/nvidia-drm/nvidia-drm-mmap.c
--- kernel/nvidia-drm/nvidia-drm-mmap.c 2016-10-22 13:42:48.243791048 +0300
+++ b/kernel/nvidia-drm/nvidia-drm-mmap.c 2016-10-22 13:51:23.931405780 +0300
@@ -113,7 +113,7 @@
/* Check the caller has been granted access to the buffer object */
- if (!drm_vma_node_is_allowed(&gem->vma_node, filp))
+ if (!drm_vma_node_is_allowed(&gem->vma_node, (struct drm_file*)filp))
{
ret = -EACCES;
I can confirm that patched 375.10 driver works like a charm on my Fedora 25 with 4.9.0-0.rc1.git3.2 kernel.