From: Valeriy Vdovin <valeriy.vdo...@virtuozzo.com>

Updating cpuid_fault table is actually critical in terms
of container migration (migrating with criu involves two
stages: cpu matching and migration itself).

If someone third side involves into cpuid_fault modification the
migration may fail and we get not even a sign of what happened.

Thus to track cpuid_fault modifications simplier lets
logs this action.

 | [  186.708138] cpuid_override: 0x00000001: 0x000506e3 0x07100800 0x009ae3fd 
0xbfebfbff
 | [  186.715823] cpuid_override: 0x00000007 0x00000000: 0x00000000 0x00000000 
0x00000000 0x00000000
 | [  186.724427] cpuid_override: 0x0000000d 0x00000001: 0x00000000 0x000003c0 
0x00000100 0x00000000
 | [  186.733093] cpuid_override: 0x80000001: 0x00000000 0x00000000 0x00000001 
0x2c100800
 | [  186.740746] cpuid_override: 0x80000007: 0x00000000 0x00000000 0x00000000 
0x00000100
 | [  186.748469] cpuid_override: 0x80000008: 0x00003027 0x00000000 0x00000000 
0x00000000

In a sake of https://jira.sw.ru/browse/PSBM-84029

Signed-off-by: Cyrill Gorcunov <gorcu...@openvz.org>

Cherry-picked from vz7 commit
395ea929dbce ("cpuid_fault: Log table updates")

https://jira.sw.ru/browse/PSBM-126172
Signed-off-by: Valeriy Vdovin <valeriy.vdo...@virtuozzo.com>

(cherry picked from vz8 commit 6436f0d177fb4cbfba916150324cdcebc1f21d4f)
Signed-off-by: Andrey Zhadchenko <andrey.zhadche...@virtuozzo.com>
---
 arch/x86/kernel/cpuid_fault.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/arch/x86/kernel/cpuid_fault.c b/arch/x86/kernel/cpuid_fault.c
index e48ebe2..3f892e0 100644
--- a/arch/x86/kernel/cpuid_fault.c
+++ b/arch/x86/kernel/cpuid_fault.c
@@ -14,6 +14,7 @@
 #include <linux/module.h>
 #include <linux/proc_fs.h>
 #include <linux/seq_file.h>
+#include <linux/ratelimit.h>
 #include <linux/ve.h>
 #include <linux/veowner.h>
 #include <asm/uaccess.h>
@@ -21,6 +22,35 @@
 struct cpuid_override_table __rcu *cpuid_override __read_mostly;
 static DEFINE_SPINLOCK(cpuid_override_lock);
 
+static void cpuid_override_info(struct cpuid_override_table  *t)
+{
+       char buf[128];
+       size_t pos;
+
+       if (!t) {
+               pr_info_ratelimited("cpuid_override: flushed\n");
+               return;
+       }
+
+       rcu_read_lock();
+       for (pos = 0; pos < t->size; pos++) {
+               struct cpuid_override_entry *e = &t->entries[pos];
+               if (e->has_count) {
+                       snprintf(buf, sizeof(buf),
+                                "cpuid_override: 0x%08x 0x%08x: "
+                                "0x%08x 0x%08x 0x%08x 0x%08x",
+                                e->op, e->count, e->eax, e->ebx, e->ecx, 
e->edx);
+               } else {
+                       snprintf(buf, sizeof(buf),
+                                "cpuid_override: 0x%08x: "
+                                "0x%08x 0x%08x 0x%08x 0x%08x",
+                                e->op, e->eax, e->ebx, e->ecx, e->edx);
+               }
+               printk(KERN_INFO "%s\n", buf);
+       }
+       rcu_read_unlock();
+}
+
 static void cpuid_override_update(struct cpuid_override_table *new_table)
 {
        struct cpuid_override_table *old_table;
@@ -30,6 +60,8 @@ static void cpuid_override_update(struct cpuid_override_table 
*new_table)
        rcu_assign_pointer(cpuid_override, new_table);
        spin_unlock(&cpuid_override_lock);
 
+       cpuid_override_info(new_table);
+
        if (old_table)
                kfree_rcu(old_table, rcu_head);
 }
-- 
1.8.3.1

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to