xref: /linux/Documentation/translations/zh_CN/mm/hwpoison.rst (revision ee65728e103bb7dd99d8604bf6c7aa89c7d7e446)
119a05e35SYanteng Si
2*ee65728eSMike Rapoport:Original: Documentation/mm/hwpoison.rst
319a05e35SYanteng Si
419a05e35SYanteng Si:翻译:
519a05e35SYanteng Si
619a05e35SYanteng Si 司延腾 Yanteng Si <siyanteng@loongson.cn>
719a05e35SYanteng Si
819a05e35SYanteng Si:校译:
919a05e35SYanteng Si
1019a05e35SYanteng Si
1119a05e35SYanteng Si========
1219a05e35SYanteng Sihwpoison
1319a05e35SYanteng Si========
1419a05e35SYanteng Si
1519a05e35SYanteng Si什么是hwpoison?
1619a05e35SYanteng Si===============
1719a05e35SYanteng Si
1819a05e35SYanteng Si
1919a05e35SYanteng Si即将推出的英特尔CPU支持从一些内存错误中恢复( ``MCA恢复`` )。这需要操作系统宣布
2019a05e35SYanteng Si一个页面"poisoned",杀死与之相关的进程,并避免在未来使用它。
2119a05e35SYanteng Si
2219a05e35SYanteng Si这个补丁包在虚拟机中实现了必要的(编程)框架。
2319a05e35SYanteng Si
2419a05e35SYanteng Si引用概述中的评论::
2519a05e35SYanteng Si
2619a05e35SYanteng Si	高级机器的检查与处理。处理方法是损坏的页面被硬件报告,通常是由于2位ECC内
2719a05e35SYanteng Si	存或高速缓存故障。
2819a05e35SYanteng Si
2919a05e35SYanteng Si	这主要是针对在后台检测到的损坏的页面。当当前的CPU试图访问它时,当前运行的进程
3019a05e35SYanteng Si	可以直接被杀死。因为还没有访问损坏的页面, 如果错误由于某种原因不能被处理,就可
3119a05e35SYanteng Si	以安全地忽略它. 而不是用另外一个机器检查去处理它。
3219a05e35SYanteng Si
3319a05e35SYanteng Si	处理不同状态的页面缓存页。这里棘手的部分是,相对于其他虚拟内存用户, 我们可以异
3419a05e35SYanteng Si	步访问任何页面。因为内存故障可能随时随地发生,可能违反了他们的一些假设。这就是
3519a05e35SYanteng Si	为什么这段代码必须非常小心。一般来说,它试图使用正常的锁规则,如获得标准锁,即使
3619a05e35SYanteng Si	这意味着错误处理可能需要很长的时间。
3719a05e35SYanteng Si
3819a05e35SYanteng Si	这里的一些操作有点低效,并且具有非线性的算法复杂性,因为数据结构没有针对这种情
3919a05e35SYanteng Si	况进行优化。特别是从vma到进程的映射就是这种情况。由于这种情况大概率是罕见的,所
4019a05e35SYanteng Si	以我们希望我们可以摆脱这种情况。
4119a05e35SYanteng Si
4219a05e35SYanteng Si该代码由mm/memory-failure.c中的高级处理程序、一个新的页面poison位和虚拟机中的
4319a05e35SYanteng Si各种检查组成,用来处理poison的页面。
4419a05e35SYanteng Si
4519a05e35SYanteng Si现在主要目标是KVM客户机,但它适用于所有类型的应用程序。支持KVM需要最近的qemu-kvm
4619a05e35SYanteng Si版本。
4719a05e35SYanteng Si
4819a05e35SYanteng Si对于KVM的使用,需要一个新的信号类型,这样KVM就可以用适当的地址将机器检查注入到客户
4919a05e35SYanteng Si机中。这在理论上也允许其他应用程序处理内存故障。我们的期望是,所有的应用程序都不要这
5019a05e35SYanteng Si样做,但一些非常专业的应用程序可能会这样做。
5119a05e35SYanteng Si
5219a05e35SYanteng Si故障恢复模式
5319a05e35SYanteng Si============
5419a05e35SYanteng Si
5519a05e35SYanteng Si有两种(实际上是三种)模式的内存故障恢复可以在。
5619a05e35SYanteng Si
5719a05e35SYanteng Sivm.memory_failure_recovery sysctl 置零:
5819a05e35SYanteng Si	所有的内存故障都会导致panic。请不要尝试恢复。
5919a05e35SYanteng Si
6019a05e35SYanteng Si早期处理
6119a05e35SYanteng Si	(可以在全局和每个进程中控制) 一旦检测到错误,立即向应用程序发送SIGBUS这允许
6219a05e35SYanteng Si	应用程序以温和的方式处理内存错误(例如,放弃受影响的对象) 这是KVM qemu使用的
6319a05e35SYanteng Si	模式。
6419a05e35SYanteng Si
6519a05e35SYanteng Si推迟处理
6619a05e35SYanteng Si	当应用程序运行到损坏的页面时,发送SIGBUS。这对不知道内存错误的应用程序来说是
6719a05e35SYanteng Si	最好的,默认情况下注意一些页面总是被当作late kill处理。
6819a05e35SYanteng Si
6919a05e35SYanteng Si用户控制
7019a05e35SYanteng Si========
7119a05e35SYanteng Si
7219a05e35SYanteng Sivm.memory_failure_recovery
7319a05e35SYanteng Si	参阅 sysctl.txt
7419a05e35SYanteng Si
7519a05e35SYanteng Sivm.memory_failure_early_kill
7619a05e35SYanteng Si	全局启用early kill
7719a05e35SYanteng Si
7819a05e35SYanteng SiPR_MCE_KILL
7919a05e35SYanteng Si	设置early/late kill mode/revert 到系统默认值。
8019a05e35SYanteng Si
8119a05e35SYanteng Si	arg1: PR_MCE_KILL_CLEAR:
8219a05e35SYanteng Si		恢复到系统默认值
8319a05e35SYanteng Si	arg1: PR_MCE_KILL_SET:
8419a05e35SYanteng Si		arg2定义了线程特定模式
8519a05e35SYanteng Si
8619a05e35SYanteng Si		PR_MCE_KILL_EARLY:
8719a05e35SYanteng Si			Early kill
8819a05e35SYanteng Si		PR_MCE_KILL_LATE:
8919a05e35SYanteng Si			Late kill
9019a05e35SYanteng Si		PR_MCE_KILL_DEFAULT
9119a05e35SYanteng Si			使用系统全局默认值
9219a05e35SYanteng Si
9319a05e35SYanteng Si	注意,如果你想有一个专门的线程代表进程处理SIGBUS(BUS_MCEERR_AO),你应该在
9419a05e35SYanteng Si	指定线程上调用prctl(PR_MCE_KILL_EARLY)。否则,SIGBUS将被发送到主线程。
9519a05e35SYanteng Si
9619a05e35SYanteng SiPR_MCE_KILL_GET
9719a05e35SYanteng Si	返回当前模式
9819a05e35SYanteng Si
9919a05e35SYanteng Si测试
10019a05e35SYanteng Si====
10119a05e35SYanteng Si
10219a05e35SYanteng Si* madvise(MADV_HWPOISON, ....) (as root) - 在测试过程中Poison一个页面
10319a05e35SYanteng Si
10419a05e35SYanteng Si* 通过debugfs ``/sys/kernel/debug/hwpoison/`` hwpoison-inject模块
10519a05e35SYanteng Si
10619a05e35SYanteng Si  corrupt-pfn
10719a05e35SYanteng Si	在PFN处注入hwpoison故障,并echoed到这个文件。这做了一些早期过滤,以避
10819a05e35SYanteng Si	免在测试套件中损坏非预期页面。
10919a05e35SYanteng Si  unpoison-pfn
11019a05e35SYanteng Si	在PFN的Software-unpoison页面对应到这个文件。这样,一个页面可以再次被
11119a05e35SYanteng Si	复用。这只对Linux注入的故障起作用,对真正的内存故障不起作用。
11219a05e35SYanteng Si
11319a05e35SYanteng Si  注意这些注入接口并不稳定,可能会在不同的内核版本中发生变化
11419a05e35SYanteng Si
11519a05e35SYanteng Si  corrupt-filter-dev-major, corrupt-filter-dev-minor
11619a05e35SYanteng Si	只处理与块设备major/minor定义的文件系统相关的页面的内存故障。-1U是通
11719a05e35SYanteng Si	配符值。这应该只用于人工注入的测试。
11819a05e35SYanteng Si
11919a05e35SYanteng Si  corrupt-filter-memcg
12019a05e35SYanteng Si	限制注入到memgroup拥有的页面。由memcg的inode号指定。
12119a05e35SYanteng Si
12219a05e35SYanteng Si	Example::
12319a05e35SYanteng Si
12419a05e35SYanteng Si		mkdir /sys/fs/cgroup/mem/hwpoison
12519a05e35SYanteng Si
12619a05e35SYanteng Si	        usemem -m 100 -s 1000 &
12719a05e35SYanteng Si		echo `jobs -p` > /sys/fs/cgroup/mem/hwpoison/tasks
12819a05e35SYanteng Si
12919a05e35SYanteng Si		memcg_ino=$(ls -id /sys/fs/cgroup/mem/hwpoison | cut -f1 -d' ')
13019a05e35SYanteng Si		echo $memcg_ino > /debug/hwpoison/corrupt-filter-memcg
13119a05e35SYanteng Si
13219a05e35SYanteng Si		page-types -p `pidof init`   --hwpoison  # shall do nothing
13319a05e35SYanteng Si		page-types -p `pidof usemem` --hwpoison  # poison its pages
13419a05e35SYanteng Si
13519a05e35SYanteng Si  corrupt-filter-flags-mask, corrupt-filter-flags-value
13619a05e35SYanteng Si	当指定时,只有在((page_flags & mask) == value)的情况下才会poison页面。
13719a05e35SYanteng Si	这允许对许多种类的页面进行压力测试。page_flags与/proc/kpageflags中的相
13819a05e35SYanteng Si	同。这些标志位在include/linux/kernel-page-flags.h中定义,并在
13919a05e35SYanteng Si	Documentation/admin-guide/mm/pagemap.rst中记录。
14019a05e35SYanteng Si
14119a05e35SYanteng Si* 架构特定的MCE注入器
14219a05e35SYanteng Si
14319a05e35SYanteng Si  x86 有 mce-inject, mce-test
14419a05e35SYanteng Si
14519a05e35SYanteng Si  在mce-test中的一些便携式hwpoison测试程序,见下文。
14619a05e35SYanteng Si
14719a05e35SYanteng Si引用
14819a05e35SYanteng Si====
14919a05e35SYanteng Si
15019a05e35SYanteng Sihttp://halobates.de/mce-lc09-2.pdf
15119a05e35SYanteng Si	09年LinuxCon的概述演讲
15219a05e35SYanteng Si
15319a05e35SYanteng Sigit://git.kernel.org/pub/scm/utils/cpu/mce/mce-test.git
15419a05e35SYanteng Si	测试套件(在tsrc中的hwpoison特定可移植测试)。
15519a05e35SYanteng Si
15619a05e35SYanteng Sigit://git.kernel.org/pub/scm/utils/cpu/mce/mce-inject.git
15719a05e35SYanteng Si	x86特定的注入器
15819a05e35SYanteng Si
15919a05e35SYanteng Si
16019a05e35SYanteng Si限制
16119a05e35SYanteng Si====
16219a05e35SYanteng Si- 不是所有的页面类型都被支持,而且永远不会。大多数内核内部对象不能被恢
16319a05e35SYanteng Si  复,目前只有LRU页。
16419a05e35SYanteng Si
16519a05e35SYanteng Si---
16619a05e35SYanteng SiAndi Kleen, 2009年10月
167