/* Check if this is a system NMI event */ static int uv_check_nmi(struct uv_hub_nmi_s *hub_nmi) { int cpu = smp_processor_id(); int nmi = 0; local64_inc(&uv_nmi_count); uv_cpu_nmi.queries++; do { nmi = atomic_read(&hub_nmi->in_nmi); if (nmi) break; if (raw_spin_trylock(&hub_nmi->nmi_lock)) { /* check hub MMR NMI flag */ if (uv_nmi_test_mmr(hub_nmi)) { uv_set_in_nmi(cpu, hub_nmi); nmi = 1; break; } /* MMR NMI flag is clear */ raw_spin_unlock(&hub_nmi->nmi_lock); } else { /* wait a moment for the hub nmi locker to set flag */ cpu_relax(); udelay(uv_nmi_slave_delay); /* re-check hub in_nmi flag */ nmi = atomic_read(&hub_nmi->in_nmi); if (nmi) break; } /* check if this BMC missed setting the MMR NMI flag */ if (!nmi) { nmi = atomic_read(&uv_in_nmi); if (nmi) uv_set_in_nmi(cpu, hub_nmi); } } while (0); if (!nmi) local64_inc(&uv_nmi_misses); return nmi; }
static void cf_diag_stop(struct perf_event *event, int flags) { struct cpu_cf_events *cpuhw = this_cpu_ptr(&cpu_cf_events); struct cf_diag_csd *csd = this_cpu_ptr(&cf_diag_csd); struct hw_perf_event *hwc = &event->hw; debug_sprintf_event(cf_diag_dbg, 5, "%s event %p cpu %d flags %#x hwc-state %#x\n", __func__, event, event->cpu, flags, hwc->state); /* Deactivate all counter sets */ ctr_set_multiple_stop(&cpuhw->state, hwc->config_base); local64_inc(&event->count); csd->used = cf_diag_getctr(csd->data, sizeof(csd->data), event->hw.config_base); if (cf_diag_diffctr(csd, event->hw.config_base)) cf_diag_push_sample(event, csd); hwc->state |= PERF_HES_STOPPED; }