static void free_msrs(void) { int i; for_each_possible_cpu(i) { kfree(per_cpu(cpu_msrs, i).counters); per_cpu(cpu_msrs, i).counters = NULL; kfree(per_cpu(cpu_msrs, i).controls); per_cpu(cpu_msrs, i).controls = NULL; } nmi_shutdown_mux(); }
static void nmi_shutdown(void) { struct op_msrs *msrs; nmi_enabled = 0; on_each_cpu(nmi_cpu_shutdown, NULL, 1); unregister_die_notifier(&profile_exceptions_nb); nmi_shutdown_mux(); msrs = &get_cpu_var(cpu_msrs); model->shutdown(msrs); free_msrs(); put_cpu_var(cpu_msrs); }
static int nmi_setup(void) { int err = 0; int cpu; if (!allocate_msrs()) err = -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 * of msrs are distinct for save and setup operations */ /* Assume saved/restored counters are the same on all CPUs */ model->fill_in_addresses(&per_cpu(cpu_msrs, 0)); for_each_possible_cpu(cpu) { if (!cpu) continue; memcpy(per_cpu(cpu_msrs, cpu).counters, per_cpu(cpu_msrs, 0).counters, sizeof(struct op_msr) * model->num_counters); memcpy(per_cpu(cpu_msrs, cpu).controls, per_cpu(cpu_msrs, 0).controls, sizeof(struct op_msr) * model->num_controls); mux_clone(cpu); } on_each_cpu(nmi_cpu_setup, NULL, 1); nmi_enabled = 1; return 0; }