[Devel] [PATCH vz9 21/27] x86: don't enable cpuid faults if /proc/vz/cpuid_override unused #PSBM-121823

Nikita Yushchenko nikita.yushchenko at virtuozzo.com
Wed Oct 6 11:57:34 MSK 2021


From: Andrey Ryabinin <aryabinin at 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 <aryabinin at virtuozzo.com>
Reviewed-by: Kirill Tkhai <ktkhai at 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.yushchenko at 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



More information about the Devel mailing list