Add app-emulation/vmware-modules-14

from stefantalpalaru overlay
This commit is contained in:
Sergey Morozov
2018-04-08 12:08:26 +03:00
parent c5bb5c2365
commit 655df0cc15
16 changed files with 2353 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
From 182ac915372c798e400c9718499cae2cb1822ef1 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Sat, 30 Sep 2017 21:41:51 +0200
Subject: [PATCH 6/6] vmmon: quick workaround for objtool warnings
As discussed in
https://bugzilla.suse.com/show_bug.cgi?id=1059674
the reason for multiple objtool warnings is the fact that vmmon module
defines its own Panic() function which never returns. While it is marked as
such which is used by the compiler for optimization, there is no way to
find this from object file.
While this seems innocuous, it might result in problems with unwinder
later. The quickest way around is to replace vmmon's own Panic() with
standard kernel panic() until a cleaner solution is found.
---
vmmon-only/include/vm_assert.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/vmmon-only/include/vm_assert.h b/vmmon-only/include/vm_assert.h
index 8cdbc93..b869def 100644
--- a/vmmon-only/include/vm_assert.h
+++ b/vmmon-only/include/vm_assert.h
@@ -67,6 +67,7 @@ extern "C" {
#if defined (VMKPANIC)
#include "vmk_assert.h"
#else /* !VMKPANIC */
+#include <linux/kernel.h>
#define _ASSERT_PANIC(name) \
Panic(_##name##Fmt "\n", __FILE__, __LINE__)
#define _ASSERT_PANIC_BUG(bug, name) \
@@ -107,7 +108,7 @@ NORETURN void Panic_NoSave(const char *fmt, ...) PRINTF_DECL(1, 2);
} while(0)
#else
-NORETURN void Panic(const char *fmt, ...) PRINTF_DECL(1, 2);
+#define Panic panic
#endif
void LogThrottled(uint32 *count, const char *fmt, ...) PRINTF_DECL(2, 3);
--
2.14.3

View File

@@ -0,0 +1,40 @@
From 4d80590924550d0ee3fe470e027deea0ee43e6b6 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Tue, 18 Apr 2017 12:52:08 +0200
Subject: [PATCH 1/6] vmnet: use standard definition of PCI_VENDOR_ID_VMWARE if
available
The PCI_VENDOR_ID_VMWARE macro is defined in mainline pci_ids.h since
commit 94e57fea6202 ("PCI: Move PCI_VENDOR_ID_VMWARE to pci_ids.h")
in v3.18-rc1.
---
vmnet-only/vm_device_version.h | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/vmnet-only/vm_device_version.h b/vmnet-only/vm_device_version.h
index ab396bc..cafddd0 100644
--- a/vmnet-only/vm_device_version.h
+++ b/vmnet-only/vm_device_version.h
@@ -35,6 +35,8 @@
#endif
#endif
+#include <linux/pci_ids.h>
+
/* LSILogic 53C1030 Parallel SCSI controller
* LSILogic SAS1068 SAS controller
*/
@@ -53,7 +55,10 @@
* VMware HD Audio codec
* VMware HD Audio controller
*/
+#ifndef PCI_VENDOR_ID_VMWARE
#define PCI_VENDOR_ID_VMWARE 0x15AD
+#endif
+
#define PCI_DEVICE_ID_VMWARE_SVGA2 0x0405
#define PCI_DEVICE_ID_VMWARE_SVGA 0x0710
#define PCI_DEVICE_ID_VMWARE_VGA 0x0711
--
2.14.3

View File

@@ -0,0 +1,32 @@
From 7cb0c3beb4abde406d5334376106d68997f6fb51 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Tue, 18 Apr 2017 13:01:56 +0200
Subject: [PATCH 2/6] vmnet: use standard definition of
PCI_VENDOR_ID_VMWARE_VMXNET3 if available
The PCI_DEVICE_ID_VMWARE_VMXNET3 macro is defined in mainline pci_ids.h
since commit b1226c7db1d9 ("vmxnet3: Move PCI Id to pci_ids.h") in
v4.10-rc1.
---
vmnet-only/vm_device_version.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/vmnet-only/vm_device_version.h b/vmnet-only/vm_device_version.h
index cafddd0..9305ddb 100644
--- a/vmnet-only/vm_device_version.h
+++ b/vmnet-only/vm_device_version.h
@@ -75,7 +75,11 @@
#define PCI_DEVICE_ID_VMWARE_1394 0x0780
#define PCI_DEVICE_ID_VMWARE_BRIDGE 0x0790
#define PCI_DEVICE_ID_VMWARE_ROOTPORT 0x07A0
+
+#ifndef PCI_DEVICE_ID_VMWARE_VMXNET3
#define PCI_DEVICE_ID_VMWARE_VMXNET3 0x07B0
+#endif
+
#define PCI_DEVICE_ID_VMWARE_PVSCSI 0x07C0
#define PCI_DEVICE_ID_VMWARE_82574 0x07D0
#define PCI_DEVICE_ID_VMWARE_AHCI 0x07E0
--
2.14.3

View File

@@ -0,0 +1,54 @@
From 53d6ccbeed4c519dc105f98552067ced2ecbd432 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Fri, 23 Jun 2017 09:29:24 +0200
Subject: [PATCH 3/6] vmmon: use standard definition of
MSR_MISC_FEATURES_ENABLES if available
The MSR_MISC_FEATURES_ENABLES macro is defined in mainline since commit
ab6d9468631a ("x86/msr: Rename MISC_FEATURE_ENABLES to
MISC_FEATURES_ENABLES") in v4.12-rc1.
The MSR_MISC_FEATURES_ENABLES_CPUID_FAULT macro is defined in mainline
since commit e9ea1e7f53b8 ("x86/arch_prctl: Add ARCH_[GET|SET]_CPUID") in
v4.12-rc1.
---
vmmon-only/include/x86msr.h | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/vmmon-only/include/x86msr.h b/vmmon-only/include/x86msr.h
index 3a6bfe8..904d9e9 100644
--- a/vmmon-only/include/x86msr.h
+++ b/vmmon-only/include/x86msr.h
@@ -24,6 +24,7 @@
#ifndef _X86MSR_H_
#define _X86MSR_H_
+#include <asm/msr-index.h>
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMX
@@ -112,7 +113,9 @@ MSRQuery;
#define MSR_TSC_AUX 0xc0000103
#define MSR_BD_TSC_RATIO 0xc0000104
+#ifndef MSR_MISC_FEATURES_ENABLES
#define MSR_MISC_FEATURES_ENABLES 0x140
+#endif
/* Intel Core Architecture and later: use only architected counters. */
#define IA32_MSR_PERF_CAPABILITIES 0x345
@@ -612,7 +615,11 @@ typedef enum {
/*
* MISC_FEATURES_ENABLES bits
*/
+#ifdef MSR_MISC_FEATURES_ENABLES_CPUID_FAULT
+#define MSR_MISC_FEATURES_ENABLES_CPUID_FAULTING MSR_MISC_FEATURES_ENABLES_CPUID_FAULT
+#else
#define MSR_MISC_FEATURES_ENABLES_CPUID_FAULTING 1
+#endif
--
2.14.3

View File

@@ -0,0 +1,39 @@
From 704be6e3f2143df35e99025caa3393b9c309fbc1 Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Mon, 24 Jul 2017 10:08:55 +0200
Subject: [PATCH 4/6] vmmon: use standard definition of CR3_PCID_MASK if
available
The CR3_PCID_MASK is defined in mainline asm/processor-flags.h since
commit 6c690ee1039b ("x86/mm: Split read_cr3() into read_cr3_pa() and
__read_cr3()") in v4.13-rc1.
---
vmmon-only/include/x86_basic_defs.h | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/vmmon-only/include/x86_basic_defs.h b/vmmon-only/include/x86_basic_defs.h
index abfb0b8..8c7566f 100644
--- a/vmmon-only/include/x86_basic_defs.h
+++ b/vmmon-only/include/x86_basic_defs.h
@@ -35,6 +35,8 @@
#define INCLUDE_ALLOW_VMCORE
#include "includeCheck.h"
+#include <asm/processor-flags.h>
+
#define X86_MAX_INSTR_LEN 15 /* Max byte length of an x86 instruction. */
#define NUM_IDT_VECTORS 256
@@ -75,7 +77,9 @@
#define CR3_PDB_MASK 0xfffff000
#define CR3_IGNORE 0xFFF
#define PAE_CR3_IGNORE 0x1F
+#ifndef CR3_PCID_MASK
#define CR3_PCID_MASK 0xFFF
+#endif
#define CR3_NO_FLUSH (1ULL << 63)
#define CR4_VME 0x00000001
--
2.14.3

View File

@@ -0,0 +1,84 @@
--- a/vsock-only/linux/notify.c 2017-10-03 06:52:10.953893050 +0300
+++ b/vsock-only/linux/notify.c 2017-10-03 05:42:48.642701836 +0300
@@ -1193,20 +1193,20 @@ VSockVmciNotifyPktProcessNegotiate(struc
/* Socket control packet based operations. */
-VSockVmciNotifyOps vSockVmciNotifyPktOps = {
- VSockVmciNotifyPktSocketInit,
- VSockVmciNotifyPktSocketDestruct,
- VSockVmciNotifyPktPollIn,
- VSockVmciNotifyPktPollOut,
- VSockVmciNotifyPktHandlePkt,
- VSockVmciNotifyPktRecvInit,
- VSockVmciNotifyPktRecvPreBlock,
- VSockVmciNotifyPktRecvPreDequeue,
- VSockVmciNotifyPktRecvPostDequeue,
- VSockVmciNotifyPktSendInit,
- VSockVmciNotifyPktSendPreBlock,
- VSockVmciNotifyPktSendPreEnqueue,
- VSockVmciNotifyPktSendPostEnqueue,
- VSockVmciNotifyPktProcessRequest,
- VSockVmciNotifyPktProcessNegotiate,
+VSockVmciNotifyOps vSockVmciNotifyPktOps __refdata = {
+ .socketInit = VSockVmciNotifyPktSocketInit,
+ .socketDestruct = VSockVmciNotifyPktSocketDestruct,
+ .pollIn = VSockVmciNotifyPktPollIn,
+ .pollOut = VSockVmciNotifyPktPollOut,
+ .handleNotifyPkt = VSockVmciNotifyPktHandlePkt,
+ .recvInit = VSockVmciNotifyPktRecvInit,
+ .recvPreBlock = VSockVmciNotifyPktRecvPreBlock,
+ .recvPreDequeue = VSockVmciNotifyPktRecvPreDequeue,
+ .recvPostDequeue = VSockVmciNotifyPktRecvPostDequeue,
+ .sendInit = VSockVmciNotifyPktSendInit,
+ .sendPreBlock = VSockVmciNotifyPktSendPreBlock,
+ .sendPreEnqueue = VSockVmciNotifyPktSendPreEnqueue,
+ .sendPostEnqueue = VSockVmciNotifyPktSendPostEnqueue,
+ .processRequest = VSockVmciNotifyPktProcessRequest,
+ .processNegotiate = VSockVmciNotifyPktProcessNegotiate,
};
diff -urp a/vsock-only/linux/notifyQState.c b/vsock-only/linux/notifyQState.c
--- a/vsock-only/linux/notifyQState.c 2017-10-03 06:52:10.952893329 +0300
+++ b/vsock-only/linux/notifyQState.c 2017-10-03 05:43:02.950697125 +0300
@@ -771,21 +770,24 @@ VSockVmciNotifyPktProcessNegotiate(struc
}
-/* Socket always on control packet based operations. */
-VSockVmciNotifyOps vSockVmciNotifyPktQStateOps = {
- VSockVmciNotifyPktSocketInit,
- VSockVmciNotifyPktSocketDestruct,
- VSockVmciNotifyPktPollIn,
- VSockVmciNotifyPktPollOut,
- VSockVmciNotifyPktHandlePkt,
- VSockVmciNotifyPktRecvInit,
- VSockVmciNotifyPktRecvPreBlock,
- NULL, /* recvPreDequeue */
- VSockVmciNotifyPktRecvPostDequeue,
- VSockVmciNotifyPktSendInit,
- NULL, /* sendPreBlock */
- NULL, /* sendPreEnqueue */
- VSockVmciNotifyPktSendPostEnqueue,
- VSockVmciNotifyPktProcessRequest,
- VSockVmciNotifyPktProcessNegotiate,
+
+
+// Socket always on control packet based operations.
+VSockVmciNotifyOps vSockVmciNotifyPktQStateOps __refdata = {
+ .socketInit = VSockVmciNotifyPktSocketInit,
+ .socketDestruct = VSockVmciNotifyPktSocketDestruct,
+ .pollIn = VSockVmciNotifyPktPollIn,
+ .pollOut = VSockVmciNotifyPktPollOut,
+ .handleNotifyPkt = VSockVmciNotifyPktHandlePkt,
+ .recvInit = VSockVmciNotifyPktRecvInit,
+ .recvPreBlock = VSockVmciNotifyPktRecvPreBlock,
+ .recvPreDequeue = NULL,
+ .recvPostDequeue = VSockVmciNotifyPktRecvPostDequeue,
+ .sendInit = VSockVmciNotifyPktSendInit,
+ .sendPreBlock = NULL,
+ .sendPreEnqueue = NULL,
+ .sendPostEnqueue = VSockVmciNotifyPktSendPostEnqueue,
+ .processRequest = VSockVmciNotifyPktProcessRequest,
+ .processNegotiate = VSockVmciNotifyPktProcessNegotiate,
+
};

View File

@@ -0,0 +1,461 @@
diff --git a/vmblock-only/Makefile b/vmblock-only/Makefile
index bbfe225..8ec1a86 100644
--- a/vmblock-only/Makefile
+++ b/vmblock-only/Makefile
@@ -43,7 +43,11 @@ INCLUDE += -I$(SRCROOT)/shared
endif
+ifdef KVERSION
+VM_UNAME = $(KVERSION)
+else
VM_UNAME = $(shell uname -r)
+endif
# Header directory for the running kernel
ifdef LINUXINCLUDE
diff --git a/vmblock-only/Makefile.kernel b/vmblock-only/Makefile.kernel
index ab7a727..e3ec9d2 100644
--- a/vmblock-only/Makefile.kernel
+++ b/vmblock-only/Makefile.kernel
@@ -19,7 +19,7 @@
INCLUDE += -I$(SRCROOT)/include
-EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE)
+EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE) $(LINUXINCLUDE)
EXTRA_CFLAGS += $(call vm_check_build, $(AUTOCONF_DIR)/cachecreate.c, -DVMW_KMEMCR_HAS_DTOR, )
EXTRA_CFLAGS += $(call vm_check_build, $(AUTOCONF_DIR)/cachector.c, -DVMW_KMEMCR_CTOR_HAS_3_ARGS, )
diff --git a/vmblock-only/linux/control.c b/vmblock-only/linux/control.c
index 79716bd..5b6acb2 100644
--- a/vmblock-only/linux/control.c
+++ b/vmblock-only/linux/control.c
@@ -29,7 +29,7 @@
#include <linux/stat.h>
#include <linux/fs.h>
-#include <asm/uaccess.h>
+#include <linux/uaccess.h>
#include "vmblockInt.h"
#include "block.h"
@@ -208,9 +208,17 @@ SetupProcDevice(void)
VMBlockSetProcEntryOwner(controlProcMountpoint);
/* Create /proc/fs/vmblock/dev */
+ // create_proc_entry deprecated in 3.10
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,10,0)
+ controlProcEntry = proc_create(VMBLOCK_CONTROL_DEVNAME,
+ VMBLOCK_CONTROL_MODE,
+ controlProcDirEntry,
+ &ControlFileOps);
+#else
controlProcEntry = create_proc_entry(VMBLOCK_CONTROL_DEVNAME,
VMBLOCK_CONTROL_MODE,
controlProcDirEntry);
+#endif
if (!controlProcEntry) {
Warning("SetupProcDevice: could not create " VMBLOCK_DEVICE "\n");
remove_proc_entry(VMBLOCK_CONTROL_MOUNTPOINT, controlProcDirEntry);
@@ -218,7 +226,9 @@ SetupProcDevice(void)
return -EINVAL;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) //Maybe 3.14? 3.13?
controlProcEntry->proc_fops = &ControlFileOps;
+#endif
return 0;
}
@@ -272,17 +282,50 @@ CleanupProcDevice(void)
*----------------------------------------------------------------------------
*/
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 13, 0)
+/* copy-paste from Lustre FS by pavlinux */
+static inline char *ll_getname(const char __user *filename)
+{
+ int ret = 0, len;
+ char *tmp = __getname();
+
+ if (!tmp)
+ return ERR_PTR(-ENOMEM);
+
+ len = strncpy_from_user(tmp, filename, PATH_MAX);
+ if (len == 0)
+ ret = -ENOENT;
+ else if (len > PATH_MAX)
+ ret = -ENAMETOOLONG;
+
+ if (ret) {
+ __putname(tmp);
+ tmp = ERR_PTR(ret);
+ }
+ return tmp;
+};
+#endif
+
static int
ExecuteBlockOp(const char __user *buf, // IN: buffer with name
const os_blocker_id_t blocker, // IN: blocker ID (file)
int (*blockOp)(const char *filename, // IN: block operation
const os_blocker_id_t blocker))
{
- char *name;
+ struct filename *fn = NULL;
+ char *name = (char *)fn->name;
int i;
int retval;
- name = getname(buf);
+ // Not sure what changed in 3.13 to neccessitate this.
+ // Gentoo uses __getname(), though.
+ // https://github.com/gentoo/vmware/blob/master/app-emulation/vmware-modules/files/308-3.10-02-control.patch#L36
+ // ~MK
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 13, 0)
+ name = (char *)getname(buf);
+#else
+ name = (char *)ll_getname(buf);
+#endif
if (IS_ERR(name)) {
return PTR_ERR(name);
}
@@ -293,7 +336,13 @@ ExecuteBlockOp(const char __user *buf, // IN: buffer with name
retval = i < 0 ? -EINVAL : blockOp(name, blocker);
- putname(name);
+ // I'm not sure what this does, but you seem to know what you're doing ~MK
+ if (fn->name != fn->iname) { /* add by pavlinux */
+ __putname(fn->name);
+ kvfree(fn);
+ } else {
+ __putname(fn);
+ }
return retval;
}
diff --git a/vmblock-only/linux/dentry.c b/vmblock-only/linux/dentry.c
index 05ea95a..1245358 100644
--- a/vmblock-only/linux/dentry.c
+++ b/vmblock-only/linux/dentry.c
@@ -32,7 +32,13 @@
#include "block.h"
-static int DentryOpRevalidate(struct dentry *dentry, struct nameidata *nd);
+// From what I can tell, this should've always been an unsigned int?
+static int DentryOpRevalidate(struct dentry *dentry,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0) // Maybe 3.14 or 3.13?
+ struct nameidata *nd);
+#else
+ unsigned int flags);
+#endif
struct dentry_operations LinkDentryOps = {
.d_revalidate = DentryOpRevalidate,
@@ -60,7 +66,11 @@ struct dentry_operations LinkDentryOps = {
static int
DentryOpRevalidate(struct dentry *dentry, // IN: dentry revalidating
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
struct nameidata *nd) // IN: lookup flags & intent
+#else
+ unsigned int flags) // IN: lookup flags & intent
+#endif
{
VMBlockInodeInfo *iinfo;
struct nameidata actualNd;
@@ -101,7 +111,11 @@ DentryOpRevalidate(struct dentry *dentry, // IN: dentry revalidating
if (actualDentry &&
actualDentry->d_op &&
actualDentry->d_op->d_revalidate) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
+ return actualDentry->d_op->d_revalidate(actualDentry, flags);
+#else
return actualDentry->d_op->d_revalidate(actualDentry, nd);
+#endif
}
if (compat_path_lookup(iinfo->name, 0, &actualNd)) {
diff --git a/vmblock-only/linux/file.c b/vmblock-only/linux/file.c
index d7ac1f6..c5e6604 100644
--- a/vmblock-only/linux/file.c
+++ b/vmblock-only/linux/file.c
@@ -39,6 +39,7 @@ typedef ino_t inode_num_t;
#endif
/* Specifically for our filldir_t callback */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
typedef struct FilldirInfo {
filldir_t filldir;
void *dirent;
@@ -76,6 +77,7 @@ Filldir(void *buf, // IN: Dirent buffer passed from FileOpReaddir
/* Specify DT_LNK regardless */
return info->filldir(info->dirent, name, namelen, offset, ino, DT_LNK);
}
+#endif
/* File operations */
@@ -132,7 +134,12 @@ FileOpOpen(struct inode *inode, // IN
* and that would try to acquire the inode's semaphore; if the two inodes
* are the same we'll deadlock.
*/
+ // f_dentry is defined as f_path.dentry until 3.19
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,19,0)
if (actualFile->f_dentry && inode == actualFile->f_dentry->d_inode) {
+#else
+ if (actualFile->f_path.dentry && inode == actualFile->f_path.dentry->d_inode) {
+#endif
Warning("FileOpOpen: identical inode encountered, open cannot succeed.\n");
if (filp_close(actualFile, current->files) < 0) {
Warning("FileOpOpen: unable to close opened file.\n");
@@ -164,13 +171,20 @@ FileOpOpen(struct inode *inode, // IN
*----------------------------------------------------------------------------
*/
+// pavlinux's patch completely removes this bit for kernels older than 3.13
static int
FileOpReaddir(struct file *file, // IN
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
void *dirent, // IN
filldir_t filldir) // IN
+#else
+ struct dir_context* ctx) //IN
+#endif
{
int ret;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
FilldirInfo info;
+#endif
struct file *actualFile;
if (!file) {
@@ -184,12 +198,20 @@ FileOpReaddir(struct file *file, // IN
return -EINVAL;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
info.filldir = filldir;
info.dirent = dirent;
actualFile->f_pos = file->f_pos;
ret = vfs_readdir(actualFile, Filldir, &info);
file->f_pos = actualFile->f_pos;
+#else
+ /* Ricky Wong Yung Fei:
+ * Manipulation of pos is now handled internally by iterate_dir().
+ */
+ ret = iterate_dir(actualFile, ctx);
+ file->f_pos = actualFile->f_pos;
+#endif
return ret;
}
@@ -236,8 +258,15 @@ FileOpRelease(struct inode *inode, // IN
}
+// pavlinux's patch drops FileOpReaddr for < 3.13
+// pavlinux's patch sets .owner = THIS_MODULE and .llseek = no_llseek
struct file_operations RootFileOps = {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,11,0)
.readdir = FileOpReaddir,
+#else
+ .iterate = FileOpReaddir,
+#endif
+ .owner = THIS_MODULE,
.open = FileOpOpen,
.release = FileOpRelease,
};
diff --git a/vmblock-only/linux/inode.c b/vmblock-only/linux/inode.c
index 098c94c..7aed6e7 100644
--- a/vmblock-only/linux/inode.c
+++ b/vmblock-only/linux/inode.c
@@ -28,20 +28,32 @@
#include <linux/fs.h>
#include <linux/time.h>
#include <linux/namei.h>
+#include <linux/cred.h>
#include "vmblockInt.h"
#include "filesystem.h"
#include "block.h"
/* Inode operations */
+// Again, it looks like last arg should've always been unsigned int ~MK
static struct dentry *InodeOpLookup(struct inode *dir,
- struct dentry *dentry, struct nameidata *nd);
-static int InodeOpReadlink(struct dentry *dentry, char __user *buffer, int buflen);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
-static void *InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
+ struct dentry *dentry,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) // Maybe 3.12 or 3.13?
+ struct nameidata *nd);
#else
+ unsigned int flags);
+#endif
+static int InodeOpReadlink(struct dentry *dentry, char __user *buffer, int buflen);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 13)
static int InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+static const char *InodeOpGetLink(struct dentry *dentry, struct inode *inode,
+ struct delayed_call *done);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+static const char *InodeOpFollowlink(struct dentry *dentry, void **cookie);
+#else
+static void *InodeOpFollowlink(struct dentry *dentry, struct nameidata *nd);
#endif
@@ -49,9 +60,13 @@ struct inode_operations RootInodeOps = {
.lookup = InodeOpLookup,
};
-static struct inode_operations LinkInodeOps = {
+struct inode_operations LinkInodeOps = {
.readlink = InodeOpReadlink,
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+ .get_link = InodeOpGetLink,
+#else
.follow_link = InodeOpFollowlink,
+#endif
};
@@ -75,7 +90,11 @@ static struct inode_operations LinkInodeOps = {
static struct dentry *
InodeOpLookup(struct inode *dir, // IN: parent directory's inode
struct dentry *dentry, // IN: dentry to lookup
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0)
struct nameidata *nd) // IN: lookup intent and information
+#else
+ unsigned int flags) // IN: lookup intent and information
+#endif
{
char *filename;
struct inode *inode;
@@ -135,7 +154,16 @@ InodeOpLookup(struct inode *dir, // IN: parent directory's inode
inode->i_size = INODE_TO_IINFO(inode)->nameLen;
inode->i_version = 1;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
+#else
+ inode->i_atime = inode->i_mtime = inode->i_ctime = current_kernel_time();
+#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)
inode->i_uid = inode->i_gid = 0;
+#else
+ inode->i_gid = make_kgid(current_user_ns(), 0);
+ inode->i_uid = make_kuid(current_user_ns(), 0);
+#endif
inode->i_op = &LinkInodeOps;
d_add(dentry, inode);
@@ -176,8 +200,15 @@ InodeOpReadlink(struct dentry *dentry, // IN : dentry of symlink
if (!iinfo) {
return -EINVAL;
}
-
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(3, 14, 99)
return vfs_readlink(dentry, buffer, buflen, iinfo->name);
+#elif LINUX_VERSION_CODE <= KERNEL_VERSION(4, 6, 99)
+ return readlink_copy(buffer, buflen, iinfo->name);
+#elif LINUX_VERSION_CODE <= KERNEL_VERSION(4, 9, 99)
+ return generic_readlink(dentry, buffer, buflen);
+#else
+ return vfs_readlink(dentry, buffer, buflen);
+#endif
}
@@ -198,30 +229,58 @@ InodeOpReadlink(struct dentry *dentry, // IN : dentry of symlink
*----------------------------------------------------------------------------
*/
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
-static void *
+static
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 13)
+int
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+const char *
#else
-static int
+void *
#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+InodeOpGetLink(struct dentry *dentry, struct inode *inode,
+ struct delayed_call *done)
+#else
InodeOpFollowlink(struct dentry *dentry, // IN : dentry of symlink
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+ void **cookie)
+#else
struct nameidata *nd) // OUT: stores result
+#endif
+#endif
{
int ret;
VMBlockInodeInfo *iinfo;
if (!dentry) {
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+ ret = -ECHILD;
+#else
Warning("InodeOpReadlink: invalid args from kernel\n");
ret = -EINVAL;
+#endif
goto out;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+ iinfo = INODE_TO_IINFO(inode);
+#else
iinfo = INODE_TO_IINFO(dentry->d_inode);
+#endif
if (!iinfo) {
ret = -EINVAL;
goto out;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
ret = vfs_follow_link(nd, iinfo->name);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 99)
+ return (char *)(iinfo->name);
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+ return *cookie = (char *)(iinfo->name);
+#else
+ nd_set_link(nd, iinfo->name);
+#endif
out:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 13)
diff --git a/vmblock-only/shared/compat_namei.h b/vmblock-only/shared/compat_namei.h
index f82dd49..426d40b 100644
--- a/vmblock-only/shared/compat_namei.h
+++ b/vmblock-only/shared/compat_namei.h
@@ -45,4 +45,20 @@
#define compat_path_lookup(name, flags, nd) path_lookup(name, flags, nd)
#endif
+/* nameidata struct for 4.2+ */
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,2,0)
+struct nameidata {
+ struct path path;
+ struct qstr last;
+ struct path root;
+ struct inode *inode; /* path.dentry.d_inode */
+ unsigned int flags;
+ unsigned seq, m_seq;
+ int last_type;
+ unsigned depth;
+ struct file *base;
+ char *saved_names[MAX_NESTED_LINKS + 1];
+};
+#endif
+
#endif /* __COMPAT_NAMEI_H__ */

View File

@@ -0,0 +1,294 @@
diff --git a/vmci-only/Makefile b/vmci-only/Makefile
index c630705..18357e5 100644
--- a/vmci-only/Makefile
+++ b/vmci-only/Makefile
@@ -43,7 +43,11 @@ INCLUDE += -I$(SRCROOT)/shared
endif
+ifdef KVERSION
+VM_UNAME = $(KVERSION)
+else
VM_UNAME = $(shell uname -r)
+endif
# Header directory for the running kernel
ifdef LINUXINCLUDE
diff --git a/vmci-only/Makefile.kernel b/vmci-only/Makefile.kernel
index 8e6e7d0..28eb503 100644
--- a/vmci-only/Makefile.kernel
+++ b/vmci-only/Makefile.kernel
@@ -21,7 +21,7 @@ CC_OPTS += -DVMCI
INCLUDE += -I$(SRCROOT)/shared -I$(SRCROOT)/common -I$(SRCROOT)/linux
-EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE)
+EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE) $(LINUXINCLUDE)
obj-m += $(DRIVER).o
diff --git a/vmci-only/linux/driver.c b/vmci-only/linux/driver.c
index f676166..9e42f3f 100644
--- a/vmci-only/linux/driver.c
+++ b/vmci-only/linux/driver.c
@@ -26,6 +26,7 @@
#include <linux/file.h>
#include <linux/fs.h>
+#include <linux/vmalloc.h>
#include <linux/init.h>
#if defined(__x86_64__) && LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12)
# include <linux/ioctl32.h>
@@ -1466,12 +1467,19 @@ VMCIUserVALockPage(VA addr) // IN:
int retval;
down_read(&current->mm->mmap_sem);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
- retval = get_user_pages(addr, 1, 1, 0, &page, NULL);
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99)
+ retval = get_user_pages(addr,
#else
retval = get_user_pages(current, current->mm, addr,
- 1, 1, 0, &page, NULL);
#endif
+ 1,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
+ 1, 0,
+#else
+ FOLL_WRITE,
+#endif
+ &page, NULL);
+
up_read(&current->mm->mmap_sem);
if (retval != 1) {
@@ -1686,7 +1694,11 @@ vmci_guest_init(void)
/* This should be last to make sure we are done initializing. */
retval = pci_register_driver(&vmci_driver);
if (retval < 0) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
vfree(data_buffer);
+#else
+ kvfree(data_buffer);
+#endif
data_buffer = NULL;
return retval;
}
@@ -1722,12 +1734,25 @@
vmci_dev.msix_entries[i].vector = i;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 12, 0)
result = pci_enable_msix(pdev, vmci_dev.msix_entries, VMCI_MAX_INTRS);
if (!result) {
vmci_dev.exclusive_vectors = TRUE;
} else if (result > 0) {
result = pci_enable_msix(pdev, vmci_dev.msix_entries, 1);
}
+#else
+ result = pci_enable_msix_range(pdev, vmci_dev.msix_entries, VMCI_MAX_INTRS,
+ VMCI_MAX_INTRS);
+ if (result > 0) {
+ vmci_dev.exclusive_vectors = TRUE;
+ } else if (result == -ENOSPC) {
+ result = pci_enable_msix_range(pdev, vmci_dev.msix_entries, 1, 1);
+ }
+
+ if (result > 0)
+ result = 0;
+#endif
return result;
}
@@ -2480,7 +2505,11 @@ vmci_exit(void)
if (guestDeviceInit) {
pci_unregister_driver(&vmci_driver);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
vfree(data_buffer);
+#else
+ kvfree(data_buffer);
+#endif
data_buffer = NULL;
guestDeviceInit = FALSE;
}
@@ -2490,7 +2519,7 @@ vmci_exit(void)
VMCI_HostCleanup();
- retval = misc_deregister(&linuxState.misc);
+ retval = compat_misc_deregister(&linuxState.misc);
if (retval) {
Warning(LGPFX "Module %s: error unregistering\n", VMCI_MODULE_NAME);
} else {
diff --git a/vmci-only/linux/vmciKernelIf.c b/vmci-only/linux/vmciKernelIf.c
index 3fba8b6..1836442 100644
--- a/vmci-only/linux/vmciKernelIf.c
+++ b/vmci-only/linux/vmciKernelIf.c
@@ -40,6 +40,10 @@
#include <linux/socket.h> /* For memcpy_{to,from}iovec(). */
#include <linux/vmalloc.h>
#include <linux/wait.h>
+#include <linux/skbuff.h>
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 99)
+#include <linux/sched/signal.h>
+#endif
#include "compat_highmem.h"
#include "compat_interrupt.h"
@@ -1198,16 +1199,29 @@ __VMCIMemcpyToQueue(VMCIQueue *queue, // OUT:
}
if (isIovec) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
struct iovec *iov = (struct iovec *)src;
+#else
+ struct msghdr *msg = (struct msghdr *)src;
+#endif
int err;
/* The iovec will track bytesCopied internally. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
err = memcpy_fromiovec((uint8 *)va + pageOffset, iov, toCopy);
+#else
+ err = memcpy_from_msg((uint8 *)va + pageOffset, msg, toCopy);
+#endif
if (err != 0) {
if (kernelIf->host) {
kunmap(kernelIf->u.h.page[pageIndex]);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
}
return VMCI_ERROR_INVALID_ARGS;
+#else
+ return VMCI_ERROR_INVALID_ARGS;
+ }
+#endif
}
} else {
memcpy((uint8 *)va + pageOffset, (uint8 *)src + bytesCopied, toCopy);
@@ -1273,11 +1287,19 @@ __VMCIMemcpyFromQueue(void *dest, // OUT:
}
if (isIovec) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
struct iovec *iov = (struct iovec *)dest;
+#else
+ struct msghdr *msg = (struct msghdr *)dest;
+#endif
int err;
/* The iovec will track bytesCopied internally. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
err = memcpy_toiovec(iov, (uint8 *)va + pageOffset, toCopy);
+#else
+ err = memcpy_to_msg(msg, (uint8 *)va + pageOffset, toCopy);
+#endif
if (err != 0) {
if (kernelIf->host) {
kunmap(kernelIf->u.h.page[pageIndex]);
@@ -1834,7 +1856,11 @@ VMCIReleasePages(struct page **pages, // IN
if (dirty) {
set_page_dirty(pages[i]);
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99)
+ put_page(pages[i]);
+#else
page_cache_release(pages[i]);
+#endif
pages[i] = NULL;
}
}
@@ -2048,21 +2074,22 @@ VMCIHost_GetUserMemory(VA64 produceUVA, // IN
int err = VMCI_SUCCESS;
down_write(&current->mm->mmap_sem);
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99)
retval = get_user_pages((VA)produceUVA,
- produceQ->kernelIf->numPages,
- 1, 0,
- produceQ->kernelIf->u.h.headerPage,
- NULL);
#else
retval = get_user_pages(current,
current->mm,
(VA)produceUVA,
+#endif
produceQ->kernelIf->numPages,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
1, 0,
+#else
+ FOLL_WRITE,
+#endif
produceQ->kernelIf->u.h.headerPage,
NULL);
-#endif
+
if (retval < produceQ->kernelIf->numPages) {
Log("get_user_pages(produce) failed (retval=%d)\n", retval);
VMCIReleasePages(produceQ->kernelIf->u.h.headerPage, retval, FALSE);
@@ -2070,11 +2097,19 @@ VMCIHost_GetUserMemory(VA64 produceUVA, // IN
goto out;
}
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99)
+ retval = get_user_pages((VA)consumeUVA,
+#else
retval = get_user_pages(current,
current->mm,
(VA)consumeUVA,
+#endif
consumeQ->kernelIf->numPages,
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 9, 0)
1, 0,
+#else
+ FOLL_WRITE,
+#endif
consumeQ->kernelIf->u.h.headerPage,
NULL);
if (retval < consumeQ->kernelIf->numPages) {
diff --git a/vmci-only/shared/compat_module.h b/vmci-only/shared/compat_module.h
index 2af7372..729aedc 100644
--- a/vmci-only/shared/compat_module.h
+++ b/vmci-only/shared/compat_module.h
@@ -80,4 +80,13 @@ static const char __module_cat(tag, __LINE__)[] \
typedef int compat_mod_param_bool;
#endif
+/*
+ * Linux kernel >= 4.2.99 does not return anything from misc_deregister
+ */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 2, 99)
+#define compat_misc_deregister(misc) misc_deregister(misc)
+#else
+#define compat_misc_deregister(misc) ({misc_deregister(misc);0;})
+#endif
+
#endif /* __COMPAT_MODULE_H__ */
diff --git a/vmci-only/shared/vm_device_version.h b/vmci-only/shared/vm_device_version.h
index e2cb477..3dd7097 100644
--- a/vmci-only/shared/vm_device_version.h
+++ b/vmci-only/shared/vm_device_version.h
@@ -53,7 +53,9 @@
* VMware HD Audio codec
* VMware HD Audio controller
*/
+#ifndef PCI_VENDOR_ID_VMWARE
#define PCI_VENDOR_ID_VMWARE 0x15AD
+#endif
#define PCI_DEVICE_ID_VMWARE_SVGA2 0x0405
#define PCI_DEVICE_ID_VMWARE_SVGA 0x0710
#define PCI_DEVICE_ID_VMWARE_VGA 0x0711
diff --git a/vmci-only/shared/vmci_kernel_if.h b/vmci-only/shared/vmci_kernel_if.h
index 9def671..082fe59 100644
--- a/vmci-only/shared/vmci_kernel_if.h
+++ b/vmci-only/shared/vmci_kernel_if.h
@@ -100,7 +100,7 @@
typedef Semaphore VMCIEvent;
typedef Semaphore VMCIMutex;
typedef World_ID VMCIHostVmID;
- typedef uint32 VMCIHostUser;
+ typedef uint32_t VMCIHostUser;
typedef PPN *VMCIQPGuestMem;
#elif defined(__linux__)
typedef spinlock_t VMCILock;

