diff options
author | Jean-Marc Lenoir | 2021-07-14 13:47:45 +0200 |
---|---|---|
committer | Jean-Marc Lenoir | 2021-07-14 13:47:45 +0200 |
commit | 8f9872c4583fd42d09443964e912b2e5f674bf79 (patch) | |
tree | 45f25b3a4562c070fd182bc94cf45591b17c7a12 | |
parent | e034ffb6081741da289113fc9b08ef098b7e03d2 (diff) | |
download | aur-8f9872c4583fd42d09443964e912b2e5f674bf79.tar.gz |
Compatibility with Linux 5.14-rc1
-rw-r--r-- | .SRCINFO | 4 | ||||
-rw-r--r-- | PKGBUILD | 4 | ||||
-rw-r--r-- | vmmon.patch | 96 |
3 files changed, 100 insertions, 4 deletions
@@ -1,7 +1,7 @@ pkgbase = vmware-workstation pkgdesc = The industry standard for running multiple operating systems as virtual machines on a single Linux PC. pkgver = 16.1.2 - pkgrel = 2 + pkgrel = 3 url = https://www.vmware.com/products/workstation-for-linux.html install = vmware-workstation.install arch = x86_64 @@ -55,7 +55,7 @@ pkgbase = vmware-workstation sha256sums = fe1b1be8297f4170406f97dd1f8b385d911faf45afe19cbc0c26b8092b3ddf8d sha256sums = 10562d11d50edab9abc2b29c8948714edcb9b084f99b3766d07ddd21259e372e sha256sums = 273d4357599a3e54259c78cc49054fef8ecfd2c2eda35cbcde3a53a62777a5ac - sha256sums = 1060b5d45caeda5119b220fab4e1ece398af34d75131139a5dc6f74ee06672c3 + sha256sums = 14561220eca2d3ceca70ce6981598c0f143e7e66bcbd65d846768665110dd90a sha256sums = 7c3b6a7871b19e31fafdcc2631751dd9569196740d8e7c2026653d155c0c8da0 pkgname = vmware-workstation @@ -17,7 +17,7 @@ pkgname=vmware-workstation pkgver=16.1.2 _buildver=17966106 _pkgver=${pkgver}_${_buildver} -pkgrel=2 +pkgrel=3 pkgdesc='The industry standard for running multiple operating systems as virtual machines on a single Linux PC.' arch=(x86_64) url='https://www.vmware.com/products/workstation-for-linux.html' @@ -91,7 +91,7 @@ sha256sums=( '10562d11d50edab9abc2b29c8948714edcb9b084f99b3766d07ddd21259e372e' '273d4357599a3e54259c78cc49054fef8ecfd2c2eda35cbcde3a53a62777a5ac' - '1060b5d45caeda5119b220fab4e1ece398af34d75131139a5dc6f74ee06672c3' + '14561220eca2d3ceca70ce6981598c0f143e7e66bcbd65d846768665110dd90a' '7c3b6a7871b19e31fafdcc2631751dd9569196740d8e7c2026653d155c0c8da0' ) options=(!strip emptydirs) diff --git a/vmmon.patch b/vmmon.patch index f2e32d6d0270..a2c34aef3962 100644 --- a/vmmon.patch +++ b/vmmon.patch @@ -12,3 +12,99 @@ # Header directory for the running kernel ifdef LINUXINCLUDE +From 9fda02bce13527ce94a95df1a98fb6188dea22b8 Mon Sep 17 00:00:00 2001 +From: Michal Kubecek <mkubecek@suse.cz> +Date: Wed, 30 Jun 2021 11:05:16 +0200 +Subject: [PATCH] vmmon: fix task_struct::state access patterns + +Mainline commit 2f064a59a11f ("sched: Change task_struct::state") in +5.14-rc1 finishes a series fixing racy access patterns to task state and +renames task_struct::state to __state so that code old code acessing it +directly fails to build. + +Two of these in HostIF_SemaphoreWait() can be rewritten into calls to +set_current_state() unconditionally (second one may do with +__set_current_state() but I don't feel confident enough about that). +There are also two places where vmmon code reads task_struct::state; +provide a compat accessor using READ_ONCE() and use it instead of +a direct read. To avoid kernel version check, check presence of +get_current_state() macro introduced in the same commit as state member +rename. +--- + vmmon-only/include/compat_sched.h | 15 +++++++++++++++ + vmmon-only/linux/hostif.c | 10 ++++++---- + 2 files changed, 21 insertions(+), 4 deletions(-) + +diff --git a/vmmon-only/include/compat_sched.h b/vmmon-only/include/compat_sched.h +index 3f3304b..72078e0 100644 +--- a/vmmon-only/include/compat_sched.h ++++ b/vmmon-only/include/compat_sched.h +@@ -289,5 +289,20 @@ typedef struct pid * compat_pid; + #define compat_kill_pid(pid, sig, flag) kill_pid(pid, sig, flag) + #endif + ++/* ++ * Since v5.14-rc1, task_struct::state hase been renamed to __state and is ++ * is longer supposed to be accessed without READ_ONCE/WRITE_ONCE. ++ */ ++#ifdef get_current_state ++static inline int compat_get_task_state(const struct task_struct *t) ++{ ++ return READ_ONCE(t->__state); ++} ++#else ++static inline int compat_get_task_state(const struct task_struct *t) ++{ ++ return READ_ONCE(t->state); ++} ++#endif + + #endif /* __COMPAT_SCHED_H__ */ +diff --git a/vmmon-only/linux/hostif.c b/vmmon-only/linux/hostif.c +index 137062c..6910f69 100644 +--- a/vmmon-only/linux/hostif.c ++++ b/vmmon-only/linux/hostif.c +@@ -77,6 +77,8 @@ + #include "pgtbl.h" + #include "versioned_atomic.h" + ++#include "compat_sched.h" ++ + #if !defined(CONFIG_HIGH_RES_TIMERS) + #error CONFIG_HIGH_RES_TIMERS required for acceptable performance + #endif +@@ -474,7 +476,7 @@ HostIF_WakeUpYielders(VMDriver *vm, // IN: + ASSERT(vcpuid < vm->numVCPUs); + t = vm->vmhost->vcpuSemaTask[vcpuid]; + VCPUSet_Remove(&req, vcpuid); +- if (t && (t->state & TASK_INTERRUPTIBLE)) { ++ if (t && (compat_get_task_state(t) & TASK_INTERRUPTIBLE)) { + wake_up_process(t); + } + } +@@ -2566,14 +2568,14 @@ HostIF_SemaphoreWait(VMDriver *vm, // IN: + } + + poll_initwait(&table); +- current->state = TASK_INTERRUPTIBLE; ++ set_current_state(TASK_INTERRUPTIBLE); + mask = file->f_op->poll(file, &table.pt); + if (!(mask & (POLLIN | POLLERR | POLLHUP))) { + vm->vmhost->vcpuSemaTask[vcpuid] = current; + schedule_timeout(timeoutms * HZ / 1000); // convert to Hz + vm->vmhost->vcpuSemaTask[vcpuid] = NULL; + } +- current->state = TASK_RUNNING; ++ set_current_state(TASK_RUNNING); + poll_freewait(&table); + + /* +@@ -2655,7 +2657,7 @@ HostIF_SemaphoreForceWakeup(VMDriver *vm, // IN: + */ + struct task_struct *t = + (struct task_struct *)xchg(&vm->vmhost->vcpuSemaTask[vcpuid], NULL); +- if (t && (t->state & TASK_INTERRUPTIBLE)) { ++ if (t && (compat_get_task_state(t) & TASK_INTERRUPTIBLE)) { + wake_up_process(t); + } + } ROF_EACH_VCPU_IN_SET_WITH_MAX(); |