summarylogtreecommitdiffstats
path: root/vmmon.patch
diff options
context:
space:
mode:
authorJean-Marc Lenoir2019-07-27 13:06:24 +0200
committerJean-Marc Lenoir2019-07-27 13:06:24 +0200
commita425dd009dd8d22a4c541610bea347a549358a2a (patch)
treeb45ceead489cafde815d4e5fe206acf230d9c95d /vmmon.patch
parente1c74ee0aeae4e484d297362f9961f16213fc247 (diff)
downloadaur-vmware-workstation11.tar.gz
Compatibility with Linux 5.3-rc1
Diffstat (limited to 'vmmon.patch')
-rw-r--r--vmmon.patch373
1 files changed, 176 insertions, 197 deletions
diff --git a/vmmon.patch b/vmmon.patch
index a801be3b146..df5d5a69913 100644
--- a/vmmon.patch
+++ b/vmmon.patch
@@ -1,5 +1,3 @@
-diff --git a/vmmon/Makefile b/vmmon/Makefile
-index de8162e..6124a71 100644
--- a/vmmon/Makefile
+++ b/vmmon/Makefile
@@ -43,7 +43,11 @@ INCLUDE += -I$(SRCROOT)/shared
@@ -14,8 +12,6 @@ index de8162e..6124a71 100644
# Header directory for the running kernel
ifdef LINUXINCLUDE
-diff --git a/vmmon/common/hostif.h b/vmmon/common/hostif.h
-index 865abc0..2b94ce1 100644
--- a/vmmon/common/hostif.h
+++ b/vmmon/common/hostif.h
@@ -122,14 +122,10 @@ EXTERN MPN64 HostIF_GetNextAnonPage(VMDriver *vm, MPN64 mpn);
@@ -45,8 +41,6 @@ index 865abc0..2b94ce1 100644
+#endif
+
#endif // ifdef _HOSTIF_H_
-diff --git a/vmmon/common/memtrack.c b/vmmon/common/memtrack.c
-index e53daeb..eec9844 100644
--- a/vmmon/common/memtrack.c
+++ b/vmmon/common/memtrack.c
@@ -88,6 +88,7 @@
@@ -170,8 +164,6 @@ index e53daeb..eec9844 100644
/*
-diff --git a/vmmon/common/memtrack.h b/vmmon/common/memtrack.h
-index 977c5af..6d104ad 100644
--- a/vmmon/common/memtrack.h
+++ b/vmmon/common/memtrack.h
@@ -31,30 +31,22 @@
@@ -206,8 +198,6 @@ index 977c5af..6d104ad 100644
-#endif
#endif // _MEMTRACK_H_
-diff --git a/vmmon/common/task.c b/vmmon/common/task.c
-index de2429e..228996e 100644
--- a/vmmon/common/task.c
+++ b/vmmon/common/task.c
@@ -39,6 +39,9 @@
@@ -273,8 +263,6 @@ index de2429e..228996e 100644
/*
* We can't allocate memory with interrupts disabled on all hosts
-diff --git a/vmmon/common/vmx86.c b/vmmon/common/vmx86.c
-index dbe794c..156e94a 100644
--- a/vmmon/common/vmx86.c
+++ b/vmmon/common/vmx86.c
@@ -720,6 +720,35 @@ cleanup:
@@ -313,8 +301,6 @@ index dbe794c..156e94a 100644
/*
*----------------------------------------------------------------------
*
-diff --git a/vmmon/common/vmx86.h b/vmmon/common/vmx86.h
-index 71ea01b..9e227ca 100644
--- a/vmmon/common/vmx86.h
+++ b/vmmon/common/vmx86.h
@@ -106,6 +106,7 @@ extern PseudoTSC pseudoTSC;
@@ -325,7 +311,6 @@ index 71ea01b..9e227ca 100644
extern int Vmx86_ReleaseVM(VMDriver *vm);
extern int Vmx86_InitVM(VMDriver *vm, InitBlock *initParams);
extern int Vmx86_LateInitVM(VMDriver *vm);
-diff --git a/vmmon/include/compat_cred.h b/vmmon/include/compat_cred.h
--- a/vmmon/include/compat_cred.h
+++ b/vmmon/include/compat_cred.h
@@ -24,7 +24,11 @@
@@ -340,8 +325,6 @@ diff --git a/vmmon/include/compat_cred.h b/vmmon/include/compat_cred.h
#if !defined(current_fsuid) && LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 29)
#define current_uid() (current->uid)
-diff --git a/vmmon/include/compat_pgtable.h b/vmmon/include/compat_pgtable.h
-index dedc25a..4722d4e 100644
--- a/vmmon/include/compat_pgtable.h
+++ b/vmmon/include/compat_pgtable.h
@@ -30,80 +30,32 @@
@@ -459,8 +442,6 @@ index dedc25a..4722d4e 100644
#endif /* __COMPAT_PGTABLE_H__ */
-diff --git a/vmmon/include/pgtbl.h b/vmmon/include/pgtbl.h
-index 39ef4e1..0935e09 100644
--- a/vmmon/include/pgtbl.h
+++ b/vmmon/include/pgtbl.h
@@ -26,154 +26,14 @@
@@ -849,10 +830,25 @@ index 39ef4e1..0935e09 100644
-
-
#endif /* __PGTBL_H__ */
-diff --git a/vmmon/linux/driver.c b/vmmon/linux/driver.c
-index 87cf45b..5390a93 100644
--- a/vmmon/linux/driver.c
+++ b/vmmon/linux/driver.c
+@@ -80,6 +80,16 @@
+
+ struct VMXLinuxState linuxState;
+
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
++static inline void do_gettimeofday(struct timeval *tv)
++{
++ struct timespec64 now;
++
++ ktime_get_real_ts64(&now);
++ tv->tv_sec = now.tv_sec;
++ tv->tv_usec = now.tv_nsec / 1000;
++}
++#endif
+
+ /*
+ *----------------------------------------------------------------------
@@ -108,7 +108,9 @@
static int LinuxDriver_Close(struct inode *inode, struct file *filp);
@@ -987,8 +983,6 @@ index 87cf45b..5390a93 100644
break;
}
-diff --git a/vmmon/linux/hostif.c b/vmmon/linux/hostif.c
-index fd32013..583d6da 100644
--- a/vmmon/linux/hostif.c
+++ b/vmmon/linux/hostif.c
@@ -77,19 +77,22 @@
@@ -1037,6 +1031,20 @@ index fd32013..583d6da 100644
return retval != numPages;
}
+@@ -1606,9 +1606,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
+
+ #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 28)
+ return MemDefaults_CalcMaxLockedPages(totalPhysicalPages);
@@ -1626,12 +1631,34 @@ HostIF_EstimateLockedPageLimit(const VMDriver* vm, // IN
unsigned int reservedPages = MEMDEFAULTS_MIN_HOST_PAGES;
unsigned int hugePages = (vm == NULL) ? 0 :
@@ -1077,7 +1085,64 @@ index fd32013..583d6da 100644
if (anonPages > swapPages) {
lockedPages += anonPages - swapPages;
-@@ -1726,9 +1753,6 @@
+@@ -1691,6 +1717,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,
+@@ -1719,16 +1788,12 @@
+ static uint64
+ HostIFReadUptimeWork(unsigned long *j) // OUT: current jiffies
+ {
+- struct timeval tv;
+ uint64 monotime, uptime, upBase, monoBase;
+ int64 diff;
+ uint32 version;
unsigned long jifs, jifBase;
unsigned int attempts = 0;
@@ -1087,6 +1152,21 @@ index fd32013..583d6da 100644
retry:
do {
version = VersionedAtomic_BeginTryRead(&uptimeState.version);
+@@ -1737,13 +1802,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;
+
+ /*
@@ -1794,7 +1818,7 @@ HostIFReadUptimeWork(unsigned long *j) // OUT: current jiffies
*/
@@ -1096,9 +1176,20 @@ index fd32013..583d6da 100644
{
unsigned long jifs;
uintptr_t flags;
-@@ -1856,8 +1880,13 @@ HostIF_InitUptime(void)
- -(tv.tv_usec * (UPTIME_FREQ / 1000000) +
- tv.tv_sec * UPTIME_FREQ));
+@@ -1848,16 +1912,19 @@
+ 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);
@@ -1298,8 +1389,20 @@ index fd32013..583d6da 100644
/*
*----------------------------------------------------------------------
-diff --git a/vmmon/vmcore/moduleloop.c b/vmmon/vmcore/moduleloop.c
-index 94aab9e..a6b2c1a 100644
+@@ -3512,7 +3684,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);
+
--- a/vmmon/vmcore/moduleloop.c
+++ b/vmmon/vmcore/moduleloop.c
@@ -205,11 +205,13 @@ skipTaskSwitch:;
@@ -1343,165 +1446,6 @@ index ccdd295..b4b71fb 100644
MODULEBUILDDIR=$(MODULEBUILDDIR) modules
$(MAKE) -C $$PWD SRCROOT=$$PWD/$(SRCROOT) \
MODULEBUILDDIR=$(MODULEBUILDDIR) postbuild
-From ca44ce7215b91f82ff500843784b4e86a720fffe Mon Sep 17 00:00:00 2001
-From: Michal Kubecek <mkubecek@suse.cz>
-Date: Mon, 31 Dec 2018 00:11:35 +0100
-Subject: [PATCH] vmmon: totalram_pages is a function since 5.0
-
-Since commit ca79b0c211af ("mm: convert totalram_pages and totalhigh_pages
-variables to atomic") in v5.0-rc1, totalram_pages() is an accessor function
-and the actual variable is an atomic.
----
- vmmon-only/linux/hostif.c | 18 ++++++++++--------
- 1 file changed, 10 insertions(+), 8 deletions(-)
-
-diff --git a/vmmon-only/linux/hostif.c b/vmmon-only/linux/hostif.c
-index af4b1d9..d32653c 100644
---- a/vmmon-only/linux/hostif.c
-+++ b/vmmon-only/linux/hostif.c
-@@ -211,6 +211,15 @@ static void UnlockEntry(void *clientData, MemTrackEntry *entryPtr);
- uint8 monitorIPIVector;
- uint8 hvIPIVector;
-
-+static unsigned long compat_totalram_pages(void)
-+{
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0)
-+ return totalram_pages;
-+#else
-+ return totalram_pages();
-+#endif
-+}
-+
- /*
- *-----------------------------------------------------------------------------
- *
-@@ -1601,14 +1610,7 @@ unsigned int
- HostIF_EstimateLockedPageLimit(const VMDriver* vm, // IN
- unsigned int currentlyLockedPages) // IN
- {
-- /*
-- * This variable is available and exported to modules,
-- * since at least 2.6.0.
-- */
--
-- extern unsigned long totalram_pages;
--
-- unsigned int totalPhysicalPages = totalram_pages;
-+ unsigned int totalPhysicalPages = compat_totalram_pages();
-
- #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 28)
- return MemDefaults_CalcMaxLockedPages(totalPhysicalPages);
-From c3fb5cda191137afddfdbd2f31bb4b15f9aeb3f2 Mon Sep 17 00:00:00 2001
-From: Michal Kubecek <mkubecek@suse.cz>
-Date: Mon, 31 Dec 2018 00:15:11 +0100
-Subject: [PATCH] vmmon: bring back the do_gettimeofday() helper
-
-The do_gettimeofday() helper was removed by commit e4b92b108c6c
-("timekeeping: remove obsolete time accessors") in v5.0-rc1. Bring it back
-for users in vmmon-only/linux/hostif.c.
-
-This feels like a quick and clumsy band aid to allow build with post-4.20
-kernels. On a closer look, the whole gymnastics around uptimeState and
-HostIFReadUptimeWork() with jiffies and wall time checking and correcting
-each other seems to be a workaround for an absence of high resolution
-monotonic time. Considering ktime_get_ts64() is available since 3.17 and
-before that, ktime_get_ts() since 2.6.17, perhaps the time has come to
-clean all this machinery up. But something like this would be beyond the
-scope of this repository.
----
- vmmon-only/include/compat_timekeeping32.h | 15 +++++++++++++++
- vmmon-only/linux/driver.c | 1 +
- vmmon-only/linux/hostif.c | 1 +
- vmnet-only/bridge.c | 11 +++++++++++
- 4 files changed, 28 insertions(+)
- create mode 100644 vmmon-only/include/compat_timekeeping32.h
-
-diff --git a/vmmon-only/include/compat_timekeeping32.h b/vmmon-only/include/compat_timekeeping32.h
-new file mode 100644
-index 0000000..5730dcd
---- /dev/null
-+++ b/vmmon-only/include/compat_timekeeping32.h
-@@ -0,0 +1,15 @@
-+#ifndef __COMPAT_TIMEKEEPING32_H__
-+#define __COMPAT_TIMEKEEPING32_H__
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 0, 0)
-+static inline void do_gettimeofday(struct timeval *tv)
-+{
-+ struct timespec64 now;
-+
-+ ktime_get_real_ts64(&now);
-+ tv->tv_sec = now.tv_sec;
-+ tv->tv_usec = now.tv_nsec / 1000;
-+}
-+#endif
-+
-+#endif /* __COMPAT_TIMEKEEPING32_H__ */
-diff --git a/vmmon-only/linux/driver.c b/vmmon-only/linux/driver.c
-index ca4b538..cdc7fc1 100644
---- a/vmmon-only/linux/driver.c
-+++ b/vmmon-only/linux/driver.c
-@@ -34,6 +34,7 @@
- #include "compat_version.h"
- #include "compat_module.h"
- #include "compat_page.h"
-+#include "compat_timekeeping32.h"
-
- #include "usercalldefs.h"
-
-diff --git a/vmmon-only/linux/hostif.c b/vmmon-only/linux/hostif.c
-index c985aa0..75f4c8a 100644
---- a/vmmon-only/linux/hostif.c
-+++ b/vmmon-only/linux/hostif.c
-@@ -102,6 +102,7 @@
- #include "pgtbl.h"
- #include "vmmonInt.h"
- #include "versioned_atomic.h"
-+#include "compat_timekeeping32.h"
-
- /*
- * Determine if we can use high resolution timers.
-From 5db3c8a86f435e21f37a2acf386e2e52a1b42aa6 Mon Sep 17 00:00:00 2001
-From: Michal Kubecek <mkubecek@suse.cz>
-Date: Sat, 5 Jan 2019 01:54:57 +0100
-Subject: [PATCH] modules: handle access_ok() with two arguments
-
-Since commit 96d4f267e40f ("Remove 'type' argument from access_ok()
-function") in v5.0-rc1, the type argument of access_ok() was dropped.
-The same commit also dropped macros VERIFY_READ and VERIFY_WRITE so check
-for their existence on pre-5.0 kernels to allow build against kernels with
-this change backported.
----
- vmmon-only/linux/hostif.c | 8 +++++++-
- vmnet-only/userif.c | 8 +++++++-
- 2 files changed, 14 insertions(+), 2 deletions(-)
-
-diff --git a/vmmon-only/linux/hostif.c b/vmmon-only/linux/hostif.c
-index 75f4c8a..987932b 100644
---- a/vmmon-only/linux/hostif.c
-+++ b/vmmon-only/linux/hostif.c
-@@ -221,6 +221,12 @@ static unsigned long compat_totalram_pages(void)
- #endif
- }
-
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 0, 0) && defined(VERIFY_WRITE)
-+ #define write_access_ok(addr, size) access_ok(VERIFY_WRITE, addr, size)
-+#else
-+ #define write_access_ok(addr, size) access_ok(addr, size)
-+#endif
-+
- /*
- *-----------------------------------------------------------------------------
- *
-@@ -3644,7 +3650,7 @@ HostIF_MapUserMem(VA addr, // IN: User memory virtual address
-
- ASSERT(handle);
-
-- if (!access_ok(VERIFY_WRITE, p, size)) {
-+ if (!write_access_ok(p, size)) {
- printk(KERN_ERR "%s: Couldn't verify write to uva 0x%p with size %"
- FMTSZ"u\n", __func__, p, size);
-
From 41413a9b6e660a93600a438944d85b6f51eb680c Mon Sep 17 00:00:00 2001
From: Michal Kubecek <mkubecek@suse.cz>
Date: Tue, 5 Mar 2019 13:21:35 +0100
@@ -1519,7 +1463,7 @@ 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
-@@ -2311,7 +2311,7 @@ isVAReadable(VA r) // IN:
+@@ -2345,7 +2345,7 @@ isVAReadable(VA r) // IN:
int ret;
old_fs = get_fs();
@@ -1528,7 +1472,7 @@ index ef88a22..8ca17de 100644
r = APICR_TO_ADDR(r, APICR_VERSION);
ret = HostIF_CopyFromUser(&dummy, (void*)r, sizeof(dummy));
set_fs(old_fs);
-@@ -2512,7 +2512,7 @@ HostIF_SemaphoreWait(VMDriver *vm, // IN:
+@@ -2546,7 +2546,7 @@ HostIF_SemaphoreWait(VMDriver *vm, // IN:
}
old_fs = get_fs();
@@ -1537,7 +1481,7 @@ index ef88a22..8ca17de 100644
{
struct poll_wqueues table;
-@@ -2641,7 +2641,7 @@ HostIF_SemaphoreSignal(uint64 *args) // IN:
+@@ -2675,7 +2675,7 @@ HostIF_SemaphoreSignal(uint64 *args) // IN:
}
old_fs = get_fs();
@@ -1570,17 +1514,17 @@ diff --git a/vmmon-only/linux/driver.c b/vmmon-only/linux/driver.c
index cdc7fc1..fd9fdac 100644
--- a/vmmon-only/linux/driver.c
+++ b/vmmon-only/linux/driver.c
-@@ -81,6 +81,9 @@ static Bool LinuxDriverCheckPadding(void);
-
- struct VMXLinuxState linuxState;
-
+@@ -90,6 +90,9 @@ static Bool LinuxDriverCheckPadding(void);
+ tv->tv_usec = now.tv_nsec / 1000;
+ }
+ #endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 17, 0)
+typedef int vm_fault_t;
+#endif
/*
*----------------------------------------------------------------------
-@@ -110,9 +113,9 @@ long LinuxDriver_Ioctl(struct file *filp, u_int iocmd,
+@@ -119,9 +122,9 @@ long LinuxDriver_Ioctl(struct file *filp, u_int iocmd,
static int LinuxDriver_Close(struct inode *inode, struct file *filp);
static unsigned int LinuxDriverPoll(struct file *file, poll_table *wait);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
@@ -1592,7 +1536,7 @@ index cdc7fc1..fd9fdac 100644
#else
static struct page *LinuxDriverNoPage(struct vm_area_struct *vma,
unsigned long address,
-@@ -940,11 +943,11 @@ LinuxDriverPollTimeout(compat_timer_arg_t unused) // IN:
+@@ -949,11 +952,11 @@ LinuxDriverPollTimeout(compat_timer_arg_t unused) // IN:
*/
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
@@ -1607,3 +1551,38 @@ index cdc7fc1..fd9fdac 100644
#else
static struct page *LinuxDriverNoPage(struct vm_area_struct *vma, //IN
unsigned long address, //IN
+From d20641f619bd3766cf5b50b2c750700eab189bd9 Mon Sep 17 00:00:00 2001
+From: Michal Kubecek <mkubecek@suse.cz>
+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 210f281..4da863b 100644
+--- a/vmmon-only/linux/hostif.c
++++ b/vmmon-only/linux/hostif.c
+@@ -3636,7 +3636,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);
+ close_rtc(linuxState.fastClockFile, current->files);
+