x86/microcode: fix sleeping function called from invalid context at kernel/mutex.c
authorDmitry Adamushko <dmitry.adamushko@gmail.com>
Thu, 2 Oct 2008 13:56:19 +0000 (16:56 +0300)
committerIngo Molnar <mingo@elte.hu>
Thu, 2 Oct 2008 15:52:33 +0000 (17:52 +0200)
Fix the following "sleeping function called from invalid context" bug:

...
__might_sleep
mutex_lock_nested
microcode_update_cpu
mc_sysdev_resume
__sysdev_resume
sysdev_resume
device_power_up
...

Signed-off-by: Dmitry Adamushko <dmitry.adamushko@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
arch/x86/kernel/microcode_core.c

index 8db2eb5..936d8d5 100644 (file)
@@ -324,10 +324,6 @@ void microcode_update_cpu(int cpu)
        struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
        int err = 0;
 
-       /* We should bind the task to the CPU */
-       BUG_ON(raw_smp_processor_id() != cpu);
-
-       mutex_lock(&microcode_mutex);
        /*
         * Check if the system resume is in progress (uci->valid != NULL),
         * otherwise just request a firmware:
@@ -340,11 +336,8 @@ void microcode_update_cpu(int cpu)
                        err = microcode_ops->request_microcode_fw(cpu,
                                        &microcode_pdev->dev);
        }
-
        if (!err)
                microcode_ops->apply_microcode(cpu);
-
-       mutex_unlock(&microcode_mutex);
 }
 
 static void microcode_init_cpu(int cpu)
@@ -352,7 +345,13 @@ static void microcode_init_cpu(int cpu)
        cpumask_t old = current->cpus_allowed;
 
        set_cpus_allowed_ptr(current, &cpumask_of_cpu(cpu));
+       /* We should bind the task to the CPU */
+       BUG_ON(raw_smp_processor_id() != cpu);
+
+       mutex_lock(&microcode_mutex);
        microcode_update_cpu(cpu);
+       mutex_unlock(&microcode_mutex);
+
        set_cpus_allowed_ptr(current, &old);
 }