Commit 8f5a2dd8 authored by Robert Richter's avatar Robert Richter

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: default avatarRobert Richter <robert.richter@amd.com>
parent 81c4a8a6
...@@ -295,6 +295,7 @@ static void free_msrs(void) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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();
......
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