View File

@@ -0,0 +1,266 @@
diff --git a/vsock-only/Makefile b/vsock-only/Makefile
index 5d92e9b..7d315e8 100644
--- a/vsock-only/Makefile
+++ b/vsock-only/Makefile
@@ -42,8 +42,11 @@ AUTOCONF_DIR := $(SRCROOT)/shared/autoconf
INCLUDE += -I$(SRCROOT)/shared
endif
-
+ifdef KVERSION
+VM_UNAME = $(KVERSION)
+else
VM_UNAME = $(shell uname -r)
+endif
# Header directory for the running kernel
ifdef LINUXINCLUDE
diff --git a/vsock-only/Makefile.kernel b/vsock-only/Makefile.kernel
index 5218df2..374cc1f 100644
--- a/vsock-only/Makefile.kernel
+++ b/vsock-only/Makefile.kernel
@@ -25,7 +25,7 @@ INCLUDE += -I$(SRCROOT)/include
INCLUDE += -I$(SRCROOT)/linux
INCLUDE += -I$(SRCROOT)/common
-EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE)
+EXTRA_CFLAGS := $(CC_OPTS) $(INCLUDE) $(LINUXINCLUDE)
EXTRA_CFLAGS += $(call vm_check_build, $(AUTOCONF_DIR)/netcreate_num_params.c, -DVMW_NETCREATE_KERNARG, )
diff --git a/vsock-only/linux/af_vsock.c b/vsock-only/linux/af_vsock.c
index bde1497..9f8f843 100644
--- a/vsock-only/linux/af_vsock.c
+++ b/vsock-only/linux/af_vsock.c
@@ -113,6 +113,9 @@
asmlinkage __attribute__((weak)) long
sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg);
#endif
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 10, 99)
+#include <linux/sched/signal.h>
+#endif
#include "compat_cred.h"
#include "compat_module.h"
@@ -213,7 +216,11 @@
struct sockaddr *addr, int addrLen, int flags);
static int VSockVmciStreamConnect(struct socket *sock,
struct sockaddr *addr, int addrLen, int flags);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
static int VSockVmciAccept(struct socket *sock, struct socket *newsock, int flags);
+#else
+static int VSockVmciAccept(struct socket *sock, struct socket *newsock, int flags, bool kern);
+#endif
static int VSockVmciGetname(struct socket *sock,
struct sockaddr *addr, int *addrLen, int peer);
static unsigned int VSockVmciPoll(struct file *file,
@@ -233,13 +240,29 @@ static int VSockVmciStreamSetsockopt(struct socket *sock, int level, int optname
static int VSockVmciStreamGetsockopt(struct socket *sock, int level, int optname,
char __user *optval, int __user * optlen);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
static int VSockVmciDgramSendmsg(struct kiocb *kiocb,
+#else
+static int VSockVmciDgramSendmsg(
+#endif
struct socket *sock, struct msghdr *msg, size_t len);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
static int VSockVmciDgramRecvmsg(struct kiocb *kiocb, struct socket *sock,
+#else
+static int VSockVmciDgramRecvmsg(struct socket *sock,
+#endif
struct msghdr *msg, size_t len, int flags);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
static int VSockVmciStreamSendmsg(struct kiocb *kiocb,
+#else
+static int VSockVmciStreamSendmsg(
+#endif
struct socket *sock, struct msghdr *msg, size_t len);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
static int VSockVmciStreamRecvmsg(struct kiocb *kiocb, struct socket *sock,
+#else
+static int VSockVmciStreamRecvmsg(struct socket *sock,
+#endif
struct msghdr *msg, size_t len, int flags);
static int VSockVmciCreate(
@@ -2872,11 +2895,18 @@ __VSockVmciCreate(struct net *net, // IN: Network namespace
* From 2.6.9 to until 2.6.12 sk_alloc() used a cache in
* the protocol structure, but you still had to specify the size and cache
* yourself.
- * Most recently (in 2.6.24), sk_alloc() was changed to expect the
+ * In 2.6.24, sk_alloc() was changed to expect the
* network namespace, and the option to zero the sock was dropped.
*
+ * In 4.2, another parameter was added to sk_alloc() allowing you to specify
+ * whether or not the socket is to be a kernel socket. Previously, we passed
+ * 1 to this new parameter, but following Gentoo's lead
+ * ( https://github.com/gentoo/vmware/blob/master/app-emulation/vmware-modules/files/308-4.02-01-sk_alloc.patch#L19 )
+ * we have switched to passing 0.
*/
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12)
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 99)
+ sk = sk_alloc(net, vsockVmciFamilyOps.family, priority, &vsockVmciProto, 0);
+#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 12)
sk = sk_alloc(vsockVmciFamilyOps.family, priority,
vsockVmciProto.slab_obj_size, vsockVmciProto.slab);
#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
@@ -3825,7 +3855,12 @@
static int
VSockVmciAccept(struct socket *sock, // IN
struct socket *newsock, // IN/OUT
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 11, 0)
int flags) // IN
+#else
+ int flags, // IN
+ bool kern)
+#endif
{
struct sock *listener;
int err;
@@ -4260,7 +4295,11 @@ VSockVmciShutdown(struct socket *sock, // IN
*/
static int
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
VSockVmciDgramSendmsg(struct kiocb *kiocb, // UNUSED
+#else
+VSockVmciDgramSendmsg(
+#endif
struct socket *sock, // IN: socket to send on
struct msghdr *msg, // IN: message to send
size_t len) // IN: length of message
@@ -4352,7 +4391,11 @@ VSockVmciDgramSendmsg(struct kiocb *kiocb, // UNUSED
goto out;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
memcpy_fromiovec(VMCI_DG_PAYLOAD(dg), msg->msg_iov, len);
+#else
+ memcpy_from_msg(VMCI_DG_PAYLOAD(dg), msg, len);
+#endif
dg->dst = VMCI_MAKE_HANDLE(remoteAddr->svm_cid, remoteAddr->svm_port);
dg->src = VMCI_MAKE_HANDLE(vsk->localAddr.svm_cid, vsk->localAddr.svm_port);
@@ -4590,7 +4633,11 @@ VSockVmciStreamGetsockopt(struct socket *sock, // IN
*/
static int
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
VSockVmciStreamSendmsg(struct kiocb *kiocb, // UNUSED
+#else
+VSockVmciStreamSendmsg(
+#endif
struct socket *sock, // IN: socket to send on
struct msghdr *msg, // IN: message to send
size_t len) // IN: length of message
@@ -4712,7 +4759,11 @@ VSockVmciStreamSendmsg(struct kiocb *kiocb, // UNUSED
* able to send.
*/
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
written = vmci_qpair_enquev(vsk->qpair, msg->msg_iov,
+#else
+ written = vmci_qpair_enquev(vsk->qpair, &msg->msg_iter.iov,
+#endif
len - totalWritten, 0);
if (written < 0) {
err = -ENOMEM;
@@ -4759,7 +4810,11 @@ out:
*/
static int
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
VSockVmciDgramRecvmsg(struct kiocb *kiocb, // UNUSED
+#else
+VSockVmciDgramRecvmsg(
+#endif
struct socket *sock, // IN: socket to receive from
struct msghdr *msg, // IN/OUT: message to receive into
size_t len, // IN: length of receive buffer
@@ -4809,7 +4864,11 @@ VSockVmciDgramRecvmsg(struct kiocb *kiocb, // UNUSED
}
/* Place the datagram payload in the user's iovec. */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
err = skb_copy_datagram_iovec(skb, sizeof *dg, msg->msg_iov, payloadLen);
+#else
+ err = skb_copy_datagram_iter(skb, sizeof *dg, &msg->msg_iter, payloadLen);
+#endif
if (err) {
goto out;
}
@@ -4850,7 +4909,11 @@ out:
*/
static int
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 99)
VSockVmciStreamRecvmsg(struct kiocb *kiocb, // UNUSED
+#else
+VSockVmciStreamRecvmsg(
+#endif
struct socket *sock, // IN: socket to receive from
struct msghdr *msg, // IN/OUT: message to receive into
size_t len, // IN: length of receive buffer
@@ -4955,9 +5018,17 @@ VSockVmciStreamRecvmsg(struct kiocb *kiocb, // UNUSED
}
if (flags & MSG_PEEK) {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
read = vmci_qpair_peekv(vsk->qpair, msg->msg_iov, len - copied, 0);
+#else
+ read = vmci_qpair_peekv(vsk->qpair, &msg->msg_iter.iov, len - copied, 0);
+#endif
} else {
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0)
read = vmci_qpair_dequev(vsk->qpair, msg->msg_iov, len - copied, 0);
+#else
+ read = vmci_qpair_dequev(vsk->qpair, &msg->msg_iter.iov, len - copied, 0);
+#endif
}
if (read < 0) {
diff --git a/vsock-only/linux/notify.c b/vsock-only/linux/notify.c
index 5b1e134..82d8738 100644
--- a/vsock-only/linux/notify.c
+++ b/vsock-only/linux/notify.c
@@ -516,7 +516,11 @@ VSockVmciHandleWrote(struct sock *sk, // IN
PKT_FIELD(vsk, sentWaitingRead) = FALSE;
#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
sk->sk_data_ready(sk, 0);
+#else
+ sk->sk_data_ready(sk);
+#endif
}
diff --git a/vsock-only/linux/notifyQState.c b/vsock-only/linux/notifyQState.c
index 464454b..7933be7 100644
--- a/vsock-only/linux/notifyQState.c
+++ b/vsock-only/linux/notifyQState.c
@@ -164,7 +164,11 @@ VSockVmciHandleWrote(struct sock *sk, // IN
struct sockaddr_vm *dst, // IN: unused
struct sockaddr_vm *src) // IN: unused
{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
sk->sk_data_ready(sk, 0);
+#else
+ sk->sk_data_ready(sk);
+#endif
}
@@ -566,7 +570,11 @@ VSockVmciNotifyPktRecvPostDequeue(struct sock *sk, // IN
}
/* See the comment in VSockVmciNotifyPktSendPostEnqueue */
+#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
sk->sk_data_ready(sk, 0);
+#else
+ sk->sk_data_ready(sk);
+#endif
}
return err;