Presented here is v1 of my work to improve cpuid levelling for guests. This series is very close to what is now present in XenServer trunk, and testing is going well.
This series is available in git form at: http://xenbits.xen.org/git-http/people/andrewcoop/xen.git levelling-v1 This entire series is RFC because it is based on Xen 4.6 (plus some backports of already-accepted content) rather than staging. I will rebase onto staging for v2. The current cpuid code, both in the hypervisor and toolstack, has grown organically for a very long time, and is flawed in many ways. This series focuses specifically on the fixing the bits pertaining to the visible features, and I will be fixing other areas in future work (e.g. per-core, per-package values, auditing of incoming migration values, etc.) These changes alter the workflow of cpuid handling as follows: Xen boots and evaluates its current capabilities. It uses this information to calculate the maximum featuresets it can provide to guests, and provides this information for toolstack consumption. A toolstack may then calculate a safe set of features (taking into account migratability), and sets a guests cpuid policy. Xen then takes care of context switching the levelling state. In particular, this means that PV guests may have different levels while running on the same host, an option which was not previously generally available. Andrew Cooper (31): xen/public: Export featureset information in the public API tools/libxc: Use public/featureset.h for cpuid policy generation xen/x86: Store antifeatures inverted in a featureset xen/x86: Mask out unknown features from Xen's capabilities xen/x86: Collect more CPUID feature words xen/x86: Infrastructure to calculate guest featuresets xen/x86: Export host featureset via SYSCTL tools/stubs: Expose host featureset to userspace xen/x86: Calculate PV featureset xen/x86: Calculate HVM featureset xen/x86: Calculate Raw featureset tools: Utility for dealing with featuresets tools/libxc: Wire a featureset through to cpuid policy logic tools/libxc: Use featureset rather than guesswork x86: Generate deep dependencies of x86 features x86: Automatically generate known_features xen/x86: Clear dependent features when clearing a cpu cap xen/x86: Improve disabling of features which have dependencies tools/libxc: Sanitise guest featuresets x86: Improvements to in-hypervisor cpuid sanity checks x86/domctl: Break out logic to update domain state from cpuid information x86/cpu: Move set_cpumask() calls into c_early_init() xen/x86: Export cpuid levelling capabilities via SYSCTL tools/stubs: Expose host levelling capabilities to userspace xen/x86: Common infrastructure for levelling context switching xen/x86: Rework AMD masking MSR setup xen/x86: Rework Intel masking/faulting setup xen/x86: Context switch all levelling state in context_switch() x86/pv: Provide custom cpumasks for PV domains x86/domctl: Update PV domain cpumasks when setting cpuid policy tools/libxc: Calculate xstate cpuid leaf from guest information .gitignore | 2 + tools/libxc/Makefile | 6 + tools/libxc/include/xenctrl.h | 8 + tools/libxc/xc_bitops.h | 12 +- tools/libxc/xc_cpufeature.h | 145 ---------- tools/libxc/xc_cpuid_x86.c | 437 +++++++++++++++---------------- tools/libxc/xc_misc.c | 41 +++ tools/misc/Makefile | 6 + tools/misc/xen-cpuid.c | 392 +++++++++++++++++++++++++++ tools/ocaml/libs/xc/xenctrl.ml | 5 + tools/ocaml/libs/xc/xenctrl.mli | 6 + tools/ocaml/libs/xc/xenctrl_stubs.c | 55 ++++ xen/arch/x86/Makefile | 2 + xen/arch/x86/apic.c | 4 +- xen/arch/x86/cpu/amd.c | 263 ++++++++++++------- xen/arch/x86/cpu/common.c | 54 +++- xen/arch/x86/cpu/cpu.h | 2 + xen/arch/x86/cpu/intel.c | 239 ++++++++++------- xen/arch/x86/cpuid.c | 92 +++++++ xen/arch/x86/cpuid/Makefile | 6 + xen/arch/x86/cpuid/cpuid-private.h | 93 +++++++ xen/arch/x86/cpuid/cpuid.c | 223 ++++++++++++++++ xen/arch/x86/cpuid/gen-feature-deps.py | 169 ++++++++++++ xen/arch/x86/domain.c | 15 +- xen/arch/x86/domctl.c | 132 ++++++++-- xen/arch/x86/hvm/hvm.c | 62 +++-- xen/arch/x86/setup.c | 3 + xen/arch/x86/sysctl.c | 69 +++++ xen/arch/x86/traps.c | 106 ++------ xen/arch/x86/xstate.c | 7 +- xen/include/asm-x86/cpufeature.h | 178 ++----------- xen/include/asm-x86/cpuid.h | 25 ++ xen/include/asm-x86/domain.h | 2 + xen/include/asm-x86/processor.h | 30 ++- xen/include/public/arch-x86/featureset.h | 214 +++++++++++++++ xen/include/public/sysctl.h | 53 ++++ 36 files changed, 2287 insertions(+), 871 deletions(-) delete mode 100644 tools/libxc/xc_cpufeature.h create mode 100644 tools/misc/xen-cpuid.c create mode 100644 xen/arch/x86/cpuid.c create mode 100644 xen/arch/x86/cpuid/Makefile create mode 100644 xen/arch/x86/cpuid/cpuid-private.h create mode 100644 xen/arch/x86/cpuid/cpuid.c create mode 100755 xen/arch/x86/cpuid/gen-feature-deps.py create mode 100644 xen/include/asm-x86/cpuid.h create mode 100644 xen/include/public/arch-x86/featureset.h -- 2.1.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel