Kernel – 5.6-rc3 – OK with Patched VMware, not with Patched NVIDIA..
Kernel 5.6-rc3 is out, and brief details are here: http://lkml.iu.edu/hypermail/linux/kernel/2002.2/08977.html
The changes include:
Arnd Bergmann (4):
ASoC: atmel: fix atmel_ssc_set_audio link failure
y2038: remove ktime to/from timespec/timeval conversion
y2038: remove unused time32 interfaces
y2038: hide timeval/timespec/itimerval/itimerspec types
– and the Y2038-related ..time.. changes break the latest 5.6-patched NVIDIA 440-59:
………………..
/home/rgadsdon/NVIDIA-Linux-x86_64-440.59-custom/kernel/common/inc/nv-time.h: In function ‘nv_gettimeofday’:
/home/rgadsdon/NVIDIA-Linux-x86_64-440.59-custom/kernel/common/inc/nv-time.h:40:10: error: ‘struct timeval’ has no member named ‘tv_sec’
40 | .tv_sec = now.tv_sec,
| ^~~~~~
/home/rgadsdon/NVIDIA-Linux-x86_64-440.59-custom/kernel/common/inc/nv-time.h:40:19: warning: excess elements in struct initializer
40 | .tv_sec = now.tv_sec,
| ^~~
/home/rgadsdon/NVIDIA-Linux-x86_64-440.59-custom/kernel/common/inc/nv-time.h:40:19: note: (near initialization for ‘(anonymous)’)
/home/rgadsdon/NVIDIA-Linux-x86_64-440.59-custom/kernel/common/inc/nv-time.h:41:10: error: ‘struct timeval’ has no member named ‘tv_usec’
41 | .tv_usec = now.tv_nsec/1000,
| ^~~~~~~
…………. etc ……………
Patched VMware 15.5.1 compiles OK..
Robert Gadsdon. February 23rd 2020.
From 9caba3eee922d974f269667ee632b5e33ba12a91 Mon Sep 17 00:00:00 2001
From: Dark Shenada
Date: Sat, 14 Mar 2020 17:31:51 +0800
Subject: [PATCH] Kernel 5.6rc3 support for nvidia 440.64
Rework patch from
https://github.com/Tk-Glitch/PKGBUILDS/nvidia-all/patches/kernel-5.6.patch
Signed-off-by: Dark Shenada
Signed-off-by: Dark Shenada
—
common/inc/nv-procfs.h | 52 ++++++++++++++++++++++++++
common/inc/nv-time.h | 82 +++++++++++++++++++++++++++++++++++++++++
conftest.sh | 10 +++++
nvidia/linux_nvswitch.c | 3 ++
nvidia/nv-procfs.c | 65 ++++++++++++++++++++++++++++++++
nvidia/nvidia.Kbuild | 1 +
nvidia/os-interface.c | 6 +++
7 files changed, 219 insertions(+)
diff –git a/common/inc/nv-procfs.h b/common/inc/nv-procfs.h
index 8b53f86..4c5aceb 100644
— a/common/inc/nv-procfs.h
+++ b/common/inc/nv-procfs.h
@@ -28,6 +28,18 @@
#define IS_EXERCISE_ERROR_FORWARDING_ENABLED() (EXERCISE_ERROR_FORWARDING)
+#if defined(NV_HAVE_PROC_OPS)
+#define NV_CREATE_PROC_FILE(filename,parent,__name,__data) \
+ ({ \
+ struct proc_dir_entry *__entry; \
+ int mode = (S_IFREG | S_IRUGO); \
+ const struct proc_ops *fops = &nv_procfs_##__name##_fops; \
+ if (fops->proc_write != 0) \
+ mode |= S_IWUSR; \
+ __entry = proc_create_data(filename, mode, parent, fops, __data);\
+ __entry; \
+ })
+#else
#define NV_CREATE_PROC_FILE(filename,parent,__name,__data) \
({ \
struct proc_dir_entry *__entry; \
@@ -38,6 +50,7 @@
__entry = proc_create_data(filename, mode, parent, fops, __data);\
__entry; \
})
+#endif
/*
* proc_mkdir_mode exists in Linux 2.6.9, but isn’t exported until Linux 3.0.
@@ -77,6 +90,44 @@
remove_proc_entry(entry->name, entry->parent);
#endif
+#if defined(NV_HAVE_PROC_OPS)
+#define NV_DEFINE_SINGLE_PROCFS_FILE(name, open_callback, close_callback) \
+ static int nv_procfs_open_##name( \
+ struct inode *inode, \
+ struct file *filep \
+ ) \
+ { \
+ int ret; \
+ ret = single_open(filep, nv_procfs_read_##name, \
+ NV_PDE_DATA(inode)); \
+ if (ret < 0) \
+ { \
+ return ret; \
+ } \
+ ret = open_callback(); \
+ if (ret < 0) \
+ { \
+ single_release(inode, filep); \
+ } \
+ return ret; \
+ } \
+ \
+ static int nv_procfs_release_##name( \
+ struct inode *inode, \
+ struct file *filep \
+ ) \
+ { \
+ close_callback(); \
+ return single_release(inode, filep); \
+ } \
+ \
+ static const struct proc_ops nv_procfs_##name##_fops = { \
+ .proc_open = nv_procfs_open_##name, \
+ .proc_read = seq_read, \
+ .proc_lseek = seq_lseek, \
+ .proc_release = nv_procfs_release_##name, \
+ };
+#else
#define NV_DEFINE_SINGLE_PROCFS_FILE(name, open_callback, close_callback) \
static int nv_procfs_open_##name( \
struct inode *inode, \
@@ -114,6 +165,7 @@
.llseek = seq_lseek, \
.release = nv_procfs_release_##name, \
};
+#endif
#endif /* CONFIG_PROC_FS */
diff –git a/common/inc/nv-time.h b/common/inc/nv-time.h
index 968b873..fc01ae6 100644
— a/common/inc/nv-time.h
+++ b/common/inc/nv-time.h
@@ -26,6 +26,88 @@
#include "conftest.h"
#include
+#include
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
+typedef __kernel_long_t __kernel_time_t;
+
+#ifndef _STRUCT_TIMESPEC
+#define _STRUCT_TIMESPEC
+struct timespec {
+ __kernel_old_time_t tv_sec; /* seconds */
+ long tv_nsec; /* nanoseconds */
+};
+#endif
+
+struct timeval {
+ __kernel_old_time_t tv_sec; /* seconds */
+ __kernel_suseconds_t tv_usec; /* microseconds */
+};
+
+struct itimerspec {
+ struct timespec it_interval;/* timer period */
+ struct timespec it_value; /* timer expiration */
+};
+
+struct itimerval {
+ struct timeval it_interval;/* timer interval */
+ struct timeval it_value; /* current value */
+};
+
+#if __BITS_PER_LONG == 64
+
+/* timespec64 is defined as timespec here */
+static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64)
+{
+ return *(const struct timespec *)&ts64;
+}
+
+static inline struct timespec64 timespec_to_timespec64(const struct timespec ts)
+{
+ return *(const struct timespec64 *)&ts;
+}
+
+#else
+static inline struct timespec timespec64_to_timespec(const struct timespec64 ts64)
+{
+ struct timespec ret;
+
+ ret.tv_sec = (time_t)ts64.tv_sec;
+ ret.tv_nsec = ts64.tv_nsec;
+ return ret;
+}
+
+static inline struct timespec64 timespec_to_timespec64(const struct timespec ts)
+{
+ struct timespec64 ret;
+
+ ret.tv_sec = ts.tv_sec;
+ ret.tv_nsec = ts.tv_nsec;
+ return ret;
+}
+#endif // __BITS_PER_LONG == 64
+
+static inline void getnstimeofday(struct timespec *ts)
+{
+ struct timespec64 ts64;
+
+ ktime_get_real_ts64(&ts64);
+ *ts = timespec64_to_timespec(ts64);
+}
+
+static inline s64 timespec_to_ns(const struct timespec *ts)
+{
+ return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
+}
+
+static inline void getrawmonotonic(struct timespec *ts)
+{
+ struct timespec64 ts64;
+
+ ktime_get_raw_ts64(&ts64);
+ *ts = timespec64_to_timespec(ts64);
+}
+#endif // LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
static inline void nv_gettimeofday(struct timeval *tv)
{
diff –git a/conftest.sh b/conftest.sh
index 57d85a4..3e612e5 100644
— a/conftest.sh
+++ b/conftest.sh
@@ -806,6 +806,16 @@ compile_test() {
compile_check_conftest “$CODE” “NV_FILE_OPERATIONS_HAS_IOCTL” “” “types”
;;
+ proc_ops)
+ CODE=”
+ #include
+ int conftest_proc_ops(void) {
+ return offsetof(struct proc_ops, proc_open);
+ }”
+
+ compile_check_conftest “$CODE” “NV_HAVE_PROC_OPS” “” “types”
+ ;;
+
sg_alloc_table)
#
# sg_alloc_table_from_pages added by commit efc42bc98058
diff –git a/nvidia/linux_nvswitch.c b/nvidia/linux_nvswitch.c
index 1d2c1bc..388d64f 100644
— a/nvidia/linux_nvswitch.c
+++ b/nvidia/linux_nvswitch.c
@@ -26,6 +26,9 @@
#include “conftest.h”
#include “nvmisc.h”
#include “nv-linux.h”
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
+#include “nv-time.h”
+#endif
#include “nv-procfs.h”
#include “nvlink_common.h”
#include “nvlink_errors.h”
diff –git a/nvidia/nv-procfs.c b/nvidia/nv-procfs.c
index 064d727..a7308d3 100644
— a/nvidia/nv-procfs.c
+++ b/nvidia/nv-procfs.c
@@ -452,6 +452,15 @@ done:
return ((status = KERNEL_VERSION(5, 6, 0)
+ struct timespec64 ts;
+
+ jiffies_to_timespec64(jiffies, &ts);
+#else
struct timespec ts;
jiffies_to_timespec(jiffies, &ts);
+#endif
*nseconds = ((NvU64)ts.tv_sec * NSEC_PER_SEC + (NvU64)ts.tv_nsec);
}
—
2.25.1