static int hpwdt_init_nmi_decoding(struct pci_dev *dev) { #ifdef CONFIG_HPWDT_NMI_DECODING int retval; /* * Only one function can register for NMI_UNKNOWN */ retval = register_nmi_handler(NMI_UNKNOWN, hpwdt_pretimeout, 0, "hpwdt"); if (retval) goto error; retval = register_nmi_handler(NMI_SERR, hpwdt_pretimeout, 0, "hpwdt"); if (retval) goto error1; retval = register_nmi_handler(NMI_IO_CHECK, hpwdt_pretimeout, 0, "hpwdt"); if (retval) goto error2; dev_info(&dev->dev, "HPE Watchdog Timer Driver: NMI decoding initialized\n"); return 0; error2: unregister_nmi_handler(NMI_SERR, "hpwdt"); error1: unregister_nmi_handler(NMI_UNKNOWN, "hpwdt"); error: dev_warn(&dev->dev, "Unable to register a die notifier (err=%d).\n", retval); return retval; #endif /* CONFIG_HPWDT_NMI_DECODING */ return 0; }
static void hpwdt_exit_nmi_decoding(void) { #ifdef CONFIG_HPWDT_NMI_DECODING unregister_nmi_handler(NMI_UNKNOWN, "hpwdt"); unregister_nmi_handler(NMI_SERR, "hpwdt"); unregister_nmi_handler(NMI_IO_CHECK, "hpwdt"); #endif }
static void __init test_nmi_ipi(struct cpumask *mask) { unsigned long timeout; if (register_nmi_handler(NMI_LOCAL, test_nmi_ipi_callback, NMI_FLAG_FIRST, "nmi_selftest", __initdata)) { nmi_fail = FAILURE; return; } /* sync above data before sending NMI */ wmb(); apic->send_IPI_mask(mask, NMI_VECTOR); /* Don't wait longer than a second */ timeout = USEC_PER_SEC; while (!cpumask_empty(mask) && timeout--) udelay(1); /* What happens if we timeout, do we still unregister?? */ unregister_nmi_handler(NMI_LOCAL, "nmi_selftest"); if (!timeout) nmi_fail = TIMEOUT; return; }
int SamplingStop(void) { inSampling = 0; #ifdef DBG printk("sampling stop enter\n"); #endif //wait_event_interruptible(samplingExited, samplingExitedFlag!=0); #ifdef DBG printk("sampling thread has exited\n"); #endif writeflag = 1; exitFlag = 0; writeExitedFlag = 0; curBuffIdx = (curBuffIdx + 1) % 2; wake_up_interruptible(&writeQue); wait_event_interruptible(writeExited, writeExitedFlag != 0); #ifdef USE_NMI unregister_nmi_handler(NMI_LOCAL, "sample_tool"); #ifdef DBG printk("unregister NMI handler\n"); #endif #endif #ifdef USE_HPET hpet_unregister(&task); #endif #ifdef DBG printk("writing thread has exited\n"); #endif FreeBuff(); return 0; }
static void __init test_nmi_ipi(struct cpumask *mask) { unsigned long timeout; if (register_nmi_handler(NMI_LOCAL, test_nmi_ipi_callback, NMI_FLAG_FIRST, "nmi_selftest")) { nmi_fail = FAILURE; return; } /* */ wmb(); apic->send_IPI_mask(mask, NMI_VECTOR); /* */ timeout = USEC_PER_SEC; while (!cpumask_empty(mask) && timeout--) udelay(1); /* */ unregister_nmi_handler(NMI_LOCAL, "nmi_selftest"); if (!timeout) nmi_fail = TIMEOUT; return; }
static int nmi_setup(void) { int err = 0; int cpu; if (!allocate_msrs()) return -ENOMEM; /* 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 */ err = model->fill_in_addresses(&per_cpu(cpu_msrs, 0)); if (err) goto fail; 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); } nmi_enabled = 0; ctr_running = 0; /* make variables visible to the nmi handler: */ smp_mb(); err = register_nmi_handler(NMI_LOCAL, profile_exceptions_notify, 0, "oprofile"); if (err) goto fail; nmi_enabled = 1; /* make nmi_enabled visible to the nmi handler: */ smp_mb(); err = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "x86/oprofile:online", nmi_cpu_online, nmi_cpu_down_prep); if (err < 0) goto fail_nmi; cpuhp_nmi_online = err; return 0; fail_nmi: unregister_nmi_handler(NMI_LOCAL, "oprofile"); fail: free_msrs(); return err; }
static void nmi_shutdown(void) { struct op_msrs *msrs; cpuhp_remove_state(cpuhp_nmi_online); nmi_enabled = 0; ctr_running = 0; /* make variables visible to the nmi handler: */ smp_mb(); unregister_nmi_handler(NMI_LOCAL, "oprofile"); msrs = &get_cpu_var(cpu_msrs); model->shutdown(msrs); free_msrs(); put_cpu_var(cpu_msrs); }
static void nmi_shutdown(void) { struct op_msrs *msrs; get_online_cpus(); unregister_cpu_notifier(&oprofile_cpu_nb); on_each_cpu(nmi_cpu_shutdown, NULL, 1); nmi_enabled = 0; ctr_running = 0; put_online_cpus(); /* make variables visible to the nmi handler: */ smp_mb(); unregister_nmi_handler(NMI_LOCAL, "oprofile"); msrs = &get_cpu_var(cpu_msrs); model->shutdown(msrs); free_msrs(); put_cpu_var(cpu_msrs); }
static void __init cleanup_nmi_testsuite(void) { unregister_nmi_handler(NMI_UNKNOWN, "nmi_selftest_unk"); }