Line
Link Here
|
0 |
-- a/kernel/common/inc/nv-linux.h |
0 |
++ b/kernel/common/inc/nv-linux.h |
Lines 1082-1087
Link Here
|
1082 |
|
1082 |
|
1083 |
#define NV_PAGE_MASK (NvU64)(long)PAGE_MASK |
1083 |
#define NV_PAGE_MASK (NvU64)(long)PAGE_MASK |
1084 |
|
1084 |
|
|
|
1085 |
#ifndef NV_VMF_INSERT_PFN_PRESENT |
1086 |
typedef int vm_fault_t; |
1087 |
#endif |
1088 |
|
1085 |
extern void *nvidia_stack_t_cache; |
1089 |
extern void *nvidia_stack_t_cache; |
1086 |
|
1090 |
|
1087 |
// Changed in 2.6.23 via commit 20c2df83d25c6a95affe6157a4c9cac4cf5ffaac |
1091 |
// Changed in 2.6.23 via commit 20c2df83d25c6a95affe6157a4c9cac4cf5ffaac |
1088 |
-- a/kernel/common/inc/nv-list-helpers.h |
1092 |
++ b/kernel/common/inc/nv-list-helpers.h |
Lines 91-100
Link Here
|
91 |
list_entry((pos)->member.next, typeof(*(pos)), member) |
91 |
list_entry((pos)->member.next, typeof(*(pos)), member) |
92 |
#endif |
92 |
#endif |
93 |
|
93 |
|
94 |
static inline int list_is_first(const struct list_head *list, |
94 |
#if !defined(NV_LIST_IS_FIRST_PRESENT) |
95 |
const struct list_head *head) |
95 |
static inline int list_is_first(const struct list_head *list, |
96 |
{ |
96 |
const struct list_head *head) |
97 |
return list->prev == head; |
97 |
{ |
98 |
} |
98 |
return list->prev == head; |
|
|
99 |
} |
100 |
#endif |
99 |
|
101 |
|
100 |
#endif // __NV_LIST_HELPERS_H__ |
102 |
#endif // __NV_LIST_HELPERS_H__ |
101 |
-- a/kernel/conftest.sh |
103 |
++ b/kernel/conftest.sh |
Lines 106-111
Link Here
|
106 |
FILES="$FILES drm/drm_atomic_uapi.h" |
106 |
FILES="$FILES drm/drm_atomic_uapi.h" |
107 |
FILES="$FILES drm/drm_drv.h" |
107 |
FILES="$FILES drm/drm_drv.h" |
108 |
FILES="$FILES drm/drm_framebuffer.h" |
108 |
FILES="$FILES drm/drm_framebuffer.h" |
|
|
109 |
FILES="$FILES drm/drm_probe_helper.h" |
109 |
FILES="$FILES generated/autoconf.h" |
110 |
FILES="$FILES generated/autoconf.h" |
110 |
FILES="$FILES generated/compile.h" |
111 |
FILES="$FILES generated/compile.h" |
111 |
FILES="$FILES generated/utsrelease.h" |
112 |
FILES="$FILES generated/utsrelease.h" |
Lines 407-412
Link Here
|
407 |
compile_check_conftest "$CODE" "NV_SET_MEMORY_ARRAY_UC_PRESENT" "" "functions" |
408 |
compile_check_conftest "$CODE" "NV_SET_MEMORY_ARRAY_UC_PRESENT" "" "functions" |
408 |
;; |
409 |
;; |
409 |
|
410 |
|
|
|
411 |
list_is_first) |
412 |
# |
413 |
# Determine if the list_is_first() function is present. |
414 |
# |
415 |
# Added by commit 0d29c2d43753 ("mm, compaction: Use free lists to quickly |
416 |
# locate a migration source -fix") in linux-next tree |
417 |
# |
418 |
CODE=" |
419 |
#include <linux/list.h> |
420 |
void conftest_list_is_first(void) { |
421 |
list_is_first(); |
422 |
}" |
423 |
|
424 |
compile_check_conftest "$CODE" "NV_LIST_IS_FIRST_PRESENT" "" "functions" |
425 |
;; |
426 |
|
410 |
set_pages_uc) |
427 |
set_pages_uc) |
411 |
# |
428 |
# |
412 |
# Determine if the set_pages_uc() function is present. |
429 |
# Determine if the set_pages_uc() function is present. |
413 |
-- a/kernel/nvidia/nvidia.Kbuild |
430 |
++ b/kernel/nvidia/nvidia.Kbuild |
Lines 102-107
Link Here
|
102 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += follow_pfn |
102 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += follow_pfn |
103 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += vmap |
103 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += vmap |
104 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_pages_uc |
104 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_pages_uc |
|
|
105 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += list_is_first |
105 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_memory_uc |
106 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_memory_uc |
106 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_memory_array_uc |
107 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += set_memory_array_uc |
107 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += change_page_attr |
108 |
NV_CONFTEST_FUNCTION_COMPILE_TESTS += change_page_attr |
108 |
-- a/kernel/nvidia-drm/nvidia-drm-connector.c |
109 |
++ b/kernel/nvidia-drm/nvidia-drm-connector.c |
Lines 30-35
Link Here
|
30 |
#include "nvidia-drm-utils.h" |
30 |
#include "nvidia-drm-utils.h" |
31 |
#include "nvidia-drm-encoder.h" |
31 |
#include "nvidia-drm-encoder.h" |
32 |
|
32 |
|
|
|
33 |
/* |
34 |
* Commit fcd70cd36b9b ("drm: Split out drm_probe_helper.h") |
35 |
* moves a number of helper function definitions from |
36 |
* drm/drm_crtc_helper.h to a new drm_probe_helper.h. |
37 |
*/ |
38 |
#if defined(NV_DRM_DRM_PROBE_HELPER_H_PRESENT) |
39 |
#include <drm/drm_probe_helper.h> |
40 |
#endif |
33 |
#include <drm/drm_crtc_helper.h> |
41 |
#include <drm/drm_crtc_helper.h> |
34 |
|
42 |
|
35 |
#include <drm/drm_atomic.h> |
43 |
#include <drm/drm_atomic.h> |
36 |
-- a/kernel/nvidia-drm/nvidia-drm-drv.c |
44 |
++ b/kernel/nvidia-drm/nvidia-drm-drv.c |
Lines 41-46
Link Here
|
41 |
|
41 |
|
42 |
#include <drm/drmP.h> |
42 |
#include <drm/drmP.h> |
43 |
|
43 |
|
|
|
44 |
/* |
45 |
* Commit fcd70cd36b9b ("drm: Split out drm_probe_helper.h") |
46 |
* moves a number of helper function definitions from |
47 |
* drm/drm_crtc_helper.h to a new drm_probe_helper.h. |
48 |
*/ |
49 |
#if defined(NV_DRM_DRM_PROBE_HELPER_H_PRESENT) |
50 |
#include <drm/drm_probe_helper.h> |
51 |
#endif |
44 |
#include <drm/drm_crtc_helper.h> |
52 |
#include <drm/drm_crtc_helper.h> |
45 |
|
53 |
|
46 |
#if defined(NV_DRM_DRM_GEM_H_PRESENT) |
54 |
#if defined(NV_DRM_DRM_GEM_H_PRESENT) |
47 |
-- a/kernel/nvidia-drm/nvidia-drm-encoder.c |
55 |
++ b/kernel/nvidia-drm/nvidia-drm-encoder.c |
Lines 31-36
Link Here
|
31 |
#include "nvidia-drm-crtc.h" |
31 |
#include "nvidia-drm-crtc.h" |
32 |
#include "nvidia-drm-helper.h" |
32 |
#include "nvidia-drm-helper.h" |
33 |
|
33 |
|
|
|
34 |
/* |
35 |
* Commit fcd70cd36b9b ("drm: Split out drm_probe_helper.h") |
36 |
* moves a number of helper function definitions from |
37 |
* drm/drm_crtc_helper.h to a new drm_probe_helper.h. |
38 |
*/ |
39 |
#if defined(NV_DRM_DRM_PROBE_HELPER_H_PRESENT) |
40 |
#include <drm/drm_probe_helper.h> |
41 |
#endif |
34 |
#include <drm/drm_crtc_helper.h> |
42 |
#include <drm/drm_crtc_helper.h> |
35 |
|
43 |
|
36 |
#include <drm/drm_atomic.h> |
44 |
#include <drm/drm_atomic.h> |
37 |
-- a/kernel/nvidia-drm/nvidia-drm-gem-nvkms-memory.c |
45 |
++ b/kernel/nvidia-drm/nvidia-drm-gem-nvkms-memory.c |
Lines 24-29
Link Here
|
24 |
|
24 |
|
25 |
#if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) |
25 |
#if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) |
26 |
|
26 |
|
|
|
27 |
#include "nv-linux.h" |
27 |
#include "nvidia-drm-gem-nvkms-memory.h" |
28 |
#include "nvidia-drm-gem-nvkms-memory.h" |
28 |
#include "nvidia-drm-ioctl.h" |
29 |
#include "nvidia-drm-ioctl.h" |
29 |
|
30 |
|
Lines 222-228
Link Here
|
222 |
|
223 |
|
223 |
/* XXX Move these vma operations to os layer */ |
224 |
/* XXX Move these vma operations to os layer */ |
224 |
|
225 |
|
225 |
static int __nv_drm_vma_fault(struct vm_area_struct *vma, |
226 |
static vm_fault_t __nv_drm_vma_fault(struct vm_area_struct *vma, |
226 |
struct vm_fault *vmf) |
227 |
struct vm_fault *vmf) |
227 |
{ |
228 |
{ |
228 |
unsigned long address = nv_page_fault_va(vmf); |
229 |
unsigned long address = nv_page_fault_va(vmf); |
Lines 230-236
Link Here
|
230 |
struct nv_drm_gem_nvkms_memory *nv_nvkms_memory = to_nv_nvkms_memory( |
231 |
struct nv_drm_gem_nvkms_memory *nv_nvkms_memory = to_nv_nvkms_memory( |
231 |
to_nv_gem_object(gem)); |
232 |
to_nv_gem_object(gem)); |
232 |
unsigned long page_offset, pfn; |
233 |
unsigned long page_offset, pfn; |
233 |
int ret = -EINVAL; |
234 |
vm_fault_t ret; |
234 |
|
235 |
|
235 |
pfn = (unsigned long)(uintptr_t)nv_nvkms_memory->pPhysicalAddress; |
236 |
pfn = (unsigned long)(uintptr_t)nv_nvkms_memory->pPhysicalAddress; |
236 |
pfn >>= PAGE_SHIFT; |
237 |
pfn >>= PAGE_SHIFT; |
Lines 238-245
Link Here
|
238 |
page_offset = vmf->pgoff - drm_vma_node_start(&gem->vma_node); |
239 |
page_offset = vmf->pgoff - drm_vma_node_start(&gem->vma_node); |
239 |
|
240 |
|
240 |
#if defined(NV_VMF_INSERT_PFN_PRESENT) |
241 |
#if defined(NV_VMF_INSERT_PFN_PRESENT) |
241 |
(void)ret; |
242 |
ret = vmf_insert_pfn(vma, address, pfn + page_offset); |
242 |
return vmf_insert_pfn(vma, address, pfn + page_offset); |
|
|
243 |
#else |
243 |
#else |
244 |
ret = vm_insert_pfn(vma, address, pfn + page_offset); |
244 |
ret = vm_insert_pfn(vma, address, pfn + page_offset); |
245 |
|
245 |
|
Lines 250-265
Link Here
|
250 |
* EBUSY indicates that another thread already handled |
250 |
* EBUSY indicates that another thread already handled |
251 |
* the faulted range. |
251 |
* the faulted range. |
252 |
*/ |
252 |
*/ |
253 |
return VM_FAULT_NOPAGE; |
253 |
ret = VM_FAULT_NOPAGE; |
|
|
254 |
break; |
254 |
case -ENOMEM: |
255 |
case -ENOMEM: |
255 |
return VM_FAULT_OOM; |
256 |
ret = VM_FAULT_OOM; |
|
|
257 |
break; |
256 |
default: |
258 |
default: |
257 |
WARN_ONCE(1, "Unhandled error in %s: %d\n", __FUNCTION__, ret); |
259 |
WARN_ONCE(1, "Unhandled error in %s: %d\n", __FUNCTION__, ret); |
|
|
260 |
ret = VM_FAULT_SIGBUS; |
258 |
break; |
261 |
break; |
259 |
} |
262 |
} |
260 |
|
|
|
261 |
return VM_FAULT_SIGBUS; |
262 |
#endif |
263 |
#endif |
|
|
264 |
return ret; |
263 |
} |
265 |
} |
264 |
|
266 |
|
265 |
/* |
267 |
/* |
Lines 268-279
Link Here
|
268 |
*/ |
270 |
*/ |
269 |
|
271 |
|
270 |
#if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) |
272 |
#if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) |
271 |
static int nv_drm_vma_fault(struct vm_fault *vmf) |
273 |
static vm_fault_t nv_drm_vma_fault(struct vm_fault *vmf) |
272 |
{ |
274 |
{ |
273 |
return __nv_drm_vma_fault(vmf->vma, vmf); |
275 |
return __nv_drm_vma_fault(vmf->vma, vmf); |
274 |
} |
276 |
} |
275 |
#else |
277 |
#else |
276 |
static int nv_drm_vma_fault(struct vm_area_struct *vma, |
278 |
static vm_fault_t nv_drm_vma_fault(struct vm_area_struct *vma, |
277 |
struct vm_fault *vmf) |
279 |
struct vm_fault *vmf) |
278 |
{ |
280 |
{ |
279 |
return __nv_drm_vma_fault(vma, vmf); |
281 |
return __nv_drm_vma_fault(vma, vmf); |
280 |
-- a/kernel/nvidia-uvm/uvm8.c |
282 |
++ b/kernel/nvidia-uvm/uvm8.c |
Lines 166-178
Link Here
|
166 |
// If a fault handler is not set, paths like handle_pte_fault in older kernels |
166 |
// If a fault handler is not set, paths like handle_pte_fault in older kernels |
167 |
// assume the memory is anonymous. That would make debugging this failure harder |
167 |
// assume the memory is anonymous. That would make debugging this failure harder |
168 |
// so we force it to fail instead. |
168 |
// so we force it to fail instead. |
169 |
static int uvm_vm_fault_sigbus(struct vm_area_struct *vma, struct vm_fault *vmf) |
169 |
static vm_fault_t uvm_vm_fault_sigbus(struct vm_area_struct *vma, struct vm_fault *vmf) |
170 |
{ |
170 |
{ |
171 |
UVM_DBG_PRINT_RL("Fault to address 0x%lx in disabled vma\n", nv_page_fault_va(vmf)); |
171 |
UVM_DBG_PRINT_RL("Fault to address 0x%lx in disabled vma\n", nv_page_fault_va(vmf)); |
172 |
return VM_FAULT_SIGBUS; |
172 |
return VM_FAULT_SIGBUS; |
173 |
} |
173 |
} |
174 |
|
174 |
|
175 |
static int uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf) |
175 |
static vm_fault_t uvm_vm_fault_sigbus_wrapper(struct vm_fault *vmf) |
176 |
{ |
176 |
{ |
177 |
#if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) |
177 |
#if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) |
178 |
return uvm_vm_fault_sigbus(vmf->vma, vmf); |
178 |
return uvm_vm_fault_sigbus(vmf->vma, vmf); |
Lines 390-396
Link Here
|
390 |
uvm_record_unlock_mmap_sem_write(¤t->mm->mmap_sem); |
390 |
uvm_record_unlock_mmap_sem_write(¤t->mm->mmap_sem); |
391 |
} |
391 |
} |
392 |
|
392 |
|
393 |
static int uvm_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
393 |
static vm_fault_t uvm_vm_fault(struct vm_area_struct *vma, struct vm_fault *vmf) |
394 |
{ |
394 |
{ |
395 |
uvm_va_space_t *va_space = uvm_va_space_get(vma->vm_file); |
395 |
uvm_va_space_t *va_space = uvm_va_space_get(vma->vm_file); |
396 |
uvm_va_block_t *va_block; |
396 |
uvm_va_block_t *va_block; |
Lines 507-513
Link Here
|
507 |
} |
507 |
} |
508 |
} |
508 |
} |
509 |
|
509 |
|
510 |
static int uvm_vm_fault_wrapper(struct vm_fault *vmf) |
510 |
static vm_fault_t uvm_vm_fault_wrapper(struct vm_fault *vmf) |
511 |
{ |
511 |
{ |
512 |
#if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) |
512 |
#if defined(NV_VM_OPS_FAULT_REMOVED_VMA_ARG) |
513 |
return uvm_vm_fault(vmf->vma, vmf); |
513 |
return uvm_vm_fault(vmf->vma, vmf); |