Skip to content

Commit

Permalink
x86/microcode: fix sleeping function called from invalid context at k…
Browse files Browse the repository at this point in the history
…ernel/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: Dmitry Adamushko <dmitry.adamushko@gmail.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
  • Loading branch information
stablebits authored and Ingo Molnar committed Oct 2, 2008
1 parent 82b0786 commit fd1452e
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions arch/x86/kernel/microcode_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -340,19 +336,22 @@ 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)
{
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);
}

Expand Down

0 comments on commit fd1452e

Please sign in to comment.