--- a/vmmon/Makefile +++ b/vmmon/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 --- a/vmmon/linux/hostif.c +++ a/vmmon/linux/hostif.c @@ -1499,9 +1499,13 @@ * since at least 2.6.0. */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) extern unsigned long totalram_pages; unsigned int totalPhysicalPages = totalram_pages; +#else + unsigned int totalPhysicalPages = totalram_pages(); +#endif /* * Use the memory information linux exports as of late for a more @@ -1602,6 +1606,49 @@ /* *---------------------------------------------------------------------- * + * HostIFGetTime -- + * + * Reads the current time in UPTIME_FREQ units. + * + * Results: + * The uptime, in units of UPTIME_FREQ. + * + * Side effects: + * None. + * + *---------------------------------------------------------------------- + */ + +static uint64 +HostIFGetTime(void) +{ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) + struct timeval tv; + + do_gettimeofday(&tv); + return tv.tv_usec * (UPTIME_FREQ / 1000000) + tv.tv_sec * UPTIME_FREQ; +#else + struct timespec64 now; + + /* + * Use raw time used by Posix timers. This time is not affected by + * NTP adjustments, so it may drift from real time and monotonic time, + * but it will stay in sync with other timers. + */ + ktime_get_raw_ts64(&now); + /* + * UPTIME_FREQ resolution is lower than tv_nsec, + * so we have to do division... + */ + ASSERT_ON_COMPILE(1000000000 % UPTIME_FREQ == 0); + return now.tv_nsec / (1000000000 / UPTIME_FREQ) + now.tv_sec * UPTIME_FREQ; +#endif +} + + +/* + *---------------------------------------------------------------------- + * * HostIFReadUptimeWork -- * * Reads the current uptime. The uptime is based on getimeofday, @@ -1630,7 +1677,6 @@ static uint64 HostIFReadUptimeWork(unsigned long *j) // OUT: current jiffies { - struct timeval tv; uint64 monotime, uptime, upBase, monoBase; int64 diff; uint32 version; @@ -1645,13 +1691,12 @@ monoBase = uptimeState.monotimeBase; } while (!VersionedAtomic_EndTryRead(&uptimeState.version, version)); - do_gettimeofday(&tv); + uptime = HostIFGetTime(); upBase = Atomic_Read64(&uptimeState.uptimeBase); monotime = (uint64)(jifs - jifBase) * (UPTIME_FREQ / HZ); monotime += monoBase; - uptime = tv.tv_usec * (UPTIME_FREQ / 1000000) + tv.tv_sec * UPTIME_FREQ; uptime += upBase; /* @@ -1756,13 +1801,11 @@ void HostIF_InitUptime(void) { - struct timeval tv; + uint64 tm; uptimeState.jiffiesBase = jiffies; - do_gettimeofday(&tv); - Atomic_Write64(&uptimeState.uptimeBase, - -(tv.tv_usec * (UPTIME_FREQ / 1000000) + - tv.tv_sec * UPTIME_FREQ)); + tm = HostIFGetTime(); + Atomic_Write64(&uptimeState.uptimeBase, -tm); #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 15, 0) && !defined(timer_setup) init_timer(&uptimeState.timer); @@ -3200,7 +3243,12 @@ ASSERT(handle); - if (!access_ok(VERIFY_WRITE, p, size)) { +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) + if (!access_ok(VERIFY_WRITE, p, size)) +#else + if (!access_ok(p, size)) +#endif + { printk(KERN_ERR "%s: Couldn't verify write to uva 0x%p with size %" FMTSZ"u\n", __func__, p, size); From 8ba37a5023f939ba8d2e0d91b916ff442b1c18dd Mon Sep 17 00:00:00 2001 From: Michal Kubecek Date: Mon, 31 Dec 2018 00:05:42 +0100 Subject: [PATCH] modules: replace SUBDIRS with M Since commit 0126be38d988 ("kbuild: announce removal of SUBDIRS if used") in v5.0-rc1, using SUBDIRS when building out of tree modules produces a deprecation warning. As M used to work since pretty much ever, use it unconditionally. --- vmmon-only/Makefile | 2 +- vmnet-only/Makefile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/vmmon-only/Makefile b/vmmon-only/Makefile index ccdd295..b4b71fb 100644 --- a/vmmon-only/Makefile +++ b/vmmon-only/Makefile @@ -111,7 +111,7 @@ prebuild:: ; postbuild:: ; $(DRIVER_KO): prebuild - $(MAKE) -C $(BUILD_DIR) SUBDIRS=$$PWD SRCROOT=$$PWD/$(SRCROOT) \ + $(MAKE) -C $(BUILD_DIR) M=$$PWD SRCROOT=$$PWD/$(SRCROOT) \ MODULEBUILDDIR=$(MODULEBUILDDIR) modules $(MAKE) -C $$PWD SRCROOT=$$PWD/$(SRCROOT) \ MODULEBUILDDIR=$(MODULEBUILDDIR) postbuild From 41413a9b6e660a93600a438944d85b6f51eb680c Mon Sep 17 00:00:00 2001 From: Michal Kubecek Date: Tue, 5 Mar 2019 13:21:35 +0100 Subject: [PATCH] vmmon: use KERNEL_DS rather than get_ds() Commit 736706bee329 ("get rid of legacy 'get_ds()' function") in v5.1-rc1 removed get_ds() helper. As this helper always returned KERNEL_DS on x86_64 since the architecture was introduced (and even on i386, it did so since v2.1.0), simply use KERNEL_DS regardless of kernel version. --- vmmon-only/linux/hostif.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vmmon-only/linux/hostif.c b/vmmon-only/linux/hostif.c index ef88a22..8ca17de 100644 --- a/vmmon-only/linux/hostif.c +++ b/vmmon-only/linux/hostif.c @@ -2207,7 +2207,7 @@ isVAReadable(VA r) // IN: int ret; old_fs = get_fs(); - set_fs(get_ds()); + set_fs(KERNEL_DS); r = APICR_TO_ADDR(r, APICR_VERSION); ret = HostIF_CopyFromUser(&dummy, r, sizeof dummy); set_fs(old_fs); @@ -2408,7 +2408,7 @@ HostIF_SemaphoreWait(VMDriver *vm, // IN: } old_fs = get_fs(); - set_fs(get_ds()); + set_fs(KERNEL_DS); { struct poll_wqueues table; @@ -2537,7 +2537,7 @@ HostIF_SemaphoreSignal(uint64 *args) // IN: } old_fs = get_fs(); - set_fs(get_ds()); + set_fs(KERNEL_DS); /* * Always write sizeof(uint64) bytes. This works fine for eventfd and From 2af9d566d0ccc78a93b46a79d23902e5ba2bc933 Mon Sep 17 00:00:00 2001 From: Michal Kubecek Date: Sat, 9 Mar 2019 11:11:29 +0100 Subject: [PATCH] vmmon: fix return type of vm_operations_struct::fault handler Commit 3d3539018d2c ("mm: create the new vm_fault_t type") in mainline 5.1-rc1 changed the definition of vm_fault_t type to unsigned to catch vm_operations_struct::fault handlers which still have int as return value. LinuxDriverFault() in vmmon module is one of those. As handler return type was changed by commit 1c8f422059ae ("mm: change return type to vm_fault_t") in 4.17-rc1, make LinuxDriverFault() always return vm_fault_t and define vm_fault_t as int when building against a pre-4.17 kernel. --- vmmon-only/linux/driver.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/vmmon-only/linux/driver.c b/vmmon-only/linux/driver.c index 92a3529..248a95d 100644 --- a/vmmon-only/linux/driver.c +++ b/vmmon-only/linux/driver.c @@ -73,6 +73,9 @@ static Bool LinuxDriverCheckPadding(void); struct VMXLinuxState linuxState; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0) +typedef int vm_fault_t; +#endif /* *---------------------------------------------------------------------- @@ -97,9 +100,9 @@ long LinuxDriver_Ioctl(struct file *filp, u_int iocmd, static int LinuxDriver_Close(struct inode *inode, struct file *filp); #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) -static int LinuxDriverFault(struct vm_fault *fault); +static vm_fault_t LinuxDriverFault(struct vm_fault *fault); #else -static int LinuxDriverFault(struct vm_area_struct *vma, struct vm_fault *fault); +static vm_fault_t LinuxDriverFault(struct vm_area_struct *vma, struct vm_fault *fault); #endif static int LinuxDriverMmap(struct file *filp, struct vm_area_struct *vma); @@ -594,7 +597,7 @@ LinuxDriver_Close(struct inode *inode, // IN *----------------------------------------------------------------------------- */ -static int +static vm_fault_t #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0) LinuxDriverFault(struct vm_fault *fault) //IN/OUT #else From 98008ff6adec118962df8ac26f814b55c3861efb Mon Sep 17 00:00:00 2001 From: Michal Kubecek Date: Tue, 9 Jul 2019 21:07:04 +0200 Subject: [PATCH] vmmon: fix HostIF_SetFastClockRate() not to use force_sig() Commit 3cf5d076fb4d ("signal: Remove task parameter from force_sig") in v5.3-rc1 drops second argument of force_sig(); before that, all callers which passed something else than current task as second argument were fixed, mostly to use send_sig() instead. The situation in HostIF_SetFastClockRate() is the same as e.g. in bpfilter call fixed by commit 1dfd1711de29 ("signal/bpfilter: Fix bpfilter_kernl to use send_sig not force_sig"): locking in force_sig_info() cannot handle task exiting and using force_sig() for SIGKILL is pointless anyway as this signal cannot be blocked. As send_sig() is present with unchanged signature since the pre-git era, we can use send_sig() unconditionally, regardless of kernel version. --- vmmon-only/linux/hostif.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vmmon-only/linux/hostif.c b/vmmon-only/linux/hostif.c index 850ca02..27eb60c 100644 --- a/vmmon-only/linux/hostif.c +++ b/vmmon-only/linux/hostif.c @@ -3197,7 +3197,7 @@ HostIF_SetFastClockRate(unsigned int rate) // IN: Frequency in Hz. } } else { if (linuxState.fastClockThread) { - force_sig(SIGKILL, linuxState.fastClockThread); + send_sig(SIGKILL, linuxState.fastClockThread, 1); kthread_stop(linuxState.fastClockThread); linuxState.fastClockThread = NULL;