Chinese translated version of Documentation/edac.txt
中文版翻译者: 万伟 Wan Wei <oneway...@gmail.com>
以下为正文
---------------------------------------------------------------------
EDAC - Error Detection And Correction
EDAC - 错误检测和纠错
Written by Doug Thompson <dougth...@xmission.com>
7 Dec 2005
17 Jul 2007 Updated
EDAC is maintained and written by:
Doug Thompson, Dave Jiang, Dave Peterson et al,
original author: Thayne Harbaugh,
Contact:
website: bluesmoke.sourceforge.net
mailing list: bluesmo...@lists.sourceforge.net
"bluesmoke" was the name for this device driver when it was "out-of-tree"
and maintained at sourceforge.net. When it was pushed into 2.6.16 for the
first time, it was renamed to 'EDAC'.
The bluesmoke project at sourceforge.net is now utilized as a 'staging area'
for EDAC development, before it is sent upstream to kernel.org
At the bluesmoke/EDAC project site, is a series of quilt patches against
recent kernels, stored in a SVN respository. For easier downloading, there
is also a tarball snapshot available.
EDAC的前身是放在sourceforge.net上的称为"bluesmoke"的设备驱动,不过当时它还
没有被并到内核树中来。当它在2.6.16内核中被第一次吸收进内核时,被更名为"EDAC"。
sourceforge.net上的bluesmoke项目现在被作为为EDAC开发提供帮助的'集结地'来,在对
EDAC的开发提交到kernel之前,可以先集中提交到bluesmoke来。
在bluesmoke/EDAC项目的网站上,有一系列针对近期内核的补丁,可以通过SVN获取。
为方便下载,网站也提供了tar包格式的下载。
============================================================================
EDAC PURPOSE
The 'edac' kernel module goal is to detect and report errors that occur
within the computer system running under linux.
MEMORY
In the initial release, memory Correctable Errors (CE) and Uncorrectable
Errors (UE) are the primary errors being harvested. These types of errors
are harvested by the 'edac_mc' class of device.
Detecting CE events, then harvesting those events and reporting them,
CAN be a predictor of future UE events. With CE events, the system can
continue to operate, but with less safety. Preventive maintenance and
proactive part replacement of memory DIMMs exhibiting CEs can reduce
the likelihood of the dreaded UE events and system 'panics'.
NON-MEMORY
A new feature for EDAC, the edac_device class of device, was added in
the 2.6.23 version of the kernel.
This new device type allows for non-memory type of ECC hardware detectors
to have their states harvested and presented to userspace via the sysfs
interface.
Some architectures have ECC detectors for L1, L2 and L3 caches, along with DMA
engines, fabric switches, main data path switches, interconnections,
and various other hardware data paths. If the hardware reports it, then
a edac_device device probably can be constructed to harvest and present
that to userspace.
PCI BUS SCANNING
In addition, PCI Bus Parity and SERR Errors are scanned for on PCI devices
in order to determine if errors are occurring on data transfers.
The presence of PCI Parity errors must be examined with a grain of salt.
There are several add-in adapters that do NOT follow the PCI specification
with regards to Parity generation and reporting. The specification says
the vendor should tie the parity status bits to 0 if they do not intend
to generate parity. Some vendors do not do this, and thus the parity bit
can "float" giving false positives.
In the kernel there is a pci device attribute located in sysfs that is
checked by the EDAC PCI scanning code. If that attribute is set,
PCI parity/error scannining is skipped for that device. The attribute
is:
broken_parity_status
as is located in /sys/devices/pci<XXX>/0000:XX:YY.Z directorys for
PCI devices.
FUTURE HARDWARE SCANNING
EDAC will have future error detectors that will be integrated with
EDAC or added to it, in the following list:
MCE Machine Check Exception
MCA Machine Check Architecture
NMI NMI notification of ECC errors
MSRs Machine Specific Register error cases
and other mechanisms.
These errors are usually bus errors, ECC errors, thermal throttling
and the like.
EDAC的目的
edac内核模块的目的是发现并报告发生在linux操作系统下层的计算机系统的错误
对于内存
在最初的版本中,内存的可纠正错误(CE,Correctable Errors)和不可纠正错误
(UE, Uncorrectable Errors)是EDAC获取的主要错误。这些类型的错误被edac设备的
'edac_mc' class获取。
检测到CE事件后,edac获取这些事件并报告它们,从而可以看做对未来UE事件的预测。
在有CE事件的情况下,系统仍然可以继续运行,但是会有一些安全性问题。通过预防性的
修理和替换发现错误的内存DIMM可以减少发生严重UE事件和系统panic的可能性
对于非内存设备
edac_device class作为EDAC设备的一个新的特性,被添加到2.6.23版本的内核中来。
这个新的设备类型允许获取非内存设备的ECC硬件检测器状态,并通过sysfs接口来
显示。
一些体系结构中不但包括对DMA引擎的检查,光纤交换,主数据路径交换,互联和其它硬件
数据通道的ECC检测,还包括对L1,L2,L3 cache的ECC检测。当硬件报告ECC错误时,就可以
建立edac_device设备来获取这些信息并显示到用户空间。
PCI总线的扫描
另外,在PCI设备上,PCI总线的奇偶校验和SERR错误也会被扫描,从而判断是否在数据
传输中有错误发生。
对PCI奇偶校验错误的判断需要有所保留。这是因为,有一些PCI控制器在奇偶校验错误
的产生和报告上并没有遵守PCI规范。规范中说明厂商如果不打算产生奇偶校验错误,就
必须将奇偶校验状态位设为0,而一些厂商并没有这样做,因此在奇偶校验上将产误报。
内核会在sysfs目录下生成一个pci设备的attribute。EDAC在进行PCI扫描时会坚持这个
attribute。如果它被设置,edac将忽略对这个设备进行PCI奇偶校验/错误扫描。
这个attribute是:
broken_parity_status
它的位置在这个PCI设备的/sys/devices/pci<XXX>/0000:XX:YY.Z 目录下。
新的硬件扫描
EDAC会在未来集成或添加一些新的错误检查方式,这些方式包括:
MCE Machine Check Exception
MCA Machine Check Architecture
NMI NMI notification of ECC errors
MSRs Machine Specific Register error cases
和一些其它机制。
这些错误通常包括bus错误,ECC错误,硬件过热等类似错误。
============================================================================
EDAC VERSIONING
EDAC is composed of a "core" module (edac_core.ko) and several Memory
Controller (MC) driver modules. On a given system, the CORE
is loaded and one MC driver will be loaded. Both the CORE and
the MC driver (or edac_device driver) have individual versions that reflect
current release level of their respective modules.
Thus, to "report" on what version a system is running, one must report both
the CORE's and the MC driver's versions.
LOADING
If 'edac' was statically linked with the kernel then no loading is
necessary. If 'edac' was built as modules then simply modprobe the
'edac' pieces that you need. You should be able to modprobe
hardware-specific modules and have the dependencies load the necessary core
modules.
Example:
$> modprobe amd76x_edac
loads both the amd76x_edac.ko memory controller module and the edac_mc.ko
core module.
EDAC 版本
EDAC由一个核心模块(edac_core.ko)和多个内存控制器(MC,Memory Controller)驱动模块
组成。在给定系统中,将会加载核心模块和一个MC驱动。核心模块和MC驱动
(或者edac_device驱动)都各自有独立的版本号来反映他们各自的当前release。
因此,描述系统的运行的EDAC版本时,需要分别指出核心和MC驱动的版本号。
装载
如果edac被静态链接到内核中,就不需要进行加载。如果edac被编译成内核模块,则只
需要简单的使用modprobe来加载所需要的edac模块。你应该可以modprobe硬件相关的模块
并根据依赖关系加载需要的核心模块。
例如:
$> modprobe amd76x_edac
将加载amd76x_edac内存控制器模块和edac_mc.ko核心模块。
============================================================================
EDAC sysfs INTERFACE
EDAC presents a 'sysfs' interface for control, reporting and attribute
reporting purposes.
EDAC lives in the /sys/devices/system/edac directory.
Within this directory there currently reside 2 'edac' components:
mc memory controller(s) system
pci PCI control and status system
EDAC sysfs 接口
EDAC使用sysfs接口来控制,报告错误和属性。
EDAC的位置在/sys/devices/system/edac目录下。
在这个目录下,有两个edac组件:
mc 内存控制器系统
pci PCI控制和状态系统
============================================================================
Memory Controller (mc) Model
First a background on the memory controller's model abstracted in EDAC.
Each 'mc' device controls a set of DIMM memory modules. These modules are
laid out in a Chip-Select Row (csrowX) and Channel table (chX). There can
be multiple csrows and multiple channels.
Memory controllers allow for several csrows, with 8 csrows being a
typical value.
Yet, the actual number of csrows depends on the electrical "loading"
of a given motherboard, memory controller and DIMM characteristics.
Dual channels allows for 128 bit data transfers to the CPU from memory.
Some newer chipsets allow for more than 2 channels, like Fully Buffered DIMMs
(FB-DIMMs). The following example will assume 2 channels:
Channel 0 Channel 1
===================================
csrow0 | DIMM_A0 | DIMM_B0 |
csrow1 | DIMM_A0 | DIMM_B0 |
===================================
===================================
csrow2 | DIMM_A1 | DIMM_B1 |
csrow3 | DIMM_A1 | DIMM_B1 |
===================================
In the above example table there are 4 physical slots on the motherboard
for memory DIMMs:
DIMM_A0
DIMM_B0
DIMM_A1
DIMM_B1
Labels for these slots are usually silk screened on the motherboard. Slots
labeled 'A' are channel 0 in this example. Slots labeled 'B'
are channel 1. Notice that there are two csrows possible on a
physical DIMM. These csrows are allocated their csrow assignment
based on the slot into which the memory DIMM is placed. Thus, when 1 DIMM
is placed in each Channel, the csrows cross both DIMMs.
Memory DIMMs come single or dual "ranked". A rank is a populated csrow.
Thus, 2 single ranked DIMMs, placed in slots DIMM_A0 and DIMM_B0 above
will have 1 csrow, csrow0. csrow1 will be empty. On the other hand,
when 2 dual ranked DIMMs are similarly placed, then both csrow0 and
csrow1 will be populated. The pattern repeats itself for csrow2 and
csrow3.
The representation of the above is reflected in the directory tree
in EDAC's sysfs interface. Starting in directory
/sys/devices/system/edac/mc each memory controller will be represented
by its own 'mcX' directory, where 'X" is the index of the MC.
..../edac/mc/
|
|->mc0
|->mc1
|->mc2
....
Under each 'mcX' directory each 'csrowX' is again represented by a
'csrowX', where 'X" is the csrow index:
.../mc/mc0/
|
|->csrow0
|->csrow2
|->csrow3
....
Notice that there is no csrow1, which indicates that csrow0 is
composed of a single ranked DIMMs. This should also apply in both
Channels, in order to have dual-channel mode be operational. Since
both csrow2 and csrow3 are populated, this indicates a dual ranked
set of DIMMs for channels 0 and 1.
Within each of the 'mcX' and 'csrowX' directories are several
EDAC control and attribute files.
内存控制器模型
首先看看EDAC抽象出来的内存控制器模型的背景。每个'mc'设备控制一组DIMM内存模块,
这些模块通以片选行(Chip-Select Row,csrowX)和通道(Channel,chX)的方式排布。
在系统中可以有多个csrow和多个通道。
内存控制器允许多个csrow(典型的是8个csrow)。当然,实际的csrow数量取决于主板,
内存控制器和DIMM的特性。
双通道允许cpu从内存传输数据时以128位方式进行。有些更新的芯片组允许多于两个通道,
比如Fully Buffered DIMMs(FB-DIMMS)。下面的例子假定只有两个通道:
Channel 0 Channel 1
===================================
csrow0 | DIMM_A0 | DIMM_B0 |
csrow1 | DIMM_A0 | DIMM_B0 |
===================================
===================================
csrow2 | DIMM_A1 | DIMM_B1 |
csrow3 | DIMM_A1 | DIMM_B1 |
===================================
在上面的例子中,主板为内存DIMM提供了4个物理插槽:
DIMM_A0
DIMM_B0
DIMM_A1
DIMM_B1
这些插槽通常在主板上以"silk screened"方式交织分布。在本例子中,标记A的插槽是
0通道,标记B的插槽是1通道。注意到在一个物理DIMM上可能有两个csrow,这些csrow
编号根据物理DIMM所处的内存插槽位置进行分配。也就是说,当每个通道都放有一个
DIMM时,一个csrow其实是分别在两个DIMM中的。
内存DIMM通常为单或者双rank。一个rank是一个装载的csrow。因此,2个单rankDIMM,
分别放在上述的DIMMA0和DIMMB0插槽上时,会有1个csrow,即csrow0。csrow1将会为空。
换句话说,当2个双rank的DIMM相同的放置时,则csrow0和csrow1都会被装载。对csrow2
和csrow3也以此类推。
上述情况可以通过EDAC在sysfs建立的目录树反映出来。从目录
/sys/devices/system/edac/mc开始,每个内存控制器将会有自己的'mcX'目录,
这里'X'表示MC的索引号。
..../edac/mc/
|
|->mc0
|->mc1
|->mc2
....
在每个'mcX'路径下,每个'csrow'也是通过一个'csrowX'目录表示,这里
'X'表示csrow的索引:
.../mc/mc0/
|
|->csrow0
|->csrow2
|->csrow3
....
注意到这里没有csrow1,这表明csrow0是由一个单rank DIMM组成。为了使用
双通道模式,对两个通道都需要如此放置。由于csrow2和csrow3都被
装载了。这表明通道0和通道1上的一组双rank的DIMM
在每个'mcX'和'csrowX'目录下都有若干EDAC控制和属性文件
============================================================================
'mcX' DIRECTORIES
In 'mcX' directories are EDAC control and attribute files for
this 'X" instance of the memory controllers:
Counter reset control file:
'reset_counters'
This write-only control file will zero all the statistical counters
for UE and CE errors. Zeroing the counters will also reset the timer
indicating how long since the last counter zero. This is useful
for computing errors/time. Since the counters are always reset at
driver initialization time, no module/kernel parameter is available.
RUN TIME: echo "anything" >/sys/devices/system/edac/mc/mc0/counter_reset
This resets the counters on memory controller 0
Seconds since last counter reset control file:
'seconds_since_reset'
This attribute file displays how many seconds have elapsed since the
last counter reset. This can be used with the error counters to
measure error rates.
Memory Controller name attribute file:
'mc_name'
This attribute file displays the type of memory controller
that is being utilized.
Total memory managed by this memory controller attribute file:
'size_mb'
This attribute file displays, in count of megabytes, of memory
that this instance of memory controller manages.
Total Uncorrectable Errors count attribute file:
'ue_count'
This attribute file displays the total count of uncorrectable
errors that have occurred on this memory controller. If panic_on_ue
is set this counter will not have a chance to increment,
since EDAC will panic the system.
Total UE count that had no information attribute fileY:
'ue_noinfo_count'
This attribute file displays the number of UEs that
have occurred have occurred with no informations as to which DIMM
slot is having errors.
Total Correctable Errors count attribute file:
'ce_count'
This attribute file displays the total count of correctable
errors that have occurred on this memory controller. This
count is very important to examine. CEs provide early
indications that a DIMM is beginning to fail. This count
field should be monitored for non-zero values and report
such information to the system administrator.
Total Correctable Errors count attribute file:
'ce_noinfo_count'
This attribute file displays the number of CEs that
have occurred wherewith no informations as to which DIMM slot
is having errors. Memory is handicapped, but operational,
yet no information is available to indicate which slot
the failing memory is in. This count field should be also
be monitored for non-zero values.
Device Symlink:
'device'
Symlink to the memory controller device.
Sdram memory scrubbing rate:
'sdram_scrub_rate'
Read/Write attribute file that controls memory scrubbing. The scrubbing
rate is set by writing a minimum bandwidth in bytes/sec to the attribute
file. The rate will be translated to an internal value that gives at
least the specified rate.
Reading the file will return the actual scrubbing rate employed.
If configuration fails or memory scrubbing is not implemented, the value
of the attribute file will be -1.
'mcX' 目录
在'mcX'目录是针对第'X'个内存控制器实例的EDAC控制和属性文件:
控制文件 - 计数器重置:
'reset_counters'
这个只写文件将会将所有的UE和CE的错误计数器归零。归零计数器也会重置定时器,
这个定时器用于指示上次计数器归零到现在的时间。对于计算
单位时间的错误来说,这个功能非常有用。由于计数器通常在驱动初始化时间内被重置,
所以不需要相应的模块或内核参数。
运行: echo "anything" >/sys/devices/system/edac/mc/mc0/counter_reset
将重置内存控制器0上的计数器
属性文件 - 上次重置间隔时间:
'seconds_since_reset'
这个属性文件将显示上次计数器重置到现在所经过的秒数。这一项可以与错误计数器一起来
衡量错误率。
属性文件 - 内存控制器名称:
'mc_name'
这个属性文件显示了被使用的内存控制器类型
属性文件 - 该内存控制器管理的内存大小:
'size_mb'
这个属性文件显示了了这个内存控制器实例所管理的内存的大小,以兆为单位
属性文件 - 不可纠正错误总数:
'ue_count'
这个属性文件显示了这个内存控制器上不可纠正错误的总数。如果panic_on_ue
参数被置位,则EDAC会报系统panic,这种情况下ue_count将不会增长。
属性文件 - 无法定位的不可纠正错误总数:
'ue_noinfo_count'
这个属性文件显示了那些发生了但又没有信息来定位哪个DIMM槽发生错误的不可纠
正错误的数量
属性文件 - 可纠正错误的总数:
'ce_count'
这个属性文件显示了发生在这个内存控制器上的可纠正错误的总数,
检查这个计数器十分重要。CE错误提供了在DIMM开始损坏的早期的
预警。这个计数器应该被监视,如果有非0显示,则将这一信息报告
给管理员
属性文件 - 无法定位的可纠正错误总数:
'ce_noinfo_count'
这个属性文件显示了那些发生了但没有信息来定位哪个DIMM槽出错的
CE错误的数量。内存有缺陷了,但是仍然可以工作,并且没有信息来定位
错误内存插在哪个槽上。这个计数器也应该被监视看它是否出现非0情况。
设备链接:
'device'
链接到内存控制器设备
sdram 内存scrubbing率:
'sdram_scrub_rate'
这是个可读写的属性文件,用于控制内存scrubbing。scrubbing率通过向该属性文件
写一个最小的带宽(以字节/秒为单位)来设置。这个速率将会在转化成内部参数来控制
最低scrubbing率。
读该文件将可以得到实际的scrubbing率
如果配置失败,或者还没有实现内存scrubbing,这个属性文件的值将设置成-1
============================================================================
'csrowX' DIRECTORIES
In the 'csrowX' directories are EDAC control and attribute files for
this 'X" instance of csrow:
Total Uncorrectable Errors count attribute file:
'ue_count'
This attribute file displays the total count of uncorrectable
errors that have occurred on this csrow. If panic_on_ue is set
this counter will not have a chance to increment, since EDAC
will panic the system.
Total Correctable Errors count attribute file:
'ce_count'
This attribute file displays the total count of correctable
errors that have occurred on this csrow. This
count is very important to examine. CEs provide early
indications that a DIMM is beginning to fail. This count
field should be monitored for non-zero values and report
such information to the system administrator.
Total memory managed by this csrow attribute file:
'size_mb'
This attribute file displays, in count of megabytes, of memory
that this csrow contains.
Memory Type attribute file:
'mem_type'
This attribute file will display what type of memory is currently
on this csrow. Normally, either buffered or unbuffered memory.
Examples:
Registered-DDR
Unbuffered-DDR
EDAC Mode of operation attribute file:
'edac_mode'
This attribute file will display what type of Error detection
and correction is being utilized.
Device type attribute file:
'dev_type'
This attribute file will display what type of DRAM device is
being utilized on this DIMM.
Examples:
x1
x2
x4
x8
Channel 0 CE Count attribute file:
'ch0_ce_count'
This attribute file will display the count of CEs on this
DIMM located in channel 0.
Channel 0 UE Count attribute file:
'ch0_ue_count'
This attribute file will display the count of UEs on this
DIMM located in channel 0.
Channel 0 DIMM Label control file:
'ch0_dimm_label'
This control file allows this DIMM to have a label assigned
to it. With this label in the module, when errors occur
the output can provide the DIMM label in the system log.
This becomes vital for panic events to isolate the
cause of the UE event.
DIMM Labels must be assigned after booting, with information
that correctly identifies the physical slot with its
silk screen label. This information is currently very
motherboard specific and determination of this information
must occur in userland at this time.
Channel 1 CE Count attribute file:
'ch1_ce_count'
This attribute file will display the count of CEs on this
DIMM located in channel 1.
Channel 1 UE Count attribute file:
'ch1_ue_count'
This attribute file will display the count of UEs on this
DIMM located in channel 0.
Channel 1 DIMM Label control file:
'ch1_dimm_label'
This control file allows this DIMM to have a label assigned
to it. With this label in the module, when errors occur
the output can provide the DIMM label in the system log.
This becomes vital for panic events to isolate the
cause of the UE event.
DIMM Labels must be assigned after booting, with information
that correctly identifies the physical slot with its
silk screen label. This information is currently very
motherboard specific and determination of this information
must occur in userland at this time.
'csrowX' 目录
在'csrowX'目录下,是针对当前第'X'个csrow实例的EDAC控制和属性文件:
属性文件 - 不可纠正错误总数:
'ue_count'
这一属性文件显示了发生在当前csrow上的不可纠正错误总数。如果panic_on_ue
参数被置位,则EDAC会报系统panic,这种情况下ue_count将不会增长。
属性文件 - 可纠正错误总数:
'ce_count'
这个属性文件显示了发生在当前csrow上的可纠正错误总数。检查这个计数器
十分重要。CE错误提供了在DIMM开始损坏的早期的预警。这个计数器应该被
监视,如果有非0显示,则将这一信息报告给系统管理员。
属性文件 - 该csrow管理的内存大小:
'size_mb'
这个属性文件显示了了这个csrow实例所管理的内存的大小,以兆为单位
属性文件 - 内存类型:
'mem_type'
这个属性文件显示了当前csrow上的内存类型,可以使buffered或者unbuffered
例如:
Registered-DDR
Unbuffered-DDR
属性文件 - EDAC操作模型:
'edac_mode'
这个属性文件将显示用以检测错误和纠错的类型。
属性文件 - 设备类型:
'dev_type'
这个属性文件将显示这个DIMM上DRAM设备的类型
例如:
x1
x2
x4
x8
属性文件 - 通道0上的CE计数:
'ch0_ce_count'
这个属性文件将显示这个DIMM上channel0上的CE计数
属性文件 - 通道0上的UE计数:
'ch0_ue_count'
这个属性文件将显示这个DIMM上channel0上的UE计数
控制文件 - 通道0的标签:
'ch0_dimm_label'
这个控制文件允许给这个DIMM分配一个标签。通过这个标签,当错误发生时
输出可以在系统日志中提供DIMM标签。这个可以用于在panic时区分是造成UE
事件的原因。
通过交织的标签信息,可以分辨物理插槽。并且DIMM标签必须在启动后指定。
这个信息现在与主板标准非常相关,目前必须在用户态指定。
属性文件 - 通道1上的CE计数:
'ch1_ce_count'
这个属性文件将显示这个DIMM上channel1上的CE计数。
属性文件 - 通道1上的UE计数:
'ch1_ue_count'
这个属性文件将显示这个DIMM上channel1上的UE计数。
控制文件 - 通道1的标签:
'ch1_dimm_label'
这个控制文件允许给这个DIMM分配一个标签。通过这个标签,当错误发生时
输出可以在系统日志中提供DIMM标签。这个可以用于在panic时区分是造成UE
事件的原因。
通过交织的标签信息,可以分辨物理插槽。并且DIMM标签必须在启动后指定。
这个信息现在与主板标准非常相关,目前必须在用户态指定。
============================================================================
SYSTEM LOGGING
If logging for UEs and CEs are enabled then system logs will have
error notices indicating errors that have been detected:
EDAC MC0: CE page 0x283, offset 0xce0, grain 8, syndrome 0x6ec3, row 0,
channel 1 "DIMM_B1": amd76x_edac
EDAC MC0: CE page 0x1e5, offset 0xfb0, grain 8, syndrome 0xb741, row 0,
channel 1 "DIMM_B1": amd76x_edac
The structure of the message is:
the memory controller (MC0)
Error type (CE)
memory page (0x283)
offset in the page (0xce0)
the byte granularity (grain 8)
or resolution of the error
the error syndrome (0xb741)
memory row (row 0)
memory channel (channel 1)
DIMM label, if set prior (DIMM B1
and then an optional, driver-specific message that may
have additional information.
Both UEs and CEs with no info will lack all but memory controller,
error type, a notice of "no info" and then an optional,
driver-specific error message.
系统日志
如果对UE和CE的日志被启用,系统日志将会提示被检测出来的错误:
EDAC MC0: CE page 0x283, offset 0xce0, grain 8, syndrome 0x6ec3, row 0,
channel 1 "DIMM_B1": amd76x_edac
EDAC MC0: CE page 0x1e5, offset 0xfb0, grain 8, syndrome 0xb741, row 0,
channel 1 "DIMM_B1": amd76x_edac
信息的结构为:
内存控制器 (MC0)
错误类型 (CE)
内存页面 (0x283)
页内偏移量 (0xce0)
字节粒度或错误分辨率 (grain8)
错误诊断 (0xb741)
内存row (row 0)
内存通道 (channel 1)
DIMM标签 (DIMM B1)
(如果之前设置了,则可能会有驱动相关的附加消息)
对于无法得到错误信息的UE和CE将会缺少除了内存控制器外的其它错误信息,错误类型
显示"no info",并且可能会有驱动相关的错误消息
============================================================================
PCI Bus Parity Detection
On Header Type 00 devices the primary status is looked at
for any parity error regardless of whether Parity is enabled on the
device. (The spec indicates parity is generated in some cases).
On Header Type 01 bridges, the secondary status register is also
looked at to see if parity occurred on the bus on the other side of
the bridge.
SYSFS CONFIGURATION
Under /sys/devices/system/edac/pci are control and attribute files as follows:
Enable/Disable PCI Parity checking control file:
'check_pci_parity'
This control file enables or disables the PCI Bus Parity scanning
operation. Writing a 1 to this file enables the scanning. Writing
a 0 to this file disables the scanning.
Enable:
echo "1" >/sys/devices/system/edac/pci/check_pci_parity
Disable:
echo "0" >/sys/devices/system/edac/pci/check_pci_parity
Parity Count:
'pci_parity_count'
This attribute file will display the number of parity errors that
have been detected.
PCI总线奇偶校验检测
对header类型00的设备,会检查主要的状态下是否有奇偶校验错,而不管奇偶校验在设备
上是否被开启(规范指出奇偶校验错会在某些情况下产生)。在header类型01的桥上,次级
状态寄存器也会被检查是否有奇偶校验错在总线桥的另一端发生。
sysfs 配置
在/sys/devices/system/edac/pci下存放了如下控制和属性文件:
控制文件 - 开启/关闭PCI奇偶校验检查:
'check_pci_parity'
这个控制文件开启或关闭PCI总线奇偶校验扫描操作。向整个文件写1是开启扫描,
写0是关闭扫描。
开启:
echo "1" >/sys/devices/system/edac/pci/check_pci_parity
关闭:
echo "0" >/sys/devices/system/edac/pci/check_pci_parity
============================================================================
MODULE PARAMETERS
Panic on UE control file:
'edac_mc_panic_on_ue'
An uncorrectable error will cause a machine panic. This is usually
desirable. It is a bad idea to continue when an uncorrectable error
occurs - it is indeterminate what was uncorrected and the operating
system context might be so mangled that continuing will lead to further
corruption. If the kernel has MCE configured, then EDAC will never
notice the UE.
LOAD TIME: module/kernel parameter: edac_mc_panic_on_ue=[0|1]
RUN TIME: echo "1" > /sys/module/edac_core/parameters/edac_mc_panic_on_ue
Log UE control file:
'edac_mc_log_ue'
Generate kernel messages describing uncorrectable errors. These errors
are reported through the system message log system. UE statistics
will be accumulated even when UE logging is disabled.
LOAD TIME: module/kernel parameter: edac_mc_log_ue=[0|1]
RUN TIME: echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ue
Log CE control file:
'edac_mc_log_ce'
Generate kernel messages describing correctable errors. These
errors are reported through the system message log system.
CE statistics will be accumulated even when CE logging is disabled.
LOAD TIME: module/kernel parameter: edac_mc_log_ce=[0|1]
RUN TIME: echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ce
Polling period control file:
'edac_mc_poll_msec'
The time period, in milliseconds, for polling for error information.
Too small a value wastes resources. Too large a value might delay
necessary handling of errors and might loose valuable information for
locating the error. 1000 milliseconds (once each second) is the current
default. Systems which require all the bandwidth they can get, may
increase this.
LOAD TIME: module/kernel parameter: edac_mc_poll_msec=[0|1]
RUN TIME: echo "1000" > /sys/module/edac_core/parameters/edac_mc_poll_msec
Panic on PCI PARITY Error:
'panic_on_pci_parity'
This control files enables or disables panicking when a parity
error has been detected.
module/kernel parameter: edac_panic_on_pci_pe=[0|1]
Enable:
echo "1" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe
Disable:
echo "0" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe
模块参数
控制文件 - 在发生UE时panic:
'edac_mc_panic_on_ue'
一个不可纠正错误会产生机器的panic。因此这个选项常常是我们希望的。在
不可纠正错误发生时继续运行通常是个坏主意-这是因为不可纠正错误对操作系统
执行状态来讲是无法预期的,会造成未来更大的崩溃。如果内核配置了MCE,则
EDAC将不会检测到UE。
加载时: module/kernel 参数: edac_mc_panic_on_ue=[0|1]
运行时: echo "1" > /sys/module/edac_core/parameters/edac_mc_panic_on_ue
控制文件 - 记录UE日志:
'edac_mc_log_ue'
通常,内核消息会描述不可纠正错误。这些错误通过系统消息日志来报告。
即使UE日志功能被关掉,UE错误还是会被统计下来。
加载时: module/kernel 参数: edac_mc_log_ue=[0|1]
运行时: echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ue
控制文件 - 记录CE日志:
'edac_mc_log_ce'
通常,内核消息会描述可纠正错误。这些错误通过系统消息日志来报告。
即使CE日志功能被关掉,CE错误还是会被统计下来。
加载时: module/kernel 参数: edac_mc_log_ce=[0|1]
运行时: echo "1" > /sys/module/edac_core/parameters/edac_mc_log_ce
控制文件 - 轮询时间:
'edac_mc_poll_msec'
这个时间控制轮询的周期,以毫秒为单位。当这个值过小时会浪费系统资源,过大时
会对处理错误造成延时,从而失去对定位错误有用的信息。当前默认值是1000毫秒
(也就是每秒一次)。可以通过增加这个值,来减少EDAC的运行代价。
加载时: module/kernel 参数: edac_mc_poll_msec=[0|1]
运行时: echo "1000" > /sys/module/edac_core/parameters/edac_mc_poll_msec
在PCI奇偶校验错时panic:
'panic_on_pci_parity'
这个控制文件将开启或关闭在发现奇偶校验错时的panic操作
module/kernel 参数: edac_panic_on_pci_pe=[0|1]
开启:
echo "1" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe
关闭:
echo "0" > /sys/module/edac_core/parameters/edac_panic_on_pci_pe
=======================================================================
EDAC_DEVICE type of device
In the header file, edac_core.h, there is a series of edac_device structures
and APIs for the EDAC_DEVICE.
User space access to an edac_device is through the sysfs interface.
At the location /sys/devices/system/edac (sysfs) new edac_device devices will
appear.
There is a three level tree beneath the above 'edac' directory. For example,
the 'test_device_edac' device (found at the bluesmoke.sourceforget.net website)
installs itself as:
/sys/devices/systm/edac/test-instance
in this directory are various controls, a symlink and one or more 'instance'
directorys.
The standard default controls are:
log_ce boolean to log CE events
log_ue boolean to log UE events
panic_on_ue boolean to 'panic' the system if an UE is encountered
(default off, can be set true via startup script)
poll_msec time period between POLL cycles for events
The test_device_edac device adds at least one of its own custom control:
test_bits which in the current test driver does nothing but
show how it is installed. A ported driver can
add one or more such controls and/or attributes
for specific uses.
One out-of-tree driver uses controls here to allow
for ERROR INJECTION operations to hardware
injection registers
The symlink points to the 'struct dev' that is registered for this edac_device.
INSTANCES
One or more instance directories are present. For the 'test_device_edac' case:
test-instance0
In this directory there are two default counter attributes, which are totals of
counter in deeper subdirectories.
ce_count total of CE events of subdirectories
ue_count total of UE events of subdirectories
BLOCKS
At the lowest directory level is the 'block' directory. There can be 0, 1
or more blocks specified in each instance.
test-block0
In this directory the default attributes are:
ce_count which is counter of CE events for this 'block'
of hardware being monitored
ue_count which is counter of UE events for this 'block'
of hardware being monitored
The 'test_device_edac' device adds 4 attributes and 1 control:
test-block-bits-0 for every POLL cycle this counter
is incremented
test-block-bits-1 every 10 cycles, this counter is bumped once,
and test-block-bits-0 is set to 0
test-block-bits-2 every 100 cycles, this counter is bumped once,
and test-block-bits-1 is set to 0
test-block-bits-3 every 1000 cycles, this counter is bumped once,
and test-block-bits-2 is set to 0
reset-counters writing ANY thing to this control will
reset all the above counters.
Use of the 'test_device_edac' driver should any others to create their own
unique drivers for their hardware systems.
The 'test_device_edac' sample driver is located at the
bluesmoke.sourceforge.net project site for EDAC.
设备的EDAC_DEVICE类型
在头文件edac_core.h中,有一系列针对EDAC_DEVICE的edac_device结构和API。
用户空间可以通过sysfs接口来访问edac_device。
在sysfs中 /sys/devices/system/edac位置,将会出现edac_device设备
在最开始的edac目录下,有一个三层的目录树。比如'test_device_edac'设备(可以在
bluesmoke.sourceforget.net找到),装载以后显示如下:
/sys/devices/systm/edac/test-instance
在这个目录下有多个控制,系统链接,或者一个或更多'实例'目录。
标准的控制文件包括:
log_ce 对CE做日志的开关
log_ue 对UE做日志的开关
panic_on_ue 当发生UE时进行panic
poll_msec 对事件的轮询周期
test_device_edac设备添加至少一个自身的控制:
test_bits 在当前test driver中没有任何作用,只是为了显示驱动是
如何加载的。一个移植过来的驱动可以添加一个或多个控制
或属性。
一个out-of-tree驱动允许对硬件的注入寄存器进行错误
注入操作。
symlink指向这个edac_device注册的设备
实例
存在一个或多个实例目录,对'test_device_edac':
test-instance0
在这个目录有两个默认的计数属性,是所有更深子目录的相应计数的总和。
ce_count 所有子目录CE事件的总和
ue_count 所有子目录UE事件的总和
块
在目录的最底层是'block'目录,对每个实例来说,可以有0,1或多个块
test-block0
在这个路径下的默认属性是:
ce_count 硬件设备的这个'block'的CE事件计数
ue_count 硬件设备的这个'block'的UE事件计数
'test_device_edac'设备添加了4个属性文件和一个控制文件:
test-block-bits-0 对每个轮询周期这个计数器加1
test-block-bits-1 对每10个轮询周期这个计数器bump一次,
并将test-block-bits-0置0
test-block-bits-2 对每100个周期,这个计数器bump一次,
并将test-block-bits-1置0
test-block-bits-3 对每100个周期,这个计数器bump一次,
并将test-block-bits-2置0
rest-counters 对这个控制文件写任何东西都会重置
以上所有计数器
其它硬件设备系统建立的驱动在使用上与'test_device_edac'驱动类似。
'test_device_edac'例子驱动放在EDAC的bluesmoke.sourceforge.net项目站点
_______________________________________________
Linux 内核开发中文邮件列表
Linux-...@zh-kernel.org
http://zh-kernel.org/mailman/listinfo/linux-kernel
Linux 内核开发中文社区: http://zh-kernel.org