File: //usr/src/nvidia-srv-580.173.02/patches/buildfix_kernel_4.9.patch
From b112968eba6e1327a9a224729ad13367db376644 Mon Sep 17 00:00:00 2001
From: Alberto Milone <alberto.milone@canonical.com>
Date: Mon, 21 Nov 2016 15:57:29 +0100
Subject: [PATCH 1/1] Add support for Linux 4.9
---
common/inc/nv-mm.h | 7 +++++++
nvidia-drm/nvidia-drm-linux.c | 4 ++++
nvidia-drm/nvidia-drm-mmap.c | 6 ++++++
nvidia/os-mlock.c | 4 ++++
5 files changed, 25 insertions(+)
diff --git a/common/inc/nv-mm.h b/common/inc/nv-mm.h
index ade903b..7cbf1cb 100644
--- a/common/inc/nv-mm.h
+++ b/common/inc/nv-mm.h
@@ -41,12 +41,19 @@
* callback.
*/
+#include <linux/version.h>
+
#if defined(NV_GET_USER_PAGES_REMOTE_PRESENT)
#define NV_GET_USER_PAGES get_user_pages
#define NV_GET_USER_PAGES_REMOTE get_user_pages_remote
#else
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
+ #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)
+#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)
+#endif
#define NV_GET_USER_PAGES_REMOTE get_user_pages
#endif
diff --git a/nvidia-drm/nvidia-drm-linux.c b/nvidia-drm/nvidia-drm-linux.c
index 82ae5c9..ee7dd69 100644
--- a/nvidia-drm/nvidia-drm-linux.c
+++ b/nvidia-drm/nvidia-drm-linux.c
@@ -137,7 +137,11 @@ int nvidia_drm_lock_user_pages(unsigned long address,
down_read(&mm->mmap_sem);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
+ pages_pinned = NV_GET_USER_PAGES(address, pages_count, write ? FOLL_WRITE :0,
+#else
pages_pinned = NV_GET_USER_PAGES(address, pages_count, write, force,
+#endif
user_pages, NULL);
up_read(&mm->mmap_sem);
diff --git a/nvidia-drm/nvidia-drm-mmap.c b/nvidia-drm/nvidia-drm-mmap.c
index 9909e69..0f525ec 100644
--- a/nvidia-drm/nvidia-drm-mmap.c
+++ b/nvidia-drm/nvidia-drm-mmap.c
@@ -20,6 +20,8 @@
* DEALINGS IN THE SOFTWARE.
*/
+#include <linux/version.h>
+
#include "conftest.h" /* NV_DRM_ATOMIC_MODESET_AVAILABLE */
#if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE)
@@ -113,7 +115,11 @@ int nvidia_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
/* Check the caller has been granted access to the buffer object */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
+ if (!drm_vma_node_is_allowed(&gem->vma_node, (struct drm_file*)filp))
+#else
if (!drm_vma_node_is_allowed(&gem->vma_node, filp))
+#endif
{
ret = -EACCES;
diff --git a/nvidia/os-mlock.c b/nvidia/os-mlock.c
index 3074f77..bb2131d 100644
--- a/nvidia/os-mlock.c
+++ b/nvidia/os-mlock.c
@@ -117,7 +117,11 @@ NV_STATUS NV_API_CALL os_lock_user_pages(
down_read(&mm->mmap_sem);
ret = NV_GET_USER_PAGES((unsigned long)address,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 9, 0)
+ page_count, write ? FOLL_WRITE : 0, user_pages, NULL);
+#else
page_count, write, force, user_pages, NULL);
+#endif
up_read(&mm->mmap_sem);
pinned = ret;
--
2.7.4