x86/microcode: Get rid of the schedule work indirection
[linux-2.6-microblaze.git] / arch / x86 / kernel / cpu / microcode / core.c
index 37145cf..0ed96d2 100644 (file)
@@ -481,8 +481,16 @@ static struct syscore_ops mc_syscore_ops = {
 
 static int mc_cpu_online(unsigned int cpu)
 {
+       struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
        struct device *dev = get_cpu_device(cpu);
 
+       memset(uci, 0, sizeof(*uci));
+
+       microcode_ops->collect_cpu_info(cpu, &uci->cpu_sig);
+       cpu_data(cpu).microcode = uci->cpu_sig.rev;
+       if (!cpu)
+               boot_cpu_data.microcode = uci->cpu_sig.rev;
+
        if (sysfs_create_group(&dev->kobj, &mc_attr_group))
                pr_err("Failed to create group for CPU%d\n", cpu);
        return 0;
@@ -503,20 +511,6 @@ static int mc_cpu_down_prep(unsigned int cpu)
        return 0;
 }
 
-static void setup_online_cpu(struct work_struct *work)
-{
-       int cpu = smp_processor_id();
-       struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
-
-       memset(uci, 0, sizeof(*uci));
-
-       microcode_ops->collect_cpu_info(cpu, &uci->cpu_sig);
-       cpu_data(cpu).microcode = uci->cpu_sig.rev;
-       if (!cpu)
-               boot_cpu_data.microcode = uci->cpu_sig.rev;
-       mc_cpu_online(cpu);
-}
-
 static struct attribute *cpu_root_microcode_attrs[] = {
 #ifdef CONFIG_MICROCODE_LATE_LOADING
        &dev_attr_reload.attr,
@@ -562,12 +556,9 @@ static int __init microcode_init(void)
                }
        }
 
-       /* Do per-CPU setup */
-       schedule_on_each_cpu(setup_online_cpu);
-
        register_syscore_ops(&mc_syscore_ops);
-       cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "x86/microcode:online",
-                                 mc_cpu_online, mc_cpu_down_prep);
+       cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/microcode:online",
+                         mc_cpu_online, mc_cpu_down_prep);
 
        pr_info("Microcode Update Driver: v%s.", DRIVER_VERSION);