From 65c0b84376e8e0aa0854baa8b3c809a19217d6b5 Mon Sep 17 00:00:00 2001 From: Alberto Milone Date: Tue, 4 Jun 2019 19:31:22 +0200 Subject: [PATCH 1/1] Add support for Linux 5.2 Use the list_is_first, introduced by 70b44595eafe9c7c235f076d653a268ca1ab9fdb Use put_user_page, introduced by fc1d8e7cca2daa18d2fe56b94874848adf89d7f5 Add vm_fault_t type, introduced by 3d3539018d2cbd12e5af4a132636ee7fd8d43ef0 Include drm_probe_helper.h for the helper functions as per fcd70cd36b9b --- common/inc/nv-linux.h | 8 +++++++ common/inc/nv-list-helpers.h | 3 ++- conftest.sh | 30 ++++++++++++++++++++++++ nvidia-drm/nvidia-drm-connector.c | 3 +++ nvidia-drm/nvidia-drm-drv.c | 3 +++ nvidia-drm/nvidia-drm-encoder.c | 3 +++ nvidia-drm/nvidia-drm-gem-nvkms-memory.c | 13 +++++++++- nvidia-uvm/nvidia-uvm.Kbuild | 2 ++ nvidia-uvm/uvm8.c | 14 +++++++++-- nvidia-uvm/uvm8_tools.c | 2 ++ nvidia/nvidia.Kbuild | 1 + 11 files changed, 78 insertions(+), 4 deletions(-) diff --git a/kernel/common/inc/nv-linux.h b/kernel/common/inc/nv-linux.h index bf69d62..a16dd7e 100644 --- a/kernel/common/inc/nv-linux.h +++ b/kernel/common/inc/nv-linux.h @@ -1083,6 +1083,14 @@ static inline int nv_io_remap_page_range(struct vm_area_struct *vma, #define NV_PAGE_MASK (NvU64)(long)PAGE_MASK +#ifndef NV_VMF_INSERT_PFN_PRESENT +#ifdef VM_FAULT_OOM +typedef int vm_fault_t; +#else +typedef unsigned int vm_fault_t; +#endif +#endif + extern void *nvidia_stack_t_cache; // Changed in 2.6.23 via commit 20c2df83d25c6a95affe6157a4c9cac4cf5ffaac diff --git a/kernel/common/inc/nv-list-helpers.h b/kernel/common/inc/nv-list-helpers.h index 0aed851..14cfa33 100644 --- a/kernel/common/inc/nv-list-helpers.h +++ b/kernel/common/inc/nv-list-helpers.h @@ -91,10 +91,11 @@ list_entry((pos)->member.next, typeof(*(pos)), member) #endif +#if !defined(NV_LIST_IS_FIRST_PRESENT) static inline int list_is_first(const struct list_head *list, const struct list_head *head) { return list->prev == head; } - +#endif #endif // __NV_LIST_HELPERS_H__ diff --git a/kernel/conftest.sh b/kernel/conftest.sh index a285cc8..a720303 100755 --- a/kernel/conftest.sh +++ b/kernel/conftest.sh @@ -106,6 +106,8 @@ test_headers() { FILES="$FILES drm/drm_atomic_uapi.h" FILES="$FILES drm/drm_drv.h" FILES="$FILES drm/drm_framebuffer.h" + FILES="$FILES drm/drm_connector.h" + FILES="$FILES drm/drm_probe_helper.h" FILES="$FILES generated/autoconf.h" FILES="$FILES generated/compile.h" FILES="$FILES generated/utsrelease.h" @@ -424,6 +426,21 @@ compile_test() { compile_check_conftest "$CODE" "NV_SET_PAGES_UC_PRESENT" "" "functions" ;; + put_user_pages) + # + # Determine if the put_user_pages() function is present. + # It does not exist on all architectures. + # + CODE=" + #include + void conftest_put_user_pages(void) { + put_user_pages(); + }" + + compile_check_conftest "$CODE" "NV_PUT_USER_PAGES_PRESENT" "" "functions" + ;; + + outer_flush_all) # # Determine if the outer_cache_fns struct has flush_all member. @@ -1893,6 +1910,19 @@ compile_test() { compile_check_conftest "$CODE" "NV_LIST_CUT_POSITION_PRESENT" "" "functions" ;; + list_is_first) + # + # Determine if the list_is_first() function is present. + # + CODE=" + #include + void conftest_list_is_first(void) { + list_is_first(); + }" + + compile_check_conftest "$CODE" "NV_LIST_IS_FIRST_PRESENT" "" "functions" + ;; + file_inode) # # Determine if the 'file' structure has diff --git a/kernel/nvidia-drm/nvidia-drm-connector.c b/kernel/nvidia-drm/nvidia-drm-connector.c index 24631c0..813cc08 100644 --- a/kernel/nvidia-drm/nvidia-drm-connector.c +++ b/kernel/nvidia-drm/nvidia-drm-connector.c @@ -30,6 +30,9 @@ #include "nvidia-drm-utils.h" #include "nvidia-drm-encoder.h" +#if defined(NV_DRM_DRM_PROBE_HELPER_H_PRESENT) +#include +#endif #include #include diff --git a/kernel/nvidia-drm/nvidia-drm-drv.c b/kernel/nvidia-drm/nvidia-drm-drv.c index 1c2db68..2a15fb2 100644 --- a/kernel/nvidia-drm/nvidia-drm-drv.c +++ b/kernel/nvidia-drm/nvidia-drm-drv.c @@ -41,6 +41,9 @@ #include +#if defined(NV_DRM_DRM_PROBE_HELPER_H_PRESENT) +#include +#endif #include #if defined(NV_DRM_DRM_GEM_H_PRESENT) diff --git a/kernel/nvidia-drm/nvidia-drm-encoder.c b/kernel/nvidia-drm/nvidia-drm-encoder.c index f66bbd7..e40716a 100644 --- a/kernel/nvidia-drm/nvidia-drm-encoder.c +++ b/kernel/nvidia-drm/nvidia-drm-encoder.c @@ -31,6 +31,9 @@ #include "nvidia-drm-crtc.h" #include "nvidia-drm-helper.h" +#if defined(NV_DRM_DRM_PROBE_HELPER_H_PRESENT) +#include +#endif #include #include diff --git a/kernel/nvidia-drm/nvidia-drm-gem-nvkms-memory.c b/kernel/nvidia-drm/nvidia-drm-gem-nvkms-memory.c index 8636eff..c0a44cd 100644 --- a/kernel/nvidia-drm/nvidia-drm-gem-nvkms-memory.c +++ b/kernel/nvidia-drm/nvidia-drm-gem-nvkms-memory.c @@ -221,8 +221,11 @@ done: } /* XXX Move these vma operations to os layer */ - +#ifdef VM_FAULT_OOM static int __nv_drm_vma_fault(struct vm_area_struct *vma, +#else +static unsigned int __nv_drm_vma_fault(struct vm_area_struct *vma, +#endif struct vm_fault *vmf) { unsigned long address = nv_page_fault_va(vmf); @@ -268,12 +271,20 @@ static int __nv_drm_vma_fault(struct vm_area_struct *vma, */ #if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) +#ifdef VM_FAULT_OOM static int nv_drm_vma_fault(struct vm_fault *vmf) +#else +static unsigned int nv_drm_vma_fault(struct vm_fault *vmf) +#endif { return __nv_drm_vma_fault(vmf->vma, vmf); } #else +#ifdef VM_FAULT_OOM static int nv_drm_vma_fault(struct vm_area_struct *vma, +#else +static unsigned int nv_drm_vma_fault(struct vm_area_struct *vma, +#endif struct vm_fault *vmf) { return __nv_drm_vma_fault(vma, vmf); diff --git a/kernel/nvidia-uvm/nvidia-uvm.Kbuild b/kernel/nvidia-uvm/nvidia-uvm.Kbuild index 5eb1d40..4d38d95 100644 --- a/kernel/nvidia-uvm/nvidia-uvm.Kbuild +++ b/kernel/nvidia-uvm/nvidia-uvm.Kbuild @@ -99,6 +99,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += address_space_init_once NV_CONFTEST_FUNCTION_COMPILE_TESTS += kbasename NV_CONFTEST_FUNCTION_COMPILE_TESTS += fatal_signal_pending NV_CONFTEST_FUNCTION_COMPILE_TESTS += list_cut_position +NV_CONFTEST_FUNCTION_COMPILE_TESTS += list_is_first NV_CONFTEST_FUNCTION_COMPILE_TESTS += vzalloc NV_CONFTEST_FUNCTION_COMPILE_TESTS += wait_on_bit_lock_argument_count NV_CONFTEST_FUNCTION_COMPILE_TESTS += proc_create_data @@ -109,6 +110,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += usleep_range NV_CONFTEST_FUNCTION_COMPILE_TESTS += radix_tree_empty NV_CONFTEST_FUNCTION_COMPILE_TESTS += radix_tree_replace_slot NV_CONFTEST_FUNCTION_COMPILE_TESTS += do_gettimeofday +NV_CONFTEST_FUNCTION_COMPILE_TESTS += put_user_pages NV_CONFTEST_TYPE_COMPILE_TESTS += proc_dir_entry NV_CONFTEST_TYPE_COMPILE_TESTS += irq_handler_t diff --git a/kernel/nvidia-uvm/uvm8.c b/kernel/nvidia-uvm/uvm8.c index e00923d..d8cec38 100644 --- a/kernel/nvidia-uvm/uvm8.c +++ b/kernel/nvidia-uvm/uvm8.c @@ -172,7 +172,11 @@ static int uvm_vm_fault_sigbus(struct vm_area_struct *vma, struct vm_fault *vmf) return VM_FAULT_SIGBUS; } +#ifdef VM_FAULT_OOM static int uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf) +#else +static unsigned int uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf) +#endif { #if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) return uvm_vm_fault_sigbus(vmf->vma, vmf); @@ -389,8 +393,11 @@ static void uvm_vm_close_managed(struct vm_area_struct *vma) if (current->mm != NULL) uvm_record_unlock_mmap_sem_write(¤t->mm->mmap_sem); } - +#ifdef VM_FAULT_OOM static int uvm_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) +#else +static unsigned int uvm_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) +#endif { uvm_va_space_t *va_space = uvm_va_space_get(vma->vm_file); uvm_va_block_t *va_block; @@ -506,8 +513,11 @@ convert_error: return VM_FAULT_SIGBUS; } } - +#ifdef VM_FAULT_OOM static int uvm_vm_fault_wrapper(struct vm_fault *vmf) +#else +static unsigned int uvm_vm_fault_wrapper(struct vm_fault *vmf) +#endif { #if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) return uvm_vm_fault(vmf->vma, vmf); diff --git a/kernel/nvidia-uvm/uvm8_tools.c b/kernel/nvidia-uvm/uvm8_tools.c index 521c57b..3bf815c 100644 --- a/kernel/nvidia-uvm/uvm8_tools.c +++ b/kernel/nvidia-uvm/uvm8_tools.c @@ -204,12 +204,14 @@ static bool tracker_is_counter(uvm_tools_event_tracker_t *event_tracker) return event_tracker != NULL && !event_tracker->is_queue; } +#ifndef NV_PUT_USER_PAGES_PRESENT static void put_user_pages(struct page **pages, NvU64 page_count) { NvU64 i; for (i = 0; i < page_count; i++) put_page(pages[i]); } +#endif static void unmap_user_pages(struct page **pages, void *addr, NvU64 size) { diff --git a/kernel/nvidia//nvidia.Kbuild b/kernel/nvidia/nvidia.Kbuild index acc9eba..138321a 100644 --- a/kernel/nvidia/nvidia.Kbuild +++ b/kernel/nvidia/nvidia.Kbuild @@ -191,5 +191,6 @@ NV_CONFTEST_GENERIC_COMPILE_TESTS += nvidia_grid_build NV_CONFTEST_GENERIC_COMPILE_TESTS += get_user_pages NV_CONFTEST_GENERIC_COMPILE_TESTS += get_user_pages_remote NV_CONFTEST_GENERIC_COMPILE_TESTS += list_cut_position +NV_CONFTEST_GENERIC_COMPILE_TESTS += list_is_first NV_CONFTEST_MACRO_COMPILE_TESTS += INIT_WORK -- 2.20.1