Skip to content

Commit

Permalink
Merge branch 'x86/microcode' into perf/core
Browse files Browse the repository at this point in the history
Merge this branch because we want to rely on the newer (and saner)
microcode loading and checking facilities.

Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Ingo Molnar committed Jul 5, 2012
2 parents b0338e9 + 3d8986b commit 1070505
Showing 1 changed file with 43 additions and 11 deletions.
54 changes: 43 additions & 11 deletions arch/x86/kernel/microcode_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -298,19 +298,27 @@ static ssize_t reload_store(struct device *dev,
const char *buf, size_t size)
{
unsigned long val;
int cpu = dev->id;
ssize_t ret = 0;
int cpu;
ssize_t ret = 0, tmp_ret;

ret = kstrtoul(buf, 0, &val);
if (ret)
return ret;

if (val == 1) {
get_online_cpus();
if (cpu_online(cpu))
ret = reload_for_cpu(cpu);
put_online_cpus();
if (val != 1)
return size;

get_online_cpus();
for_each_online_cpu(cpu) {
tmp_ret = reload_for_cpu(cpu);
if (tmp_ret != 0)
pr_warn("Error reloading microcode on CPU %d\n", cpu);

/* save retval of the first encountered reload error */
if (!ret)
ret = tmp_ret;
}
put_online_cpus();

if (!ret)
ret = size;
Expand Down Expand Up @@ -339,7 +347,6 @@ static DEVICE_ATTR(version, 0400, version_show, NULL);
static DEVICE_ATTR(processor_flags, 0400, pf_show, NULL);

static struct attribute *mc_default_attrs[] = {
&dev_attr_reload.attr,
&dev_attr_version.attr,
&dev_attr_processor_flags.attr,
NULL
Expand Down Expand Up @@ -516,6 +523,16 @@ static const struct x86_cpu_id microcode_id[] = {
MODULE_DEVICE_TABLE(x86cpu, microcode_id);
#endif

static struct attribute *cpu_root_microcode_attrs[] = {
&dev_attr_reload.attr,
NULL
};

static struct attribute_group cpu_root_microcode_group = {
.name = "microcode",
.attrs = cpu_root_microcode_attrs,
};

static int __init microcode_init(void)
{
struct cpuinfo_x86 *c = &cpu_data(0);
Expand Down Expand Up @@ -547,9 +564,17 @@ static int __init microcode_init(void)
if (error)
goto out_pdev;

error = sysfs_create_group(&cpu_subsys.dev_root->kobj,
&cpu_root_microcode_group);

if (error) {
pr_err("Error creating microcode group!\n");
goto out_driver;
}

error = microcode_dev_init();
if (error)
goto out_driver;
goto out_ucode_group;

register_syscore_ops(&mc_syscore_ops);
register_hotcpu_notifier(&mc_cpu_notifier);
Expand All @@ -559,7 +584,11 @@ static int __init microcode_init(void)

return 0;

out_driver:
out_ucode_group:
sysfs_remove_group(&cpu_subsys.dev_root->kobj,
&cpu_root_microcode_group);

out_driver:
get_online_cpus();
mutex_lock(&microcode_mutex);

Expand All @@ -568,7 +597,7 @@ static int __init microcode_init(void)
mutex_unlock(&microcode_mutex);
put_online_cpus();

out_pdev:
out_pdev:
platform_device_unregister(microcode_pdev);
return error;

Expand All @@ -584,6 +613,9 @@ static void __exit microcode_exit(void)
unregister_hotcpu_notifier(&mc_cpu_notifier);
unregister_syscore_ops(&mc_syscore_ops);

sysfs_remove_group(&cpu_subsys.dev_root->kobj,
&cpu_root_microcode_group);

get_online_cpus();
mutex_lock(&microcode_mutex);

Expand Down

0 comments on commit 1070505

Please sign in to comment.