Commit fd1452eb authored by Dmitry Adamushko's avatar Dmitry Adamushko Committed by Ingo Molnar

x86/microcode: fix sleeping function called from invalid context at kernel/mutex.c

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: default avatarDmitry Adamushko <dmitry.adamushko@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent 82b07865
...@@ -324,10 +324,6 @@ void microcode_update_cpu(int cpu) ...@@ -324,10 +324,6 @@ void microcode_update_cpu(int cpu)
struct ucode_cpu_info *uci = ucode_cpu_info + cpu; struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
int err = 0; 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), * Check if the system resume is in progress (uci->valid != NULL),
* otherwise just request a firmware: * otherwise just request a firmware:
...@@ -340,11 +336,8 @@ void microcode_update_cpu(int cpu) ...@@ -340,11 +336,8 @@ void microcode_update_cpu(int cpu)
err = microcode_ops->request_microcode_fw(cpu, err = microcode_ops->request_microcode_fw(cpu,
&microcode_pdev->dev); &microcode_pdev->dev);
} }
if (!err) if (!err)
microcode_ops->apply_microcode(cpu); microcode_ops->apply_microcode(cpu);
mutex_unlock(&microcode_mutex);
} }
static void microcode_init_cpu(int cpu) static void microcode_init_cpu(int cpu)
...@@ -352,7 +345,13 @@ static void microcode_init_cpu(int cpu) ...@@ -352,7 +345,13 @@ static void microcode_init_cpu(int cpu)
cpumask_t old = current->cpus_allowed; cpumask_t old = current->cpus_allowed;
set_cpus_allowed_ptr(current, &cpumask_of_cpu(cpu)); 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); microcode_update_cpu(cpu);
mutex_unlock(&microcode_mutex);
set_cpus_allowed_ptr(current, &old); set_cpus_allowed_ptr(current, &old);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment