Go to:
Gentoo Home
Documentation
Forums
Lists
Bugs
Planet
Store
Wiki
Get Gentoo!
Gentoo's Bugzilla – Attachment 445558 Details for
Bug 593624
x11-drivers/nvidia-drivers-370.28 has an outdated pax_kernel patch
Home
|
New
–
[Ex]
|
Browse
|
Search
|
Privacy Policy
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Example pax patch for nvidia-drivers-370.28 v2
nvidia-drivers-370.28-pax.patch (text/plain), 15.29 KB, created by
Romain Bezut
on 2016-09-13 01:11:46 UTC
(
hide
)
Description:
Example pax patch for nvidia-drivers-370.28 v2
Filename:
MIME Type:
Creator:
Romain Bezut
Created:
2016-09-13 01:11:46 UTC
Size:
15.29 KB
patch
obsolete
>diff -urp work.orig/kernel/common/inc/nv-linux.h work/kernel/common/inc/nv-linux.h >--- work.orig/kernel/common/inc/nv-linux.h 2016-09-02 03:32:09.000000000 +0200 >+++ work/kernel/common/inc/nv-linux.h 2016-09-12 21:18:48.100329700 +0200 >@@ -1312,6 +1312,9 @@ extern void *nvidia_stack_t_cache; > #define NV_KMEM_CACHE_CREATE(name, type) \ > NV_KMEM_CACHE_CREATE_FULL(name, sizeof(type), 0, 0, NULL) > >+#define NV_KMEM_CACHE_CREATE_USERCOPY(name, type) \ >+ NV_KMEM_CACHE_CREATE_FULL(name, sizeof(type), 0, SLAB_USERCOPY, NULL) >+ > #define NV_KMEM_CACHE_DESTROY(kmem_cache) \ > kmem_cache_destroy(kmem_cache) > >diff -urp work.orig/kernel/common/inc/nv-modeset-interface.h work/kernel/common/inc/nv-modeset-interface.h >--- work.orig/kernel/common/inc/nv-modeset-interface.h 2016-09-02 03:32:09.000000000 +0200 >+++ work/kernel/common/inc/nv-modeset-interface.h 2016-09-13 01:57:32.351888874 +0200 >@@ -72,7 +72,7 @@ typedef struct { > * mix nvidia and nvidia-modeset kernel modules from different > * releases. > */ >- const char *version_string; >+ // const char *version_string; > > /* > * Return system information. >@@ -117,6 +117,6 @@ typedef struct { > > } nvidia_modeset_rm_ops_t; > >-NV_STATUS nvidia_get_rm_ops(nvidia_modeset_rm_ops_t *rm_ops); >+NV_STATUS nvidia_get_rm_ops(const nvidia_modeset_rm_ops_t **rm_ops, const char **version_string); > > #endif /* _NV_MODESET_INTERFACE_H_ */ >diff -urp work.orig/kernel/common/inc/nv-register-module.h work/kernel/common/inc/nv-register-module.h >--- work.orig/kernel/common/inc/nv-register-module.h 2016-09-02 03:32:09.000000000 +0200 >+++ work/kernel/common/inc/nv-register-module.h 2016-09-12 21:17:30.880331735 +0200 >@@ -34,7 +34,7 @@ typedef struct nvidia_module_s { > int (*ioctl)(struct inode *, struct file * file, unsigned int cmd, unsigned long arg); > unsigned int (*poll)(struct file * file, poll_table *wait); > >-} nvidia_module_t; >+} __do_const nvidia_module_t; > > int nvidia_register_module(nvidia_module_t *); > int nvidia_unregister_module(nvidia_module_t *); >diff -urp work.orig/kernel/nvidia/nv.c work/kernel/nvidia/nv.c >--- work.orig/kernel/nvidia/nv.c 2016-09-02 03:32:09.000000000 +0200 >+++ work/kernel/nvidia/nv.c 2016-09-12 21:19:25.868328704 +0200 >@@ -660,8 +660,8 @@ int __init nvidia_init_module(void) > NV_SPIN_LOCK_INIT(&km_lock); > #endif > >- nvidia_stack_t_cache = NV_KMEM_CACHE_CREATE(nvidia_stack_cache_name, >- nvidia_stack_t); >+ nvidia_stack_t_cache = NV_KMEM_CACHE_CREATE_USERCOPY(nvidia_stack_cache_name, >+ nvidia_stack_t); > if (nvidia_stack_t_cache == NULL) > { > nv_printf(NV_DBG_ERRORS, "NVRM: stack cache allocation failed!\n"); >diff -urp work.orig/kernel/nvidia/nv-chrdev.c work/kernel/nvidia/nv-chrdev.c >--- work.orig/kernel/nvidia/nv-chrdev.c 2016-09-02 03:32:09.000000000 +0200 >+++ work/kernel/nvidia/nv-chrdev.c 2016-09-12 21:17:03.204332465 +0200 >@@ -20,8 +20,6 @@ int nv_register_chrdev(void *param) > { > nvidia_module_t *module = (nvidia_module_t *)param; > >- module->instance = nv_module_instance; >- > return (nvidia_register_module(module)); > } > >diff -urp work.orig/kernel/nvidia/nv-instance.c work/kernel/nvidia/nv-instance.c >--- work.orig/kernel/nvidia/nv-instance.c 2016-09-02 03:32:09.000000000 +0200 >+++ work/kernel/nvidia/nv-instance.c 2016-09-12 21:16:42.268333017 +0200 >@@ -51,6 +51,7 @@ struct pci_driver nv_pci_driver = { > nvidia_module_t nv_fops = { > .owner = THIS_MODULE, > .module_name = MODULE_NAME, >+ .instance = MODULE_INSTANCE_NUMBER, > .open = nvidia_open, > .close = nvidia_close, > .ioctl = nvidia_ioctl, >diff -urp work.orig/kernel/nvidia/nv-mmap.c work/kernel/nvidia/nv-mmap.c >--- work.orig/kernel/nvidia/nv-mmap.c 2016-09-02 03:32:09.000000000 +0200 >+++ work/kernel/nvidia/nv-mmap.c 2016-09-13 02:18:54.459855079 +0200 >@@ -113,12 +113,12 @@ nvidia_vma_release(struct vm_area_struct > } > > #if defined(NV_VM_OPERATIONS_STRUCT_HAS_ACCESS) >-static int >+static ssize_t > nvidia_vma_access( > struct vm_area_struct *vma, > unsigned long addr, > void *buffer, >- int length, >+ size_t length, > int write > ) > { >diff -urp work.orig/kernel/nvidia/nv-modeset-interface.c work/kernel/nvidia/nv-modeset-interface.c >--- work.orig/kernel/nvidia/nv-modeset-interface.c 2016-09-02 03:32:09.000000000 +0200 >+++ work/kernel/nvidia/nv-modeset-interface.c 2016-09-13 02:01:46.519882174 +0200 >@@ -100,10 +100,9 @@ static NvU32 nvidia_modeset_enumerate_gp > return count; > } > >-NV_STATUS nvidia_get_rm_ops(nvidia_modeset_rm_ops_t *rm_ops) >+NV_STATUS nvidia_get_rm_ops(const nvidia_modeset_rm_ops_t **rm_ops, const char **version_string) > { >- const nvidia_modeset_rm_ops_t local_rm_ops = { >- .version_string = NV_VERSION_STRING, >+ static nvidia_modeset_rm_ops_t local_rm_ops = { > .system_info = { > .allow_write_combining = NV_FALSE, > }, >@@ -116,16 +115,16 @@ NV_STATUS nvidia_get_rm_ops(nvidia_modes > .set_callbacks = nvidia_modeset_set_callbacks, > }; > >- if (strcmp(rm_ops->version_string, NV_VERSION_STRING) != 0) >+ if (strcmp(*version_string, NV_VERSION_STRING) != 0) > { >- rm_ops->version_string = NV_VERSION_STRING; >+ *version_string = NV_VERSION_STRING; > return NV_ERR_GENERIC; > } > >- *rm_ops = local_rm_ops; >+ *rm_ops = (const nvidia_modeset_rm_ops_t *) &local_rm_ops; > > if (NV_ALLOW_WRITE_COMBINING(NV_MEMORY_TYPE_FRAMEBUFFER)) { >- rm_ops->system_info.allow_write_combining = NV_TRUE; >+ local_rm_ops.system_info.allow_write_combining = NV_TRUE; > } > > return NV_OK; >diff -urp work.orig/kernel/nvidia-drm/nvidia-drm-drv.c work/kernel/nvidia-drm/nvidia-drm-drv.c >--- work.orig/kernel/nvidia-drm/nvidia-drm-drv.c 2016-09-02 03:33:06.000000000 +0200 >+++ work/kernel/nvidia-drm/nvidia-drm-drv.c 2016-09-12 21:23:12.280322736 +0200 >@@ -612,7 +612,7 @@ static const struct drm_ioctl_desc nv_dr > DRM_CONTROL_ALLOW|DRM_RENDER_ALLOW|DRM_UNLOCKED), > }; > >-static struct drm_driver nv_drm_driver = { >+static drm_driver_no_const nv_drm_driver __read_only = { > > .driver_features = DRIVER_GEM | DRIVER_PRIME | DRIVER_RENDER, > >@@ -673,6 +673,7 @@ static void nvidia_update_drm_driver_fea > return; > } > >+ pax_open_kernel(); > nv_drm_driver.driver_features |= DRIVER_MODESET | DRIVER_ATOMIC; > > nv_drm_driver.master_set = nvidia_drm_master_set; >@@ -681,6 +682,7 @@ static void nvidia_update_drm_driver_fea > nv_drm_driver.dumb_create = nvidia_drm_dumb_create; > nv_drm_driver.dumb_map_offset = nvidia_drm_dumb_map_offset; > nv_drm_driver.dumb_destroy = drm_gem_dumb_destroy; >+ pax_close_kernel(); > > #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ > } >diff -urp work.orig/kernel/nvidia-modeset/nvidia-modeset-linux.c work/kernel/nvidia-modeset/nvidia-modeset-linux.c >--- work.orig/kernel/nvidia-modeset/nvidia-modeset-linux.c 2016-09-02 03:33:06.000000000 +0200 >+++ work/kernel/nvidia-modeset/nvidia-modeset-linux.c 2016-09-13 02:14:23.111862232 +0200 >@@ -322,29 +322,29 @@ static void nvkms_resume(NvU32 gpuId) > * Interface with resman. > *************************************************************************/ > >-static nvidia_modeset_rm_ops_t __rm_ops = { 0 }; >+static const nvidia_modeset_rm_ops_t *__rm_ops; >+ > static nvidia_modeset_callbacks_t nvkms_rm_callbacks = { >- nvkms_suspend, >- nvkms_resume >+ .suspend = nvkms_suspend, >+ .resume = nvkms_resume > }; > > static int nvkms_alloc_rm(void) > { > NV_STATUS nvstatus; > int ret; >+ const char * version_string = NV_VERSION_STRING; > >- __rm_ops.version_string = NV_VERSION_STRING; >- >- nvstatus = nvidia_get_rm_ops(&__rm_ops); >+ nvstatus = nvidia_get_rm_ops(&__rm_ops, &version_string); > > if (nvstatus != NV_OK) { > printk(KERN_ERR NVKMS_LOG_PREFIX "Version mismatch: " > "nvidia.ko(%s) nvidia-modeset.ko(%s)\n", >- __rm_ops.version_string, NV_VERSION_STRING); >+ version_string, NV_VERSION_STRING); > return -EINVAL; > } > >- ret = __rm_ops.set_callbacks(&nvkms_rm_callbacks); >+ ret = __rm_ops->set_callbacks(&nvkms_rm_callbacks); > if (ret < 0) { > printk(KERN_ERR NVKMS_LOG_PREFIX "Failed to register callbacks\n"); > return ret; >@@ -355,20 +355,20 @@ static int nvkms_alloc_rm(void) > > static void nvkms_free_rm(void) > { >- __rm_ops.set_callbacks(NULL); >+ __rm_ops->set_callbacks(NULL); > } > > void NVKMS_API_CALL nvkms_call_rm(void *ops) > { > nvidia_modeset_stack_ptr stack = NULL; > >- if (__rm_ops.alloc_stack(&stack) != 0) { >+ if (__rm_ops->alloc_stack(&stack) != 0) { > return; > } > >- __rm_ops.op(stack, ops); >+ __rm_ops->op(stack, ops); > >- __rm_ops.free_stack(stack); >+ __rm_ops->free_stack(stack); > } > > /************************************************************************* >@@ -690,13 +690,13 @@ NvBool NVKMS_API_CALL nvkms_open_gpu(NvU > nvidia_modeset_stack_ptr stack = NULL; > NvBool ret; > >- if (__rm_ops.alloc_stack(&stack) != 0) { >+ if (__rm_ops->alloc_stack(&stack) != 0) { > return NV_FALSE; > } > >- ret = __rm_ops.open_gpu(gpuId, stack) == 0; >+ ret = __rm_ops->open_gpu(gpuId, stack) == 0; > >- __rm_ops.free_stack(stack); >+ __rm_ops->free_stack(stack); > > return ret; > } >@@ -705,23 +705,23 @@ void NVKMS_API_CALL nvkms_close_gpu(NvU3 > { > nvidia_modeset_stack_ptr stack = NULL; > >- if (__rm_ops.alloc_stack(&stack) != 0) { >+ if (__rm_ops->alloc_stack(&stack) != 0) { > return; > } > >- __rm_ops.close_gpu(gpuId, stack); >+ __rm_ops->close_gpu(gpuId, stack); > >- __rm_ops.free_stack(stack); >+ __rm_ops->free_stack(stack); > } > > NvU32 NVKMS_API_CALL nvkms_enumerate_gpus(nv_gpu_info_t *gpu_info) > { >- return __rm_ops.enumerate_gpus(gpu_info); >+ return __rm_ops->enumerate_gpus(gpu_info); > } > > NvBool NVKMS_API_CALL nvkms_allow_write_combining(void) > { >- return __rm_ops.system_info.allow_write_combining; >+ return __rm_ops->system_info.allow_write_combining; > } > > /************************************************************************* >diff -urp work.orig/kernel/nvidia-uvm/uvm8_global.c work/kernel/nvidia-uvm/uvm8_global.c >--- work.orig/kernel/nvidia-uvm/uvm8_global.c 2016-09-02 03:30:48.000000000 +0200 >+++ work/kernel/nvidia-uvm/uvm8_global.c 2016-09-13 01:43:42.647910744 +0200 >@@ -35,17 +35,17 @@ > #include "nv_uvm_interface.h" > > uvm_global_t g_uvm_global; >-static struct UvmOpsUvmEvents g_exported_uvm8_ops; >+static struct UvmOpsUvmEvents g_exported_uvm8_ops = { >+ .startDevice = NULL, >+ .stopDevice = NULL, >+ .isrTopHalf = uvm8_isr_top_half, >+}; > static bool g_ops_registered = false; > > static NV_STATUS uvm8_register_callbacks(void) > { > NV_STATUS status = NV_OK; > >- g_exported_uvm8_ops.startDevice = NULL; >- g_exported_uvm8_ops.stopDevice = NULL; >- g_exported_uvm8_ops.isrTopHalf = uvm8_isr_top_half; >- > // Register the UVM callbacks with the main GPU driver: > status = uvm_rm_locked_call(nvUvmInterfaceRegisterUvmCallbacks(&g_exported_uvm8_ops)); > if (status != NV_OK) >diff -urp work.orig/kernel/nvidia-uvm/uvm8_gpu_semaphore.c work/kernel/nvidia-uvm/uvm8_gpu_semaphore.c >--- work.orig/kernel/nvidia-uvm/uvm8_gpu_semaphore.c 2016-09-02 03:30:48.000000000 +0200 >+++ work/kernel/nvidia-uvm/uvm8_gpu_semaphore.c 2016-09-13 01:44:14.019909917 +0200 >@@ -352,7 +352,7 @@ NvU64 uvm_gpu_semaphore_get_gpu_va(uvm_g > > NvU32 uvm_gpu_semaphore_get_payload(uvm_gpu_semaphore_t *semaphore) > { >- return ACCESS_ONCE(*semaphore->payload); >+ return ACCESS_ONCE_RW(*semaphore->payload); > } > > void uvm_gpu_semaphore_set_payload(uvm_gpu_semaphore_t *semaphore, NvU32 payload) >@@ -368,7 +368,7 @@ void uvm_gpu_semaphore_set_payload(uvm_g > // being optimized out on non-SMP configs (we need them for interacting with > // the GPU correctly even on non-SMP). > mb(); >- ACCESS_ONCE(*semaphore->payload) = payload; >+ ACCESS_ONCE_RW(*semaphore->payload) = payload; > } > > // This function is intended to catch channels which have been left dangling in >diff -urp work.orig/kernel/nvidia-uvm/uvm8_hal.h work/kernel/nvidia-uvm/uvm8_hal.h >--- work.orig/kernel/nvidia-uvm/uvm8_hal.h 2016-09-02 03:30:48.000000000 +0200 >+++ work/kernel/nvidia-uvm/uvm8_hal.h 2016-09-13 01:44:46.219909068 +0200 >@@ -316,7 +316,7 @@ typedef struct > // fault_buffer_ops: id is a hardware class > uvm_fault_buffer_hal_t fault_buffer_ops; > } u; >-} uvm_hal_class_ops_t; >+} __do_const uvm_hal_class_ops_t; > > // When UVM next support is enabled support for future chips in the hal is > // enabled by providing additional hal table entries below. >diff -urp work.orig/kernel/nvidia-uvm/uvm8_mmu.h work/kernel/nvidia-uvm/uvm8_mmu.h >--- work.orig/kernel/nvidia-uvm/uvm8_mmu.h 2016-09-02 03:30:48.000000000 +0200 >+++ work/kernel/nvidia-uvm/uvm8_mmu.h 2016-09-13 01:45:09.119908464 +0200 >@@ -24,7 +24,6 @@ > #ifndef __UVM8_MMU_H__ > #define __UVM8_MMU_H__ > >-#include "uvm8_forward_decl.h" > #include "uvm8_hal_types.h" > #include "uvm8_pmm_gpu.h" > #include "uvmtypes.h" >diff -urp work.orig/kernel/nvidia-uvm/uvm_common.c work/kernel/nvidia-uvm/uvm_common.c >--- work.orig/kernel/nvidia-uvm/uvm_common.c 2016-09-02 03:30:48.000000000 +0200 >+++ work/kernel/nvidia-uvm/uvm_common.c 2016-09-13 02:07:06.967873728 +0200 >@@ -51,7 +51,6 @@ > #define UVM_SPIN_LOOP_PRINT_TIMEOUT_SEC 30ULL > > static dev_t g_uvmBaseDev; >-struct UvmOpsUvmEvents g_exportedUvmOps; > > static char* uvm_driver_mode = "8"; > >@@ -178,8 +177,10 @@ static NV_STATUS uvmSetupGpuProvider(voi > { > NV_STATUS status = NV_OK; > >- g_exportedUvmOps.startDevice = uvm_gpu_event_start_device; >- g_exportedUvmOps.stopDevice = uvm_gpu_event_stop_device; >+ static struct UvmOpsUvmEvents g_exportedUvmOps = { >+ .startDevice = uvm_gpu_event_start_device, >+ .stopDevice = uvm_gpu_event_stop_device, >+ }; > > // call RM to exchange the function pointers. > status = nvUvmInterfaceRegisterUvmCallbacks(&g_exportedUvmOps); >diff -urp work.orig/kernel/nvidia-uvm/uvm_full_fault_buffer.h work/kernel/nvidia-uvm/uvm_full_fault_buffer.h >--- work.orig/kernel/nvidia-uvm/uvm_full_fault_buffer.h 2016-09-02 03:30:48.000000000 +0200 >+++ work/kernel/nvidia-uvm/uvm_full_fault_buffer.h 2016-09-13 02:14:43.967861682 +0200 >@@ -30,6 +30,7 @@ > #ifndef _UVM_FULL_FAULT_BUFFER_H_ > #define _UVM_FULL_FAULT_BUFFER_H_ > >+#include <linux/compiler.h> > #include "uvmtypes.h" > > #define MAXWELL_FAULT_BUFFER_A (0xb069) >@@ -303,7 +304,7 @@ typedef struct > NvUvmControlPrefetch_t controlPrefetch; > NvUvmTestFaultBufferOverflow_t testFaultBufferOverflow; > NvUvmClearFaultBufferOverflow_t clearFaultBufferOverflow; >-} UvmFaultBufferOps; >+} __no_const UvmFaultBufferOps; > > /****************************************************************************** > uvmfull_fault_buffer_init >diff -urp work.orig/kernel/nvidia-uvm/uvm_linux.h work/kernel/nvidia-uvm/uvm_linux.h >--- work.orig/kernel/nvidia-uvm/uvm_linux.h 2016-09-02 03:30:48.000000000 +0200 >+++ work/kernel/nvidia-uvm/uvm_linux.h 2016-09-13 01:47:41.487904448 +0200 >@@ -420,7 +420,7 @@ static inline NvU64 NV_GETTIME(void) > > // WRITE_ONCE/READ_ONCE have incompatible definitions across versions, which produces warnings. > // Therefore, we define our own macros >-#define UVM_WRITE_ONCE(x, val) (ACCESS_ONCE(x) = (val)) >+#define UVM_WRITE_ONCE(x, val) (ACCESS_ONCE_RW(x) = (val)) > #define UVM_READ_ONCE(x) ACCESS_ONCE(x) > > // Added in 3.11
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 593624
:
445556
| 445558