From: Andrey Ryabinin <aryabi...@virtuozzo.com> We don't need to enable cpuid faults if /proc/vz/cpuid_override was never used. If task was attached to ve before a write to 'cpuid_override' it will not get cpuid faults now. It shouldn't be a problem since the proper use of 'cpuid_override' requires stopping all containers.
https://jira.sw.ru/browse/PSBM-121823 Signed-off-by: Andrey Ryabinin <aryabi...@virtuozzo.com> Reviewed-by: Kirill Tkhai <ktk...@virtuozzo.com> (cherry-picked from vz8 commit 9daf2820bb73 ("x86: don't enable cpuid faults if /proc/vz/cpuid_override unused #PSBM-121823")) Signed-off-by: Nikita Yushchenko <nikita.yushche...@virtuozzo.com> --- arch/x86/kernel/cpuid_fault.c | 21 ++----------------- include/linux/cpuid_override.h | 38 ++++++++++++++++++++++++++++++++++ kernel/ve/ve.c | 5 ++++- 3 files changed, 44 insertions(+), 20 deletions(-) create mode 100644 include/linux/cpuid_override.h diff --git a/arch/x86/kernel/cpuid_fault.c b/arch/x86/kernel/cpuid_fault.c index 6ee6cf16b15e..ca54ba4b9a88 100644 --- a/arch/x86/kernel/cpuid_fault.c +++ b/arch/x86/kernel/cpuid_fault.c @@ -6,6 +6,7 @@ * */ +#include <linux/cpuid_override.h> #include <linux/gfp.h> #include <linux/slab.h> #include <linux/spinlock.h> @@ -17,25 +18,7 @@ #include <linux/veowner.h> #include <asm/uaccess.h> -struct cpuid_override_entry { - unsigned int op; - unsigned int count; - bool has_count; - unsigned int eax; - unsigned int ebx; - unsigned int ecx; - unsigned int edx; -}; - -#define MAX_CPUID_OVERRIDE_ENTRIES 16 - -struct cpuid_override_table { - struct rcu_head rcu_head; - int size; - struct cpuid_override_entry entries[MAX_CPUID_OVERRIDE_ENTRIES]; -}; - -static struct cpuid_override_table __rcu *cpuid_override __read_mostly; +struct cpuid_override_table __rcu *cpuid_override __read_mostly; static DEFINE_SPINLOCK(cpuid_override_lock); static void cpuid_override_update(struct cpuid_override_table *new_table) diff --git a/include/linux/cpuid_override.h b/include/linux/cpuid_override.h new file mode 100644 index 000000000000..be74f280a939 --- /dev/null +++ b/include/linux/cpuid_override.h @@ -0,0 +1,38 @@ +/* + * include/linux/cpuid_override.h + * + * Copyright (c) 2010-2015 Parallels IP Holdings GmbH + * Copyright (c) 2017-2021 Virtuozzo International GmbH. All rights reserved. + * + */ + +#ifndef __CPUID_OVERRIDE_H +#define __CPUID_OVERRIDE_H + +#include <linux/rcupdate.h> + +struct cpuid_override_entry { + unsigned int op; + unsigned int count; + bool has_count; + unsigned int eax; + unsigned int ebx; + unsigned int ecx; + unsigned int edx; +}; + +#define MAX_CPUID_OVERRIDE_ENTRIES 16 + +struct cpuid_override_table { + struct rcu_head rcu_head; + int size; + struct cpuid_override_entry entries[MAX_CPUID_OVERRIDE_ENTRIES]; +}; + +extern struct cpuid_override_table __rcu *cpuid_override; + +static inline bool cpuid_override_on(void) +{ + return rcu_access_pointer(cpuid_override); +} +#endif diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c index 9dabec194988..105e4deae29b 100644 --- a/kernel/ve/ve.c +++ b/kernel/ve/ve.c @@ -11,6 +11,7 @@ * 've.c' helper file performing VE sub-system initialization */ +#include <linux/cpuid_override.h> #include <linux/ctype.h> #include <linux/init.h> #include <linux/kernel.h> @@ -859,6 +860,7 @@ static void ve_attach(struct cgroup_taskset *tset) { struct cgroup_subsys_state *css; struct task_struct *task; + extern struct cpuid_override_table __rcu *cpuid_override; cgroup_taskset_for_each(task, css, tset) { struct ve_struct *ve = css_to_ve(css); @@ -876,7 +878,8 @@ static void ve_attach(struct cgroup_taskset *tset) ve_set_task_start_time(ve, task); - set_tsk_thread_flag(task, TIF_CPUID_OVERRIDE); + if (cpuid_override_on()) + set_tsk_thread_flag(task, TIF_CPUID_OVERRIDE); task->task_ve = ve; } -- 2.30.2 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel