On Thu, 20 Apr 2017 15:40:22 -0600
Jim Fehlig <jfehlig(a)suse.com> wrote:
Wim Ten Have wrote:
> From: Wim ten Have <wim.ten.have(a)oracle.com>
>
> Per xen-xl conversions from and to native under host-passthrough
> mode we take care for Xen (nestedhvm = mode) applied and inherited
> settings generating or processing correct feature policy:
>
> [On Intel (VT-x) architectures]
> <feature policy='disable' name='vmx'/>
>
> or
>
> [On AMD (AMD-V) architectures]
> <feature policy='disable' name='svm'/>
>
> It will then generate (or parse) for nestedhvm=1 in/from xl format.
>
> Signed-off-by: Joao Martins <joao.m.martins(a)oracle.com>
> Signed-off-by: Wim ten Have <wim.ten.have(a)oracle.com>
> ---
> cfg.mk | 2 +-
> src/xenconfig/xen_xl.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 65 insertions(+), 1 deletion(-)
>
> diff --git a/cfg.mk b/cfg.mk
> index 69e3f3a..32c3725 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -777,7 +777,7 @@ sc_prohibit_cross_inclusion:
> locking/) safe="($$dir|util|conf|rpc)";; \
> cpu/| network/| node_device/| rpc/| security/| storage/) \
> safe="($$dir|util|conf|storage)";; \
> - xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen)";; \
> + xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen|cpu)";; \
It would be nice to get another libvirt dev opinion on this change. As I said in
the V2 thread, it seems we could remove xenconfig from this check.
> *) safe="($$dir|$(mid_dirs)|util)";; \
E.g. let it be handled in this case.
In that case we have to add 'xen' to "mid_dirs" above.
--- a/cfg.mk
+++ b/cfg.mk
@@ -768,7 +768,7 @@ sc_prohibit_gettext_markup:
# lower-level code must not include higher-level headers.
cross_dirs=$(patsubst $(srcdir)/src/%.,%,$(wildcard $(srcdir)/src/*/.))
cross_dirs_re=($(subst / ,/|,$(cross_dirs)))
-mid_dirs=access|conf|cpu|locking|logging|network|node_device|rpc|security|storage
+mid_dirs=access|conf|cpu|locking|logging|network|node_device|rpc|security|storage|xen
Otherwise there's various other complains. ... sound like this is a bit
deserted area. My selection to add cpu under xenapi/|xenconfig/) was to
have it at lease minimized to the world of xen arena.
> esac; \
> in_vc_files="^src/$$dir" \
> diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
> index 74f68b3..62af8b8 100644
> --- a/src/xenconfig/xen_xl.c
> +++ b/src/xenconfig/xen_xl.c
> @@ -34,6 +34,7 @@
> #include "virstoragefile.h"
> #include "xen_xl.h"
> #include "libxl_capabilities.h"
> +#include "cpu/cpu.h"
>
> #define VIR_FROM_THIS VIR_FROM_XENXL
>
> @@ -106,6 +107,7 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr
caps)
> if (def->os.type == VIR_DOMAIN_OSTYPE_HVM) {
> const char *bios;
> const char *boot;
> + int val = 0;
>
> if (xenConfigGetString(conf, "bios", &bios, NULL) < 0)
> return -1;
> @@ -164,6 +166,40 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def, virCapsPtr
caps)
> }
> def->os.nBootDevs++;
> }
> +
> + if (xenConfigGetBool(conf, "nestedhvm", &val, -1) < 0)
> + return -1;
> +
> + if (val != -1) {
> + virCPUDefPtr cpu = NULL;
> +
> + if (VIR_ALLOC(cpu) < 0)
> + return -1;
> +
> + if (val == 0) {
> + bool isVTx = true;
> +
> + if (VIR_ALLOC(cpu->features) < 0) {
> + VIR_FREE(cpu);
> + return -1;
> + }
> +
> + if (caps && caps->host.cpu &&
ARCH_IS_X86(def->os.arch))
> + isVTx = virCPUCheckFeature(caps->host.arch,
caps->host.cpu, "vmx");
> +
> + if (VIR_STRDUP(cpu->features->name, isVTx ? "vmx" :
"svm") < 0) {
> + VIR_FREE(cpu->features);
> + VIR_FREE(cpu);
> + return -1;
So if I understand this correctly, the feature would have the name "vmx" if
arch
!= x86. If arch == x86 but feature "vmx" is not found, then the feature name
would be "svm".
IMO, it would be better to ignore <cpu> altogether if we can't find the name
of
the virt technology feature to disable. Without a <cpu> def, you'd get the
libxl
default, which is nestedhvm=disabled (and also the current behavior of
libvirt+libxl). E.g. what do you think of the below diff to your patch?
Appreciate below insight and added change adding fixated cpuDefaultFeatures for
testsutils under xen.
Charm on below is that is saves us from the additional brought allocation under
VIR_STRDUP. Let me bring you PATCH v4 next Monday which also includes the signature
correction as suggested initially.
Regards,
-Wim.
diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
index c536e57a0..4f24d457c 100644
--- a/src/xenconfig/xen_xl.c
+++ b/src/xenconfig/xen_xl.c
@@ -170,36 +170,48 @@ xenParseXLOS(virConfPtr conf, virDomainDefPtr def,
virCapsPtr caps)
if (xenConfigGetBool(conf, "nestedhvm", &val, -1) < 0)
return -1;
- if (val != -1) {
- virCPUDefPtr cpu = NULL;
+ if (val == 1) {
+ virCPUDefPtr cpu;
if (VIR_ALLOC(cpu) < 0)
return -1;
- if (val == 0) {
- bool isVTx = true;
+ cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
+ cpu->type = VIR_CPU_TYPE_GUEST;
+ def->cpu = cpu;
+ } else if (val == 0) {
+ const char *vtfeature = NULL;
+
+ if (caps && caps->host.cpu &&
ARCH_IS_X86(def->os.arch)) {
+ if (virCPUCheckFeature(caps->host.arch, caps->host.cpu,
"vmx"))
+ vtfeature = "vmx";
+ else if (virCPUCheckFeature(caps->host.arch, caps->host.cpu,
"svm"))
+ vtfeature = "svm";
+ }
+
+ if (vtfeature) {
+ virCPUDefPtr cpu;
+
+ if (VIR_ALLOC(cpu) < 0)
+ return -1;
if (VIR_ALLOC(cpu->features) < 0) {
VIR_FREE(cpu);
return -1;
}
- if (caps && caps->host.cpu &&
ARCH_IS_X86(def->os.arch))
- isVTx = virCPUCheckFeature(caps->host.arch, caps->host.cpu,
"vmx");
-
- if (VIR_STRDUP(cpu->features->name, isVTx ? "vmx" :
"svm") < 0) {
+ if (VIR_STRDUP(cpu->features->name, vtfeature) < 0) {
VIR_FREE(cpu->features);
VIR_FREE(cpu);
return -1;
}
cpu->features->policy = VIR_CPU_FEATURE_DISABLE;
cpu->nfeatures = cpu->nfeatures_max = 1;
+ cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
+ cpu->type = VIR_CPU_TYPE_GUEST;
+ def->cpu = cpu;
}
- cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
- cpu->type = VIR_CPU_TYPE_GUEST;
- def->cpu = cpu;
}
-