x86/mcheck: Be prepared for a rollback back to the ONLINE state
authorSebastian Andrzej Siewior <bigeasy@linutronix.de>
Thu, 10 Nov 2016 17:44:43 +0000 (18:44 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 16 Nov 2016 08:34:17 +0000 (09:34 +0100)
If we try a CPU down and fail in the middle then we roll back to the
online state. This means we would perform CPU_ONLINE / mce_device_create()
without invoking CPU_DEAD / mce_device_remove() for the cleanup of what was
allocated in CPU_ONLINE.

Be prepared for this and don't allocate the struct if we have it
already.

Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Acked-by: Borislav Petkov <bp@alien8.de>
Cc: Tony Luck <tony.luck@intel.com>
Cc: rt@linutronix.de
Cc: linux-edac@vger.kernel.org
Link: http://lkml.kernel.org/r/20161110174447.11848-4-bigeasy@linutronix.de
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
arch/x86/kernel/cpu/mcheck/mce.c
arch/x86/kernel/cpu/mcheck/mce_amd.c

index a7fdf453d895bab87d785f193471269fba4fbdd0..e9ffd6d9e32d48d3f12a970bd47047801be15826 100644 (file)
@@ -2409,6 +2409,10 @@ static int mce_device_create(unsigned int cpu)
        if (!mce_available(&boot_cpu_data))
                return -EIO;
 
+       dev = per_cpu(mce_device, cpu);
+       if (dev)
+               return 0;
+
        dev = kzalloc(sizeof *dev, GFP_KERNEL);
        if (!dev)
                return -ENOMEM;
index 55cd018bc1ae91b31ce6a6a693b18eb47047147d..e93580c82ef0ebba2ed1881d531592f583c819bf 100644 (file)
@@ -1097,6 +1097,10 @@ static int threshold_create_device(unsigned int cpu)
        struct threshold_bank **bp;
        int err = 0;
 
+       bp = per_cpu(threshold_banks, cpu);
+       if (bp)
+               return 0;
+
        bp = kzalloc(sizeof(struct threshold_bank *) * mca_cfg.banks,
                     GFP_KERNEL);
        if (!bp)