[libvirt] [PATCH v2 2/3] xenconfig: add conversions for xen-xl

Wim ten Have wim.ten.have at oracle.com
Tue Apr 18 19:15:45 UTC 2017


On Mon, 17 Apr 2017 14:22:20 -0600
Jim Fehlig <jfehlig at suse.com> wrote:

> On 03/24/2017 03:02 PM, Wim Ten Have wrote:
> > From: Wim ten Have <wim.ten.have at 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 at oracle.com>
> > Signed-off-by: Wim ten Have <wim.ten.have at oracle.com>
> > ---
> >  src/xenconfig/xen_xl.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 67 insertions(+)
> >
> > diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c
> > index 74f68b3..d3797b8 100644
> > --- a/src/xenconfig/xen_xl.c
> > +++ b/src/xenconfig/xen_xl.c
> > @@ -106,6 +106,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 +165,47 @@ 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) {
> > +                if (VIR_ALLOC_N(cpu->features, 2) < 0)
> > +                    goto cleanup;
> > +
> > +                /*
> > +                 * Below is pointless in real world but for purpose
> > +                 * of testing let's check features depth holding at
> > +                 * least multiple elements and also check if both
> > +                 * vmx|svm are understood.
> > +                 */
> > +                cpu->features[0].policy = VIR_CPU_FEATURE_DISABLE;
> > +                if (VIR_STRDUP(cpu->features[0].name, "vmx") < 0)
> > +                    goto cleanup;
> > +                cpu->features[1].policy = VIR_CPU_FEATURE_DISABLE;
> > +                if (VIR_STRDUP(cpu->features[1].name, "svm") < 0)
> > +                    goto cleanup;  
> 
> Since caps is passed to this function, can it be used to determine whether to 
> disable vmx or svm?

  Yes :-) ... thanks for enlightening me here as that is actually the correct
  approach if non-test domain (conversion) actions are made under libvirtd.

  There's one minor question here per me.  To process caps for vmx|svm I'll
  bring in virCPUCheckFeature() which at its turn requires me to include "cpu/cpu.h"
  for its prototype.  Unfortunate cfg.mk does not anticipate and raises a
  syntax-check caveat.

	prohibit_cross_inclusion
	src/xenconfig/xen_xl.c:51:#include "cpu/cpu.h"
	maint.mk: unsafe cross-directory include
	cfg.mk:773: recipe for target 'sc_prohibit_cross_inclusion' failed
	make: *** [sc_prohibit_cross_inclusion] Error 1

  That is ... unless I apply below change to cfg.mk.

-           xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen)";;       \
+           xenapi/ | xenconfig/ ) safe="($$dir|util|conf|xen|cpu)";;   \

  Is that lethal to do?  I tried to reason and fail to see why not, ie. i
  am a bit clueless for its specific reason ... but also new to whole arena.

> > +
> > +                cpu->nfeatures = cpu->nfeatures_max = 2;
> > +            }
> > +            cpu->mode = VIR_CPU_MODE_HOST_PASSTHROUGH;
> > +            cpu->type = VIR_CPU_TYPE_GUEST;
> > +            def->cpu = cpu;
> > +            cpu = NULL;
> > + cleanup:
> > +            if (cpu) {
> > +                VIR_FREE(cpu->features);
> > +                VIR_FREE(cpu);
> > +                return -1;
> > +            }  
> 
> I'm not fond of the cleanup label in the middle of this function. If we can 
> disable only one of vmx or svm, then there will be one less strdup and one less 
> cleanup spot. Cleanup can then occur at the point of error.

  Correct and given former change this will now nicely fold down under its
  eventual failing VIR_STRDUP().

> > +        }
> > +
> >      } else {
> >          if (xenConfigCopyStringOpt(conf, "bootloader", &def->os.bootloader) < 0)
> >              return -1;
> > @@ -897,6 +939,31 @@ xenFormatXLOS(virConfPtr conf, virDomainDefPtr def)
> >          if (xenConfigSetString(conf, "boot", boot) < 0)
> >              return -1;
> >
> > +        if (def->cpu &&
> > +            def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH) {
> > +            bool hasHwVirt = true;
> > +
> > +            if (def->cpu->nfeatures) {
> > +                for (i = 0; i < def->cpu->nfeatures; i++) {
> > +
> > +                    switch (def->cpu->features[i].policy) {
> > +                        case VIR_CPU_FEATURE_DISABLE:
> > +                        case VIR_CPU_FEATURE_FORBID:
> > +                            if (STREQ(def->cpu->features[i].name, "vmx") ||
> > +                                STREQ(def->cpu->features[i].name, "svm"))
> > +                                hasHwVirt = false;
> > +                            break;
> > +
> > +                        default:
> > +                            break;  
> 
> Similar to patch 1, replace 'default' with the other enum values.

  Sure!

Regards,
- Wim.
 
> > +                    }
> > +                }
> > +            }
> > +
> > +            if (xenConfigSetInt(conf, "nestedhvm", hasHwVirt) < 0)
> > +                return -1;
> > +        }
> > +
> >          /* XXX floppy disks */
> >      } else {
> >          if (def->os.bootloader &&
> >  
> 




More information about the libvir-list mailing list