diff options
Diffstat (limited to 'vmci.patch')
-rw-r--r-- | vmci.patch | 162 |
1 files changed, 127 insertions, 35 deletions
diff --git a/vmci.patch b/vmci.patch index 4dc66c59e70c..d1520050ccac 100644 --- a/vmci.patch +++ b/vmci.patch @@ -1,16 +1,62 @@ +diff --git a/vmci/Makefile b/vmci/Makefile +index c630705..18357e5 100644 +--- a/vmci/Makefile ++++ b/vmci/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/Makefile.kernel b/vmci/Makefile.kernel +index 8e6e7d0..28eb503 100644 +--- a/vmci/Makefile.kernel ++++ b/vmci/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/linux/driver.c b/vmci/linux/driver.c -index f676166..8e6f71f 100644 +index f676166..06b3d8a 100644 --- a/vmci/linux/driver.c +++ b/vmci/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> -@@ -1687,7 +1688,11 @@ vmci_guest_init(void) +@@ -1467,12 +1468,13 @@ VMCIUserVALockPage(VA addr) // IN: + int retval; + + down_read(¤t->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, 1, 0, &page, NULL); ++ + up_read(¤t->mm->mmap_sem); + + if (retval != 1) { +@@ -1687,7 +1689,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) { @@ -22,8 +68,8 @@ index f676166..8e6f71f 100644 data_buffer = NULL; return retval; } -@@ -2474,7 +2479,11 @@ vmci_exit(void) - +@@ -2474,7 +2480,11 @@ vmci_exit(void) + if (guestDeviceInit) { pci_unregister_driver(&vmci_driver); +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0) @@ -33,26 +79,18 @@ index f676166..8e6f71f 100644 +#endif guestDeviceInit = FALSE; } - -@@ -2483,12 +2492,16 @@ vmci_exit(void) - + +@@ -2483,7 +2493,7 @@ vmci_exit(void) + VMCI_HostCleanup(); - -+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0) - retval = misc_deregister(&linuxState.misc); + +- retval = misc_deregister(&linuxState.misc); ++ retval = compat_misc_deregister(&linuxState.misc); if (retval) { Warning(LGPFX "Module %s: error unregistering\n", VMCI_MODULE_NAME); } else { - Log(LGPFX"Module %s: unloaded\n", VMCI_MODULE_NAME); - } -+#else -+ misc_deregister(&linuxState.misc); -+#endif - - hostDeviceInit = FALSE; - } diff --git a/vmci/linux/vmciKernelIf.c b/vmci/linux/vmciKernelIf.c -index 3fba8b6..f60d7b1 100644 +index 3fba8b6..d41769f 100644 --- a/vmci/linux/vmciKernelIf.c +++ b/vmci/linux/vmciKernelIf.c @@ -40,6 +40,7 @@ @@ -60,12 +98,12 @@ index 3fba8b6..f60d7b1 100644 #include <linux/vmalloc.h> #include <linux/wait.h> +#include <linux/skbuff.h> - + #include "compat_highmem.h" #include "compat_interrupt.h" -@@ -1198,11 +1199,19 @@ __VMCIMemcpyToQueue(VMCIQueue *queue, // OUT: +@@ -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; @@ -73,19 +111,29 @@ index 3fba8b6..f60d7b1 100644 + 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((u8 *)va + pageOffset, msg, toCopy); ++ err = memcpy_from_msg((uint8 *)va + pageOffset, msg, toCopy); +#endif if (err != 0) { if (kernelIf->host) { kunmap(kernelIf->u.h.page[pageIndex]); -@@ -1273,11 +1282,19 @@ __VMCIMemcpyFromQueue(void *dest, // OUT: ++#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; @@ -93,7 +141,7 @@ index 3fba8b6..f60d7b1 100644 + 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); @@ -103,11 +151,11 @@ index 3fba8b6..f60d7b1 100644 if (err != 0) { if (kernelIf->host) { kunmap(kernelIf->u.h.page[pageIndex]); -@@ -1834,7 +1851,11 @@ VMCIReleasePages(struct page **pages, // IN +@@ -1834,7 +1856,11 @@ VMCIReleasePages(struct page **pages, // IN if (dirty) { set_page_dirty(pages[i]); } -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0) ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99) + put_page(pages[i]); +#else page_cache_release(pages[i]); @@ -115,19 +163,63 @@ index 3fba8b6..f60d7b1 100644 pages[i] = NULL; } } -@@ -2070,8 +2091,12 @@ VMCIHost_GetUserMemory(VA64 produceUVA, // IN +@@ -2048,21 +2074,18 @@ VMCIHost_GetUserMemory(VA64 produceUVA, // IN + int err = VMCI_SUCCESS; + + down_write(¤t->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, + 1, 0, + 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,9 +2093,13 @@ VMCIHost_GetUserMemory(VA64 produceUVA, // IN goto out; } - -+#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 6, 0) -+ retval = get_user_pages( + ++#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 99) ++ retval = get_user_pages((VA)consumeUVA, +#else retval = get_user_pages(current, current->mm, -+#endif (VA)consumeUVA, ++#endif consumeQ->kernelIf->numPages, 1, 0, + consumeQ->kernelIf->u.h.headerPage, +diff --git a/vmci/shared/compat_module.h b/vmci/shared/compat_module.h +index 2af7372..729aedc 100644 +--- a/vmci/shared/compat_module.h ++++ b/vmci/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/shared/vm_device_version.h b/vmci/shared/vm_device_version.h index e2cb477..3dd7097 100644 --- a/vmci/shared/vm_device_version.h |