[libvirt] [PATCH v2 2/4] libxl: add support for CPUID features policy
Jim Fehlig
jfehlig at suse.com
Mon Jul 17 22:18:23 UTC 2017
On 07/17/2017 03:57 PM, Jim Fehlig wrote:
> On 07/03/2017 09:03 PM, Marek Marczykowski-Górecki wrote:
>> Convert CPU features policy into libxl cpuid policy settings. Use new
>> ("libxl") syntax, which allow to enable/disable specific bits, using
>> host CPU as a base. For this reason, accept only "hostf-passthrough"
>> mode.
>> Libxl do not have distinction between "force" and "required" policy
>> (there is only "force") and also between "forbid" and "disable" (there
>> is only "disable"). So, merge them appropriately. If anything, "require"
>> and "forbid" should be enforced outside of specific driver.
>>
>> Signed-off-by: Marek Marczykowski-Górecki <marmarek at invisiblethingslab.com>
>> ---
>> Changes since v1:
>> - use new ("libxl") syntax to set only bits explicitly mentioned in
>> domain XML
>> ---
>> src/libxl/libxl_conf.c | 77 ++++++++++++++++++++++++++++++++++++++++---
>> src/libxl/libxl_conf.h | 1 +-
>> 2 files changed, 74 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
>> index a0a53c2..0cf51a8 100644
>> --- a/src/libxl/libxl_conf.c
>> +++ b/src/libxl/libxl_conf.c
>> @@ -291,6 +291,44 @@ libxlMakeChrdevStr(virDomainChrDefPtr def, char **buf)
>> return 0;
>> }
>> +static const char *libxlTranslateCPUFeature(const char *virCPUFeatureName)
>> +{
>> + /* libxl use different names for some CPUID bits */
>> + if (STREQ(virCPUFeatureName, "cx16"))
>> + return "cmpxchg16";
>> + if (STREQ(virCPUFeatureName, "cid"))
>> + return "cntxid";
>> + if (STREQ(virCPUFeatureName, "ds_cpl"))
>> + return "dscpl";
>> + if (STREQ(virCPUFeatureName, "pclmuldq"))
>> + return "pclmulqdq";
>> + if (STREQ(virCPUFeatureName, "pni"))
>> + return "sse3";
>> + if (STREQ(virCPUFeatureName, "ht"))
>> + return "htt";
>> + if (STREQ(virCPUFeatureName, "pn"))
>> + return "psn";
>> + if (STREQ(virCPUFeatureName, "clflush"))
>> + return "clfsh";
>> + if (STREQ(virCPUFeatureName, "sep"))
>> + return "sysenter";
>> + if (STREQ(virCPUFeatureName, "cx8"))
>> + return "cmpxchg8";
>> + if (STREQ(virCPUFeatureName, "nodeid_msr"))
>> + return "nodeid";
>> + if (STREQ(virCPUFeatureName, "cr8legacy"))
>> + return "altmovcr8";
>> + if (STREQ(virCPUFeatureName, "lahf_lm"))
>> + return "lahfsahf";
>> + if (STREQ(virCPUFeatureName, "cmp_legacy"))
>> + return "cmplegacy";
>> + if (STREQ(virCPUFeatureName, "fxsr_opt"))
>> + return "ffxsr";
>> + if (STREQ(virCPUFeatureName, "pdpe1gb"))
>> + return "page1gb";
>> + return virCPUFeatureName;
>> +}
>> +
>
> I don't have an alternative, but I see a mapping table becoming stale as new CPU
> features are added to libxl.
>
>> static int
>> libxlMakeDomBuildInfo(virDomainDefPtr def,
>> libxl_ctx *ctx,
>> @@ -376,10 +414,18 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
>> def->features[VIR_DOMAIN_FEATURE_ACPI] ==
>> VIR_TRISTATE_SWITCH_ON);
>> - if (caps &&
>> - def->cpu && def->cpu->mode == (VIR_CPU_MODE_HOST_PASSTHROUGH)) {
>> + if (caps && def->cpu) {
>> bool hasHwVirt = false;
>> bool svm = false, vmx = false;
>> + char xlCPU[32];
>> +
>> + if (def->cpu->mode != (VIR_CPU_MODE_HOST_PASSTHROUGH)) {
>> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> + _("unsupported cpu mode '%s'"),
>> + virCPUModeTypeToString(def->cpu->mode));
>> + return -1;
>> + }
>> +
>
> Although trivial, IMO this change should be in a separate patch where it will be
> easy to find.
>
>> if (ARCH_IS_X86(def->os.arch)) {
>> vmx = virCPUCheckFeature(caps->host.arch, caps->host.cpu,
>> "vmx");
>> @@ -394,20 +440,43 @@ libxlMakeDomBuildInfo(virDomainDefPtr def,
>> case VIR_CPU_FEATURE_DISABLE:
>> case VIR_CPU_FEATURE_FORBID:
>> + snprintf(xlCPU,
>> + sizeof(xlCPU),
>> + "%s=0",
>> + libxlTranslateCPUFeature(
>> + def->cpu->features[i].name));
>> + if (libxl_cpuid_parse_config(&b_info->cpuid,
>> xlCPU)) {
>> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> + _("unsupported cpu feature '%s'"),
>> + def->cpu->features[i].name);
>> + return -1;
>> + }
>> if ((vmx && STREQ(def->cpu->features[i].name,
>> "vmx")) ||
>> - (svm && STREQ(def->cpu->features[i].name,
>> "svm")))
>> + (svm && STREQ(def->cpu->features[i].name,
>> "svm")))
>
> Spurious change.
>
>> hasHwVirt = false;
>> break;
>> case VIR_CPU_FEATURE_FORCE:
>> case VIR_CPU_FEATURE_REQUIRE:
>> + snprintf(xlCPU,
>> + sizeof(xlCPU),
>> + "%s=1",
>> + libxlTranslateCPUFeature(
>> + def->cpu->features[i].name));
>> + if (libxl_cpuid_parse_config(&b_info->cpuid,
>> xlCPU)) {
>> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
>> + _("unsupported cpu feature '%s'"),
>> + def->cpu->features[i].name);
>> + return -1;
>> + }
>> + break;
>> case VIR_CPU_FEATURE_OPTIONAL:
>> case VIR_CPU_FEATURE_LAST:
>> break;
>> }
>> }
>> + libxl_defbool_set(&b_info->u.hvm.nested_hvm, hasHwVirt);
>> }
>> - libxl_defbool_set(&b_info->u.hvm.nested_hvm, hasHwVirt);
>
> This change also seems unrelated. Perhaps it can be combined with the change
> forbidding all but host_passthrough CPU model.
>
>> }
>> if (def->nsounds > 0) {
>> diff --git a/src/libxl/libxl_conf.h b/src/libxl/libxl_conf.h
>> index 264df11..8d89ccd 100644
>> --- a/src/libxl/libxl_conf.h
>> +++ b/src/libxl/libxl_conf.h
>> @@ -60,6 +60,7 @@
>> # define LIBXL_DUMP_DIR LIBXL_LIB_DIR "/dump"
>> # define LIBXL_CHANNEL_DIR LIBXL_LIB_DIR "/channel/target"
>> # define LIBXL_BOOTLOADER_PATH "pygrub"
>> +# define LIBXL_DEFAULT_CPUID_REG_CONFIG "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
>
> This doesn't appear to be used anywhere in the patch.
Sorry, I forgot to mention that this series should also include a patch for
domXML <-> xl.cfg conversions, plus a xlconfigtest :-). IMO, the libxl CPUID
format is sufficient for now.
Regards,
Jim
More information about the libvir-list
mailing list