arch/x86/platform/uv/uv_nmi.c
Source file repositories/reference/linux-study-clean/arch/x86/platform/uv/uv_nmi.c
File Facts
- System
- Linux kernel
- Corpus path
arch/x86/platform/uv/uv_nmi.c- Extension
.c- Size
- 29085 bytes
- Lines
- 1104
- Domain
- Architecture Layer
- Bucket
- arch/x86
- Inferred role
- Architecture Layer: implementation source
- Status
- source implementation candidate
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/cpu.hlinux/delay.hlinux/kdb.hlinux/kexec.hlinux/kgdb.hlinux/moduleparam.hlinux/nmi.hlinux/sched.hlinux/sched/debug.hlinux/slab.hlinux/string.hlinux/string_choices.hlinux/clocksource.hasm/apic.hasm/current.hasm/kdebug.hasm/local64.hasm/nmi.hasm/reboot.hasm/traps.hasm/uv/uv.hasm/uv/uv_hub.hasm/uv/uv_mmrs.h
Detected Declarations
enum action_tfunction param_get_local64function param_set_local64function param_get_actionfunction param_set_actionfunction uv_nmi_setup_mmrsfunction uv_nmi_test_mmrfunction uv_local_mmr_clear_nmifunction uv_reassert_nmifunction uv_init_hubless_pch_iofunction uv_nmi_setup_hubless_intrfunction uv_init_hubless_pch_d0function uv_nmi_test_hublessfunction uv_test_nmifunction uv_set_in_nmifunction uv_check_nmifunction flagfunction uv_clear_nmifunction uv_nmi_nr_cpus_pingfunction uv_nmi_cleanup_maskfunction for_each_cpufunction uv_nmi_wait_cpusfunction for_each_cpufunction uv_nmi_waitfunction uv_nmi_dump_cpu_ip_hdrfunction uv_nmi_dump_cpu_ipfunction uv_nmi_dump_state_cpufunction uv_nmi_trigger_dumpfunction uv_nmi_sync_exitfunction uv_nmi_action_healthfunction uv_nmi_dump_statefunction for_each_online_cpufunction uv_nmi_touch_watchdogsfunction uv_nmi_kdumpfunction uv_nmi_kdb_reasonfunction uv_nmi_kdb_reasonfunction uv_call_kgdb_kdbfunction uv_call_kgdb_kdbfunction uv_handle_nmifunction uv_handle_nmi_pingfunction uv_register_nmi_notifierfunction uv_nmi_initfunction uv_nmi_setup_commonfunction uv_nmi_setupfunction uv_nmi_setup_hubless
Annotated Snippet
if (raw_spin_trylock(&hub_nmi->nmi_lock)) {
nmi_detected = uv_test_nmi(hub_nmi);
/* Check flag for UV external NMI */
if (nmi_detected > 0) {
uv_set_in_nmi(cpu, hub_nmi);
nmi = 1;
break;
}
/* A non-PCH node in a hubless system waits for NMI */
else if (nmi_detected < 0)
goto slave_wait;
/* MMR/PCH NMI flag is clear */
raw_spin_unlock(&hub_nmi->nmi_lock);
} else {
/* Wait a moment for the HUB NMI locker to set flag */
slave_wait: 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 (or)
* UV hubless system where only PCH owner can check flag
*/
if (!nmi) {
nmi = atomic_read(&uv_in_nmi);
if (nmi)
uv_set_in_nmi(cpu, hub_nmi);
}
/* If we're holding the hub lock, release it now */
if (nmi_detected < 0)
raw_spin_unlock(&hub_nmi->nmi_lock);
} while (0);
if (!nmi)
local64_inc(&uv_nmi_misses);
return nmi;
}
/* Need to reset the NMI MMR register, but only once per hub. */
static inline void uv_clear_nmi(int cpu)
{
struct uv_hub_nmi_s *hub_nmi = uv_hub_nmi;
if (cpu == atomic_read(&hub_nmi->cpu_owner)) {
atomic_set(&hub_nmi->cpu_owner, -1);
atomic_set(&hub_nmi->in_nmi, 0);
if (hub_nmi->hub_present)
uv_local_mmr_clear_nmi();
else
uv_reassert_nmi();
raw_spin_unlock(&hub_nmi->nmi_lock);
}
}
/* Ping non-responding CPU's attempting to force them into the NMI handler */
static void uv_nmi_nr_cpus_ping(void)
{
int cpu;
for_each_cpu(cpu, uv_nmi_cpu_mask)
uv_cpu_nmi_per(cpu).pinging = 1;
__apic_send_IPI_mask(uv_nmi_cpu_mask, APIC_DM_NMI);
}
/* Clean up flags for CPU's that ignored both NMI and ping */
static void uv_nmi_cleanup_mask(void)
{
int cpu;
for_each_cpu(cpu, uv_nmi_cpu_mask) {
uv_cpu_nmi_per(cpu).pinging = 0;
uv_cpu_nmi_per(cpu).state = UV_NMI_STATE_OUT;
cpumask_clear_cpu(cpu, uv_nmi_cpu_mask);
}
}
Annotation
- Immediate include surface: `linux/cpu.h`, `linux/delay.h`, `linux/kdb.h`, `linux/kexec.h`, `linux/kgdb.h`, `linux/moduleparam.h`, `linux/nmi.h`, `linux/sched.h`.
- Detected declarations: `enum action_t`, `function param_get_local64`, `function param_set_local64`, `function param_get_action`, `function param_set_action`, `function uv_nmi_setup_mmrs`, `function uv_nmi_test_mmr`, `function uv_local_mmr_clear_nmi`, `function uv_reassert_nmi`, `function uv_init_hubless_pch_io`.
- Atlas domain: Architecture Layer / arch/x86.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.