|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 00/19] MCE code cleanup and add LMCE support
This patch series adds LMCE support to Xen, although more than half
patches are for code cleanup and bug fix.
LMCE
--------------
Intel Local MCE (LMCE) is a feature on Intel Skylake Server CPU that
can deliver MCE to a single processor thread instead of broadcasting
to all threads, which can reduce software's load when processing MCE
on machines with a large number of processor threads.
The technical details of LMCE can be found in Intel SDM Vol 3, Chapter
"Machine-Check Architecture" (search for 'LMCE'). Basically,
* The capability of LMCE is indicated by bit 27 (MCG_LMCE_P) of
MSR_IA32_MCG_CAP.
* LMCE is enabled by setting bit 20 (MSR_IA32_FEATURE_CONTROL_LMCE)
of MSR_IA32_FEATURE_CONTROL and bit 0 (MCG_EXT_CTL_LMCE_EN) of
MSR_IA32_MCG_EXT_CTL.
* Software can determine if a MCE is local to the current processor
thread by checking bit 2 (MCG_STATUS_LMCE) of MSR_IA32_MCG_STATUS.
Patch Overview
--------------
In this patch series,
* Xen enables LMCE by default if it's supported by host CPU unless Xen
boot parameter "mce_fb=1" is present.
* Xen handles LMCE only on the affected CPU and does not need all CPUs
to enter MCE handler.
* A new xl config "lmce=BOOLEAN" is added to control whether LMCE is
supported for the HVM domain. It's disabled by default. If the host
CPU does not support LMCE, this config will be ignored.
* For HVM domain with LMCE support, if the vcpu affected by a host
LMCE is known, Xen will inject a vLMCE to that vcpu. If the affected
vcpu is unknown or LMCE support is disabled for a HVM domain, a MCE
will be broadcast to all vcpus of that domain as before.
This patch series is organized as below:
* Patch 1 - 8 clean up existing MCE code and make one improvement to
debugging messages. No functional change is introduced.
* Patch 9 - 11 fix two bugs in vMCE injection and MCE handling.
* Patch 12 & 13 add host-side LMCE support, including detecting,
enabling LMCE feature and handling LMCE.
* Patch 14 - 17 add guest-side LMCE support (only HVM domain so far),
including emulating LMCE feature and injecting LMCE to HVM domain.
* Patch 18 & 19 add xen-mceinj support to inject LMCE for test purpose.
How to Test
--------------
0. This patch series can be tested either on Intel CPU w/ LMCE support
(Skylake-EX), or in the nested virtualization environment on
KVM/QEMU (i.e. Xen as L1 hypervisor).
QEMU 2.7.0 and later with KVM in Linux kernel 4.8 and later can
emulate LMCE and do not require the host hardware support LMCE. You
can start a nested virtualization environment with LMCE support by
the following command:
qemu-system-x86_64 -enable-kvm \
-smp 32 -cpu kvm64,lmce=on,+vmx \
-hda PATH-TO-DISK-IMG -m 2048
1. Build, install and boot Xen with this patch series. You can include
"mce_verbosity=verbose" in Xen boot parameters to get more detailed
debugging messages about MCE.
2. At boot time, if the Xen boot parameter 'mce_fb=1' is not
present, Xen hypervisor should be able to detect and enable LMCE,
and print the following message:
(XEN) mce_intel.c:737: MCA Capability: BCAST 1 SER 1 CMCI 1 firstbank 0
extended MCE MSR LMCE 1
If 'mce_fb=1' is specified, the last segment of above message will
be "LMCE 0" which indicates Xen does not enable LMCE support.
3. Start a HVM domain with the attached config file xl.cfg. In the
config,
* "lmce = 1" enables LMCE for the domaim.
* "cpus = [ ... ]" is helpful for the following steps to figure
out which CPU should we inject to, and may be not a necessity.
Run Linux kernel 4.2 or later (which has LMCE support) in the
domain.
Run the latest mcelog (https://www.mcelog.org/) in the domain as
well to log MCEs injected in latter steps. Depending on the guest
Linux distro, the log can be in /var/log/mcelog, syslog or systemd
journal.
Compile and run the attached claim_page.c in the domain. claim_page.c
allocates a page of memory, prints its base (guest) physical address
and enters an infinite loop. For example, it may print a message like
Physical address of mmaped page = 0x36d4d000
4. Use "xl vcpu-list" to figure out the cpu number on which
claim_page on is running. For example, xl vcpu-list may output
Name ID VCPU CPU State Time(s) Affinity (Hard / Soft)
lmce-l2 1 0 4 r-- 546.5 4 / all
lmce-l2 1 1 5 -b- 8.4 5 / all
lmce-l2 1 2 6 -b- 6.4 6 / all
lmce-l2 1 3 7 -b- 6.4 7 / all
As claim_page is the only workload that is actively running in
the domain, CPU 4 (VCPU 0) is very likely the one it's running on.
(You may even want to pin claim_page to a vcpu in guest Linux ... )
5. Use xen-mceinj to inject LMCE:
./xen-mceinj -c 4 -d 1 -p 0x36d4d000 -t 0 -l
^^
inject LMCE
If the injection succeeds, mcelog in the domain should generate the
log like
Hardware event. This is not a software error.
MCE 0
CPU 0 BANK 1 TSC 2218fdf1380
^^^^^
vcpu0 receives MCE
RIP !INEXACT! 10:ffffffff810591e7
MISC 86 ADDR 36d4d000
^^^^^^^^^^^^^
error address
TIME 1487302866 Fri Feb 17 11:41:06 2017
MCG status:RIPV MCIP LMCE
^^^^
LMCE is injected
MCi status:
Uncorrected error
Error enabled
MCi_MISC register valid
MCi_ADDR register valid
SRAO
MCA: Generic CACHE Level-2 Eviction Error
STATUS bd2000000000017a MCGSTATUS d
MCGCAP 9000c02 APICID 1 SOCKETID 0
CPUID Vendor Intel Family 6 Model 79
Haozhong Zhang (19):
01/19 x86/mce: fix indentation style in xen-mca.h and mce.h
02/19 x86/mce: remove declarations of non-existing functions in mce.h
03/19 x86/mce: remove unnecessary braces around intel_get_extended_msrs()
04/19 xen/mce: remove unused x86_mcinfo_add()
05/19 x86/mce: merge loops to get Intel extended MC MSR
06/19 x86/mce: merge intel_default_mce_dhandler/uhandler()
07/19 x86/vmce: include domain/vcpu id in debug messages
08/19 x86/mce: set mcinfo_comm.type and .size in x86_mcinfo_reserve()
09/19 x86/vmce: fill MSR_IA32_MCG_STATUS on all vcpus in broadcast case
10/19 x86/mce: always write 0 to MSR_IA32_MCG_STATUS on Intel CPU
11/19 tools/xen-mceinj: fix the type of cpu number
12/19 x86/mce: handle LMCE locally
13/19 x86/mce_intel: detect and enable LMCE on Intel host
14/19 x86/vmx: expose LMCE feature via guest MSR_IA32_FEATURE_CONTROL
15/19 x86/vmce: emulate MSR_IA32_MCG_EXT_CTL
16/19 x86/vmce: enable injecting LMCE to guest on Intel host
17/19 x86/vmce, tools/libxl: expose LMCE capability in guest MSR_IA32_MCG_CAP
18/19 xen/mce: add support of vLMCE injection to XEN_MC_inject_v2
19/19 tools/xen-mceinj: support injecting LMCE
docs/man/xl.cfg.pod.5.in | 18 ++++
tools/libxc/include/xenctrl.h | 1 +
tools/libxc/xc_misc.c | 25 ++++++
tools/libxl/libxl_create.c | 1 +
tools/libxl/libxl_dom.c | 2 +
tools/libxl/libxl_types.idl | 1 +
tools/libxl/xl_cmdimpl.c | 3 +
tools/tests/mce-test/tools/xen-mceinj.c | 70 +++++++++++++--
xen/arch/x86/cpu/mcheck/barrier.c | 4 +-
xen/arch/x86/cpu/mcheck/mcaction.c | 20 +++--
xen/arch/x86/cpu/mcheck/mce.c | 87 +++++++++++-------
xen/arch/x86/cpu/mcheck/mce.h | 51 ++++++-----
xen/arch/x86/cpu/mcheck/mce_amd.c | 4 +-
xen/arch/x86/cpu/mcheck/mce_intel.c | 86 ++++++++++--------
xen/arch/x86/cpu/mcheck/vmce.c | 153 ++++++++++++++++++++++++--------
xen/arch/x86/cpu/mcheck/vmce.h | 2 +-
xen/arch/x86/cpu/mcheck/x86_mca.h | 9 +-
xen/arch/x86/hvm/hvm.c | 7 ++
xen/arch/x86/hvm/vmx/vmx.c | 10 +++
xen/arch/x86/hvm/vmx/vvmx.c | 4 -
xen/include/asm-x86/mce.h | 3 +
xen/include/asm-x86/msr-index.h | 2 +
xen/include/public/arch-x86/hvm/save.h | 2 +
xen/include/public/arch-x86/xen-mca.h | 25 +++---
xen/include/public/hvm/params.h | 5 +-
25 files changed, 420 insertions(+), 175 deletions(-)
--
2.10.1
Attachment:
claim_page.c Attachment:
xl.cfg _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |