arch/x86/kernel/cpu/mce/intel.c
Source file repositories/reference/linux-study-clean/arch/x86/kernel/cpu/mce/intel.c
File Facts
- System
- Linux kernel
- Corpus path
arch/x86/kernel/cpu/mce/intel.c- Extension
.c- Size
- 14393 bytes
- Lines
- 538
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/gfp.hlinux/interrupt.hlinux/percpu.hlinux/sched.hlinux/cpumask.hasm/apic.hasm/cpufeature.hasm/cpu_device_id.hasm/processor.hasm/msr.hasm/mce.hinternal.h
Detected Declarations
function cmci_supportedfunction lmce_supportedfunction cmci_rediscoverfunction mce_intel_handle_stormfunction intel_threshold_interruptfunction cmci_skip_bankfunction cmci_pick_thresholdfunction cmci_claim_bankfunction CMCIfunction cmci_recheckfunction __cmci_disable_bankfunction cmci_clearfunction cmci_rediscover_work_funcfunction cmci_rediscoverfunction cmci_reenablefunction cmci_disable_bankfunction cmci_mc_poll_banksfunction intel_init_cmcifunction intel_init_lmcefunction intel_clear_lmcefunction intel_imc_initfunction intel_apply_cpu_quirksfunction mce_intel_feature_initfunction mce_intel_feature_clearfunction intel_filter_mcefunction complicated
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0
/*
* Intel specific MCE features.
* Copyright 2004 Zwane Mwaikambo <zwane@linuxpower.ca>
* Copyright (C) 2008, 2009 Intel Corporation
* Author: Andi Kleen
*/
#include <linux/gfp.h>
#include <linux/interrupt.h>
#include <linux/percpu.h>
#include <linux/sched.h>
#include <linux/cpumask.h>
#include <asm/apic.h>
#include <asm/cpufeature.h>
#include <asm/cpu_device_id.h>
#include <asm/processor.h>
#include <asm/msr.h>
#include <asm/mce.h>
#include "internal.h"
/*
* Support for Intel Correct Machine Check Interrupts. This allows
* the CPU to raise an interrupt when a corrected machine check happened.
* Normally we pick those up using a regular polling timer.
* Also supports reliable discovery of shared banks.
*/
/*
* CMCI can be delivered to multiple cpus that share a machine check bank
* so we need to designate a single cpu to process errors logged in each bank
* in the interrupt handler (otherwise we would have many races and potential
* double reporting of the same error).
* Note that this can change when a cpu is offlined or brought online since
* some MCA banks are shared across cpus. When a cpu is offlined, cmci_clear()
* disables CMCI on all banks owned by the cpu and clears this bitfield. At
* this point, cmci_rediscover() kicks in and a different cpu may end up
* taking ownership of some of the shared MCA banks that were previously
* owned by the offlined cpu.
*/
static DEFINE_PER_CPU(mce_banks_t, mce_banks_owned);
/*
* cmci_discover_lock protects against parallel discovery attempts
* which could race against each other.
*/
static DEFINE_RAW_SPINLOCK(cmci_discover_lock);
/*
* On systems that do support CMCI but it's disabled, polling for MCEs can
* cause the same event to be reported multiple times because IA32_MCi_STATUS
* is shared by the same package.
*/
static DEFINE_SPINLOCK(cmci_poll_lock);
/* Linux non-storm CMCI threshold (may be overridden by BIOS) */
#define CMCI_THRESHOLD 1
/*
* MCi_CTL2 threshold for each bank when there is no storm.
* Default value for each bank may have been set by BIOS.
*/
static u16 cmci_threshold[MAX_NR_BANKS];
/*
* High threshold to limit CMCI rate during storms. Max supported is
* 0x7FFF. Use this slightly smaller value so it has a distinctive
* signature when some asks "Why am I not seeing all corrected errors?"
* A high threshold is used instead of just disabling CMCI for a
* bank because both corrected and uncorrected errors may be logged
* in the same bank and signalled with CMCI. The threshold only applies
* to corrected errors, so keeping CMCI enabled means that uncorrected
* errors will still be processed in a timely fashion.
*/
#define CMCI_STORM_THRESHOLD 32749
static bool cmci_supported(int *banks)
{
u64 cap;
if (mca_cfg.cmci_disabled || mca_cfg.ignore_ce)
return false;
/*
* Vendor check is not strictly needed, but the initial
* initialization is vendor keyed and this
* makes sure none of the backdoors are entered otherwise.
*/
if (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL &&
Annotation
- Immediate include surface: `linux/gfp.h`, `linux/interrupt.h`, `linux/percpu.h`, `linux/sched.h`, `linux/cpumask.h`, `asm/apic.h`, `asm/cpufeature.h`, `asm/cpu_device_id.h`.
- Detected declarations: `function cmci_supported`, `function lmce_supported`, `function cmci_rediscover`, `function mce_intel_handle_storm`, `function intel_threshold_interrupt`, `function cmci_skip_bank`, `function cmci_pick_threshold`, `function cmci_claim_bank`, `function CMCI`, `function cmci_recheck`.
- 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.