Merge commit 'v2.6.27-rc8' into oprofile
Conflicts: arch/x86/oprofile/nmi_int.c Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <asm/nmi.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/apic.h>
|
||||
@@ -31,27 +32,50 @@ static DEFINE_PER_CPU(unsigned long, saved_lvtpc);
|
||||
|
||||
static int nmi_start(void);
|
||||
static void nmi_stop(void);
|
||||
static void nmi_cpu_start(void *dummy);
|
||||
static void nmi_cpu_stop(void *dummy);
|
||||
static void nmi_cpu_save_mpx_registers(struct op_msrs *msrs);
|
||||
static void nmi_cpu_restore_mpx_registers(struct op_msrs *msrs);
|
||||
static void nmi_cpu_stop(void *dummy);
|
||||
static void nmi_cpu_start(void *dummy);
|
||||
|
||||
/* 0 == registered but off, 1 == registered and on */
|
||||
static int nmi_enabled = 0;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static int oprofile_cpu_notifier(struct notifier_block *b, unsigned long action,
|
||||
void *data)
|
||||
{
|
||||
int cpu = (unsigned long)data;
|
||||
switch (action) {
|
||||
case CPU_DOWN_FAILED:
|
||||
case CPU_ONLINE:
|
||||
smp_call_function_single(cpu, nmi_cpu_start, NULL, 0);
|
||||
break;
|
||||
case CPU_DOWN_PREPARE:
|
||||
smp_call_function_single(cpu, nmi_cpu_stop, NULL, 1);
|
||||
break;
|
||||
}
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block oprofile_cpu_nb = {
|
||||
.notifier_call = oprofile_cpu_notifier
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int nmi_suspend(struct sys_device *dev, pm_message_t state)
|
||||
{
|
||||
/* Only one CPU left, just stop that one */
|
||||
if (nmi_enabled == 1)
|
||||
nmi_stop();
|
||||
nmi_cpu_stop(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nmi_resume(struct sys_device *dev)
|
||||
{
|
||||
if (nmi_enabled == 1)
|
||||
nmi_start();
|
||||
nmi_cpu_start(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -351,10 +375,12 @@ static void nmi_cpu_shutdown(void *dummy)
|
||||
|
||||
static void nmi_shutdown(void)
|
||||
{
|
||||
struct op_msrs *msrs = &get_cpu_var(cpu_msrs);
|
||||
struct op_msrs *msrs;
|
||||
|
||||
nmi_enabled = 0;
|
||||
on_each_cpu(nmi_cpu_shutdown, NULL, 1);
|
||||
unregister_die_notifier(&profile_exceptions_nb);
|
||||
msrs = &get_cpu_var(cpu_msrs);
|
||||
model->shutdown(msrs);
|
||||
free_msrs();
|
||||
put_cpu_var(cpu_msrs);
|
||||
@@ -550,6 +576,9 @@ int __init op_nmi_init(struct oprofile_operations *ops)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
register_cpu_notifier(&oprofile_cpu_nb);
|
||||
#endif
|
||||
/* default values, can be overwritten by model */
|
||||
__raw_get_cpu_var(switch_index) = 0;
|
||||
ops->create_files = nmi_create_files;
|
||||
@@ -573,8 +602,12 @@ int __init op_nmi_init(struct oprofile_operations *ops)
|
||||
|
||||
void op_nmi_exit(void)
|
||||
{
|
||||
if (using_nmi)
|
||||
if (using_nmi) {
|
||||
exit_sysfs();
|
||||
#ifdef CONFIG_SMP
|
||||
unregister_cpu_notifier(&oprofile_cpu_nb);
|
||||
#endif
|
||||
if (model->exit)
|
||||
model->exit();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user