perf fixes
Subsystems (2)
Linus,
Please pull the latest perf-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip.git perf-urgent-for-linus
Thanks,
Ingo
------------------>
Robert Richter (1):
oprofile, x86: Fix race in nmi handler while starting counters
Xiao Guangrong (1):
jump_label: Fix jump_label update for modules
arch/x86/oprofile/nmi_int.c | 14 ++++++++++---- kernel/jump_label.c | 14 +++++++++----- 2 files changed, 19 insertions(+), 9 deletions(-)
arch/x86/oprofile/nmi_int.c +10 -4
@@ -112,8 +112,10 @@ static void nmi_cpu_start(void *dummy)static int nmi_start (void ) {get_online_cpus (); -on_each_cpu (nmi_cpu_start,NULL ,1 ); ctr_running =1 ; +/* make ctr_running visible to the nmi handler: */ +smp_mb (); +on_each_cpu (nmi_cpu_start,NULL ,1 );put_online_cpus ();return 0 ; }
@@ -504,15 +506,18 @@ static int nmi_setup(void) nmi_enabled =0 ; ctr_running =0 ; -barrier (); +/* make variables visible to the nmi handler: */ +smp_mb (); err =register_die_notifier (&profile_exceptions_nb);if (err) goto fail;get_online_cpus ();register_cpu_notifier (&oprofile_cpu_nb); -on_each_cpu (nmi_cpu_setup,NULL ,1 ); nmi_enabled =1 ; +/* make nmi_enabled visible to the nmi handler: */ +smp_mb (); +on_each_cpu (nmi_cpu_setup,NULL ,1 );put_online_cpus ();return 0 ;
@@ -531,7 +536,8 @@ static void nmi_shutdown(void) nmi_enabled =0 ; ctr_running =0 ;put_online_cpus (); -barrier (); +/* make variables visible to the nmi handler: */ +smp_mb ();unregister_die_notifier (&profile_exceptions_nb); msrs = &get_cpu_var (cpu_msrs); model->shutdown (msrs);
kernel/jump_label.c +9 -5
@@ -375,15 +375,19 @@ int jump_label_text_reserved(void *start, void *end)static void jump_label_update (struct jump_label_key *key,int enable) { -struct jump_entry *entry = key->entries; - -/* if there are no users, entry can be NULL */ -if (entry) -__jump_label_update (key, entry, __stop___jump_table, enable); +struct jump_entry *entry = key->entries, *stop = __stop___jump_table;#ifdef CONFIG_MODULES +struct module *mod =__module_address ((jump_label_t )key); +__jump_label_mod_update (key, enable); + +if (mod) + stop = mod->jump_entries + mod->num_jump_entries;#endif +/* if there are no users, entry can be NULL */ +if (entry) +__jump_label_update (key, entry, stop, enable); }#endif