oprofile/x86: rework error handler in nmi_setup()
This patch improves the error handler in nmi_setup(). Most parts of the code are moved to allocate_msrs(). In case of an error allocate_msrs() also frees already allocated memory. nmi_setup() becomes easier and better extendable. Signed-off-by: Robert Richter <robert.richter@amd.com>
This commit is contained in:
parent
81c4a8a673
commit
8f5a2dd83a
1 changed files with 19 additions and 14 deletions
|
@ -295,6 +295,7 @@ static void free_msrs(void)
|
||||||
kfree(per_cpu(cpu_msrs, i).controls);
|
kfree(per_cpu(cpu_msrs, i).controls);
|
||||||
per_cpu(cpu_msrs, i).controls = NULL;
|
per_cpu(cpu_msrs, i).controls = NULL;
|
||||||
}
|
}
|
||||||
|
nmi_shutdown_mux();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int allocate_msrs(void)
|
static int allocate_msrs(void)
|
||||||
|
@ -307,14 +308,21 @@ static int allocate_msrs(void)
|
||||||
per_cpu(cpu_msrs, i).counters = kzalloc(counters_size,
|
per_cpu(cpu_msrs, i).counters = kzalloc(counters_size,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!per_cpu(cpu_msrs, i).counters)
|
if (!per_cpu(cpu_msrs, i).counters)
|
||||||
return 0;
|
goto fail;
|
||||||
per_cpu(cpu_msrs, i).controls = kzalloc(controls_size,
|
per_cpu(cpu_msrs, i).controls = kzalloc(controls_size,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!per_cpu(cpu_msrs, i).controls)
|
if (!per_cpu(cpu_msrs, i).controls)
|
||||||
return 0;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!nmi_setup_mux())
|
||||||
|
goto fail;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
free_msrs();
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nmi_cpu_setup(void *dummy)
|
static void nmi_cpu_setup(void *dummy)
|
||||||
|
@ -342,17 +350,7 @@ static int nmi_setup(void)
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
||||||
if (!allocate_msrs())
|
if (!allocate_msrs())
|
||||||
err = -ENOMEM;
|
return -ENOMEM;
|
||||||
else if (!nmi_setup_mux())
|
|
||||||
err = -ENOMEM;
|
|
||||||
else
|
|
||||||
err = register_die_notifier(&profile_exceptions_nb);
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
free_msrs();
|
|
||||||
nmi_shutdown_mux();
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We need to serialize save and setup for HT because the subset
|
/* We need to serialize save and setup for HT because the subset
|
||||||
* of msrs are distinct for save and setup operations
|
* of msrs are distinct for save and setup operations
|
||||||
|
@ -374,9 +372,17 @@ static int nmi_setup(void)
|
||||||
|
|
||||||
mux_clone(cpu);
|
mux_clone(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
err = register_die_notifier(&profile_exceptions_nb);
|
||||||
|
if (err)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
on_each_cpu(nmi_cpu_setup, NULL, 1);
|
on_each_cpu(nmi_cpu_setup, NULL, 1);
|
||||||
nmi_enabled = 1;
|
nmi_enabled = 1;
|
||||||
return 0;
|
return 0;
|
||||||
|
fail:
|
||||||
|
free_msrs();
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nmi_cpu_restore_registers(struct op_msrs *msrs)
|
static void nmi_cpu_restore_registers(struct op_msrs *msrs)
|
||||||
|
@ -421,7 +427,6 @@ static void nmi_shutdown(void)
|
||||||
nmi_enabled = 0;
|
nmi_enabled = 0;
|
||||||
on_each_cpu(nmi_cpu_shutdown, NULL, 1);
|
on_each_cpu(nmi_cpu_shutdown, NULL, 1);
|
||||||
unregister_die_notifier(&profile_exceptions_nb);
|
unregister_die_notifier(&profile_exceptions_nb);
|
||||||
nmi_shutdown_mux();
|
|
||||||
msrs = &get_cpu_var(cpu_msrs);
|
msrs = &get_cpu_var(cpu_msrs);
|
||||||
model->shutdown(msrs);
|
model->shutdown(msrs);
|
||||||
free_msrs();
|
free_msrs();
|
||||||
|
|
Loading…
Add table
Reference in a new issue